From 1debc30d461e7fbdc879fead4644f1196a6bb2a8 Mon Sep 17 00:00:00 2001 From: Marcel Date: Tue, 30 Mar 2021 19:51:58 +0200 Subject: [PATCH] Add Mario Bros Project Files --- Arcade_MiST/Nintendo Mario Bros/MarioBros.qpf | 30 + Arcade_MiST/Nintendo Mario Bros/MarioBros.qsf | 262 ++++++++ .../Snapshot/MarioBros.rbf | Bin 0 -> 301165 bytes Arcade_MiST/Nintendo Mario Bros/clean.bat | 37 ++ .../Nintendo Mario Bros/rtl/MarioBros_MiST.sv | 259 ++++++++ .../Nintendo Mario Bros/rtl/build_id.tcl | 35 + Arcade_MiST/Nintendo Mario Bros/rtl/dpram.vhd | 75 +++ .../Nintendo Mario Bros/rtl/m58715ip.v | 129 ++++ .../Nintendo Mario Bros/rtl/mario_adec.v | 323 +++++++++ .../Nintendo Mario Bros/rtl/mario_bram.v | 324 +++++++++ .../Nintendo Mario Bros/rtl/mario_col_pal.v | 78 +++ .../Nintendo Mario Bros/rtl/mario_dma.v | 76 +++ .../rtl/mario_hv_generator.v | 111 ++++ .../rtl/mario_iir_filter.v | 171 +++++ .../Nintendo Mario Bros/rtl/mario_input.v | 74 +++ .../Nintendo Mario Bros/rtl/mario_logic.v | 117 ++++ .../Nintendo Mario Bros/rtl/mario_main.v | 272 ++++++++ .../Nintendo Mario Bros/rtl/mario_obj.v | 626 ++++++++++++++++++ .../Nintendo Mario Bros/rtl/mario_sound.v | 84 +++ .../rtl/mario_sound_digital.v | 160 +++++ .../rtl/mario_sound_mixer.v | 38 ++ .../Nintendo Mario Bros/rtl/mario_top.v | 249 +++++++ .../Nintendo Mario Bros/rtl/mario_video.v | 149 +++++ .../Nintendo Mario Bros/rtl/mario_vram.v | 233 +++++++ Arcade_MiST/Nintendo Mario Bros/rtl/pll.qip | 4 + Arcade_MiST/Nintendo Mario Bros/rtl/pll.v | 337 ++++++++++ .../Nintendo Mario Bros/rtl/rom/adec_5p.vhd | 24 + .../Nintendo Mario Bros/rtl/rom/clut_4p.vhd | 54 ++ .../Nintendo Mario Bros/rtl/rom/gfx_3f.vhd | 278 ++++++++ .../Nintendo Mario Bros/rtl/rom/gfx_3j.vhd | 278 ++++++++ .../Nintendo Mario Bros/rtl/rom/obj_7m.vhd | 278 ++++++++ .../Nintendo Mario Bros/rtl/rom/obj_7n.vhd | 278 ++++++++ .../Nintendo Mario Bros/rtl/rom/obj_7p.vhd | 278 ++++++++ .../Nintendo Mario Bros/rtl/rom/obj_7s.vhd | 278 ++++++++ .../Nintendo Mario Bros/rtl/rom/obj_7t.vhd | 278 ++++++++ .../Nintendo Mario Bros/rtl/rom/obj_7u.vhd | 278 ++++++++ .../Nintendo Mario Bros/rtl/rom/snd_rom.vhd | 278 ++++++++ Arcade_MiST/Nintendo Mario Bros/rtl/sdram.sv | 329 +++++++++ 38 files changed, 7162 insertions(+) create mode 100644 Arcade_MiST/Nintendo Mario Bros/MarioBros.qpf create mode 100644 Arcade_MiST/Nintendo Mario Bros/MarioBros.qsf create mode 100644 Arcade_MiST/Nintendo Mario Bros/Snapshot/MarioBros.rbf create mode 100644 Arcade_MiST/Nintendo Mario Bros/clean.bat create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/MarioBros_MiST.sv create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/build_id.tcl create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/dpram.vhd create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/m58715ip.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/mario_adec.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/mario_bram.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/mario_col_pal.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/mario_dma.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/mario_hv_generator.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/mario_iir_filter.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/mario_input.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/mario_logic.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/mario_main.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/mario_obj.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/mario_sound.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/mario_sound_digital.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/mario_sound_mixer.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/mario_top.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/mario_video.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/mario_vram.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/pll.qip create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/pll.v create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/rom/adec_5p.vhd create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/rom/clut_4p.vhd create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/rom/gfx_3f.vhd create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/rom/gfx_3j.vhd create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7m.vhd create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7n.vhd create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7p.vhd create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7s.vhd create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7t.vhd create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7u.vhd create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/rom/snd_rom.vhd create mode 100644 Arcade_MiST/Nintendo Mario Bros/rtl/sdram.sv diff --git a/Arcade_MiST/Nintendo Mario Bros/MarioBros.qpf b/Arcade_MiST/Nintendo Mario Bros/MarioBros.qpf new file mode 100644 index 00000000..56cabc47 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/MarioBros.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 = 16:52:48 September 16, 2019 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "16:52:48 September 16, 2019" + +# Revisions + +PROJECT_REVISION = "MarioBros" diff --git a/Arcade_MiST/Nintendo Mario Bros/MarioBros.qsf b/Arcade_MiST/Nintendo Mario Bros/MarioBros.qsf new file mode 100644 index 00000000..5a15b6be --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/MarioBros.qsf @@ -0,0 +1,262 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 19:25:53 March 30, 2021 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# MarioBros_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 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 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 MarioBros_MiST +set_global_assignment -name DEVICE_FILTER_PACKAGE TQFP + +# 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 + +# SignalTap II Assignments +# ======================== +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE output_files/gberet.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(MarioBros_MiST) + + # Pin & Location Assignments + # ========================== + set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[*] + set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[*] + 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[*] + set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[*] + + # Fitter Assignments + # ================== + set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[*] + set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[*] + set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_BA[*] + set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQML + set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQMH + set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nRAS + set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nCAS + set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nWE + set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nCS + set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_CKE + set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_CLK + set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_R[*] + set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_G[*] + set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_B[*] + set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_HS + set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_VS + 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 + + # 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(MarioBros_MiST) +# -------------------------- +set_global_assignment -name SYSTEMVERILOG_FILE rtl/MarioBros_MiST.sv +set_global_assignment -name VERILOG_FILE rtl/mario_top.v +set_global_assignment -name VERILOG_FILE rtl/mario_main.v +set_global_assignment -name VERILOG_FILE rtl/mario_input.v +set_global_assignment -name VERILOG_FILE rtl/mario_video.v +set_global_assignment -name VERILOG_FILE rtl/mario_hv_generator.v +set_global_assignment -name VERILOG_FILE rtl/mario_adec.v +set_global_assignment -name VERILOG_FILE rtl/mario_dma.v +set_global_assignment -name VERILOG_FILE rtl/mario_obj.v +set_global_assignment -name VERILOG_FILE rtl/mario_col_pal.v +set_global_assignment -name VERILOG_FILE rtl/mario_vram.v +set_global_assignment -name VERILOG_FILE rtl/mario_logic.v +set_global_assignment -name VERILOG_FILE rtl/mario_sound.v +set_global_assignment -name VERILOG_FILE rtl/mario_sound_mixer.v +set_global_assignment -name VERILOG_FILE rtl/mario_sound_digital.v +set_global_assignment -name VHDL_FILE rtl/rom/snd_rom.vhd +set_global_assignment -name VERILOG_FILE rtl/m58715ip.v +set_global_assignment -name VERILOG_FILE rtl/mario_iir_filter.v +set_global_assignment -name VERILOG_FILE rtl/mario_bram.v +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/rom/obj_7u.vhd +set_global_assignment -name VHDL_FILE rtl/rom/obj_7t.vhd +set_global_assignment -name VHDL_FILE rtl/rom/obj_7s.vhd +set_global_assignment -name VHDL_FILE rtl/rom/obj_7p.vhd +set_global_assignment -name VHDL_FILE rtl/rom/obj_7n.vhd +set_global_assignment -name VHDL_FILE rtl/rom/obj_7m.vhd +set_global_assignment -name VHDL_FILE rtl/rom/gfx_3j.vhd +set_global_assignment -name VHDL_FILE rtl/rom/gfx_3f.vhd +set_global_assignment -name VHDL_FILE rtl/rom/clut_4p.vhd +set_global_assignment -name VHDL_FILE rtl/rom/adec_5p.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv +set_global_assignment -name VERILOG_FILE rtl/pll.v +set_global_assignment -name QIP_FILE "D:/GitHub/Mist_FPGA/common/CPU/T80/T80.qip" +set_global_assignment -name QIP_FILE ../../common/CPU/t48/T48.qip +set_global_assignment -name QIP_FILE "D:/GitHub/Mist_FPGA/common/mist/mist.qip" +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Nintendo Mario Bros/Snapshot/MarioBros.rbf b/Arcade_MiST/Nintendo Mario Bros/Snapshot/MarioBros.rbf new file mode 100644 index 0000000000000000000000000000000000000000..18ac933a89fee6ed6ee81986011c90125320de27 GIT binary patch literal 301165 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%0A%;+=K&R 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%0Dhy+oLN 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

8Fd?baDN8lC{sMLcIN8d8 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 +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac #( + .C_bits(16)) +dac( + .clk_i(clk_sys), + .res_n_i(1'b1), + .dac_i({~audio[15],audio[14:0]}), + .dac_o(AUDIO_L) + ); + +wire m_up, m_down, m_left, m_right, m_fireA, m_fireB, m_fireC, m_fireD, m_fireE, m_fireF; +wire m_up2, m_down2, m_left2, m_right2, m_fire2A, m_fire2B, m_fire2C, m_fire2D, m_fire2E, m_fire2F; +wire m_tilt, m_coin1, m_coin2, m_coin3, m_coin4, m_one_player, m_two_players, m_three_players, m_four_players; + +wire [7:0]m_sw1={~status[6],~{m_two_players},~{m_one_player},~m_fireC,1'b1,1'b1,~m_left,~m_right}; +wire [7:0]m_sw2={1'b1,1'b1,~{m_coin1},~m_fire2C,1'b1,1'b1,~m_left2,~m_right2}; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; +arcade_inputs inputs ( + .clk ( clk_sys ), + .key_strobe ( key_strobe ), + .key_pressed ( key_pressed ), + .key_code ( key_code ), + .joystick_0 ( joystick_0 ), + .joystick_1 ( joystick_1 ), + .rotate ( 1'b0 ), + .orientation ( 2'b10 ), + .joyswap ( 1'b0 ), + .oneplayer ( 1'b1 ), + .controls ( {m_tilt, m_coin4, m_coin3, m_coin2, m_coin1, m_four_players, m_three_players, m_two_players, m_one_player} ), + .player1 ( {m_fireF, m_fireE, m_fireD, m_fireC, m_fireB, m_fireA, m_up, m_down, m_left, m_right} ), + .player2 ( {m_fire2F, m_fire2E, m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2} ) +); + + +endmodule diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/build_id.tcl b/Arcade_MiST/Nintendo Mario Bros/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/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_MiST/Nintendo Mario Bros/rtl/dpram.vhd b/Arcade_MiST/Nintendo Mario Bros/rtl/dpram.vhd new file mode 100644 index 00000000..fb0bfc8b --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/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 III", + 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_MiST/Nintendo Mario Bros/rtl/m58715ip.v b/Arcade_MiST/Nintendo Mario Bros/rtl/m58715ip.v new file mode 100644 index 00000000..a1015902 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/m58715ip.v @@ -0,0 +1,129 @@ +//---------------------------------------------------------------------------- +// Mario Bros Arcade +// +// Author: gaz68 (https://github.com/gaz68) June 2020 +// +// M58715 module. +// The M58715 chip produces the digital sounds (music and most +// of the sound effects). It is an 8039 with embedded RAM and ROM. +// The embedded ROM appears to only be used for protection. +// see mario_roms.v for more information. +//---------------------------------------------------------------------------- + +module M58715IP( + input I_CLK, + input I_CLK_EN, + input I_RSTn, + input I_INTn, + input I_EA, + output O_PSENn, + output O_RDn, + output O_WRn, + output O_ALE, + output O_PROGn, + input I_T0, + output O_T0, + input I_T1, + input [7:0] I_DB, + output [7:0] O_DB, + input [7:0] I_P1, + output [7:0] O_P1, + input [7:0] I_P2, + output [7:0] O_P2 +); + + + +wire W_PSENn; +assign O_PSENn = W_PSENn ; + +//---------------------------------- +// M58715 has 128-Byte internal RAM +//---------------------------------- + +wire [7:0]t48_ram_a; +wire t48_ram_we; +wire [7:0]t48_ram_do; +wire [7:0]t48_ram_di; + +ram_128_8 t48_ram +( + .I_CLK(I_CLK), + .I_ADDR(t48_ram_a[6:0]), + .I_D(t48_ram_di), + .I_CE(1'b1), + .I_WE(t48_ram_we), + .O_D(t48_ram_do) +); + +//----------------------------------- +// M58715 has 2KB internal ROM +// +// * Using the 8039 hack to bypass +// the internal ROM until the pmem +// interface can be made to work. +// All ROM accesses are external. +//------------------------------------ + +//wire [10:0]t48_int_rom_a; +//wire [7:0]t48_int_rom_do; +// +//SUB_INT_ROM bootrom +//( +// .CLK(I_CLK), +// .AD(t48_int_rom_a), +// .DO(t48_int_rom_do) +//); + +//---------- +// T48 Core +//---------- + +wire xtal3_s; + +t48_core t48_core +( + .xtal_i(I_CLK), + .xtal_en_i(I_CLK_EN), + .reset_i(I_RSTn), + .t0_i(I_T0), + .t0_o(O_T0), + .t0_dir_o(), + .int_n_i(I_INTn), + //.ea_i(I_EA), + .ea_i(1'b1), // 8039 hack + .rd_n_o(O_RDn), + .psen_n_o(W_PSENn), + .wr_n_o(O_WRn), + .ale_o(O_ALE), + .db_i(I_DB), + .db_o(O_DB), + .db_dir_o(), + .t1_i(I_T1), + .p2_i(I_P2), + .p2_o(O_P2), + .p2_low_imp_o(), + .p1_i(I_P1), + .p1_o(O_P1), + .p1_low_imp_o(), + .prog_n_o(O_PROGn), + .clk_i(I_CLK), + .en_clk_i(xtal3_s), + .xtal3_o(xtal3_s), + .dmem_addr_o(t48_ram_a), + .dmem_we_o(t48_ram_we), + .dmem_data_i(t48_ram_do), + .dmem_data_o(t48_ram_di), + .pmem_addr_o(), + .pmem_data_i(8'h00) +); + +endmodule + + + + + + + + diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/mario_adec.v b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_adec.v new file mode 100644 index 00000000..9ddfe7a5 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_adec.v @@ -0,0 +1,323 @@ +//---------------------------------------------------------------------------- +// Mario Bros Arcade +// +// Author: gaz68 (https://github.com/gaz68) June 2020 +// +// Address decoding. +//---------------------------------------------------------------------------- + +module mario_adec +( + input I_CLK_48M, + input I_CEN_12M, + input I_CEN_4Mp, + input I_CEN_4Mn, + input I_RESET_n, + input [15:0]I_AB, + input [7:0]I_DB, + input I_MREQ_n, + input I_RFSH_n, + input I_RD_n, + input I_WR_n, + input I_VRAMBUSY_n, + input I_VBLK_n, + output O_WAIT_n, + output O_NMI_n, + output [3:0]O_MROM_CSn, + output [1:0]O_MRAM_CSn, + output O_3J_G_n, // To LS245. Not used? + output O_OBJ_RQ_n, // 7000 H - 73FF H + output O_OBJ_RD_n, // 7000 H - 73FF H (R mode) + output O_OBJ_WR_n, // 7000 H - 73FF H (W mode) + output O_VRAM_RD_n, // 7400 H - 77FF H (R mode) + output O_VRAM_WR_n, // 7400 H - 77FF H (W mode) + output O_SW1_OE_n, // 7C00 H (R mode) + output O_SW2_OE_n, // 7C80 H (R mode) + output O_DIPSW_OE_n, // 7F80 H (R mode) + output [7:0]O_4C_Q, // Misc addressing + output [7:0]O_2L_Q, // Misc control signals + output [7:0]O_7M_Q, // Sound control signals + output [7:0]O_7J_Q // Sound data +); + +//---------- +// CPU WAIT +//---------- + +reg W_3D_Q; +reg W_4D1_Qn; +assign O_WAIT_n = W_4D1_Qn; + +always@(posedge I_CLK_48M or negedge I_VBLK_n) +begin + if(I_VBLK_n == 1'b0) + W_4D1_Qn <= 1'b1; + else if (I_CEN_4Mp) + W_4D1_Qn <= I_VRAMBUSY_n | W_4A2_Q[1] | ~I_RFSH_n; +end + +// Enable signal for writing to VRAM and OBJRAM. +always@(posedge I_CLK_48M) +begin + W_3D_Q <= W_4D1_Qn; +end + +//----------------------------------------------- +// CPU NMI +// NMI is activated at the start of each VBLANK. +// CPU can clear the NMI via register @ 2L. +//----------------------------------------------- + +wire W_VBLK = ~I_VBLK_n; +reg W_VBLK_q; +reg W_4D2_Q; + +always@(posedge I_CLK_48M) begin + W_VBLK_q <= W_VBLK; +end +wire W_VBLK_rise = ~W_VBLK_q & W_VBLK; + +always@(posedge I_CLK_48M or negedge W_2L_Q[4]) +begin + if(~W_2L_Q[4]) + W_4D2_Q <= 1'b1; + else if (W_VBLK_rise) + W_4D2_Q <= 1'b0; +end + +assign O_NMI_n = W_4D2_Q; + +//--------------------------- +// Address Decoder PROM @ 5B +//--------------------------- + +wire [7:0]W_PROM5B_Q; + +//ADEC_PROM prom5b(I_CLK_48M, I_AB[15:11], W_PROM5B_Q, +// I_DLCLK, I_DLADDR, I_DLDATA, I_DLWR); + +adec_5p adec_5p( + .clk(I_CLK_48M), + .addr(I_AB[15:11]), + .data(W_PROM5B_Q) +); + +assign O_MROM_CSn = {W_PROM5B_Q[7],W_PROM5B_Q[2:0]}; + +//-------------- +// 74LS139 @ 4A +//-------------- + +wire [3:0]W_4A1_Q, W_4A2_Q; + +logic_74xx139 U_4A_1 +( + .I_G(W_PROM5B_Q[4]), + .I_Sel({1'b0,I_AB[11]}), + .O_Q(W_4A1_Q) +); + +// This output goes to a LS245 @ 7H enable which is not used in the FPGA implementation. +assign O_3J_G_n = W_4A1_Q[0] & W_4C_Q[2] & W_4C_Q[3]; + +logic_74xx139 U_4A_2 +( + .I_G(W_PROM5B_Q[4] | I_MREQ_n), + .I_Sel(I_AB[11:10]), + .O_Q(W_4A2_Q) +); + +assign O_OBJ_RQ_n = W_4A2_Q[0]; + +//------------------------------------ +// 74LS138 @ 3A +// Address decoding 7000H - 7FFFH (R) +//------------------------------------ + +wire [7:0]W_3A_Q; + +logic_74xx138 U_3A +( + .I_G1(1'b1), + .I_G2a(I_RD_n), + .I_G2b(I_MREQ_n), + .I_Sel({W_PROM5B_Q[4],I_AB[11:10]}), + .O_Q(W_3A_Q) +); + +assign O_OBJ_RD_n = W_3A_Q[0]; // 7000H - 73FFH - Sprite RAM (R) +assign O_VRAM_RD_n = W_3A_Q[1]; // 7400H - 77FFH - VRAM (R) + +//------------------------------------ +// 74LS138 @ 3B +// Address decoding 7000H - 7FFFH (W) +//------------------------------------ + +wire [7:0]W_3B_Q; + +logic_74xx138 U_3B +( + .I_G1(W_3D_Q), + //.I_G1(1'b1), // No Wait + .I_G2a(I_WR_n), + .I_G2b(I_MREQ_n), + .I_Sel({W_PROM5B_Q[4],I_AB[11:10]}), + .O_Q(W_3B_Q) +); + +assign O_OBJ_WR_n = W_3B_Q[0]; // 7000H - 73FFH - Sprite RAM (W) +assign O_VRAM_WR_n = W_3B_Q[1]; // 7400H - 77FFH - VRAM (W) + +//-------------------------------------- +// 74LS138 @ 3C +// Address decoding 6000H - 6FFFH (R/W) +// RAM0 @ 7B - 6000H - 67FFH +// RAM1 @ 7A - 6800H - 6FFFH +//-------------------------------------- + +wire [7:0]W_3C_Q; + +logic_74xx138 U_3C +( + .I_G1(1'b1), + .I_G2a(I_MREQ_n), + .I_G2b(I_RD_n & I_WR_n), + .I_Sel({W_PROM5B_Q[3],1'b0, I_AB[11]}), + .O_Q(W_3C_Q) +); + +assign O_MRAM_CSn = W_3C_Q[1:0]; + +//------------------------------------ +// 74LS138 @ 4B +// Address decoding 7C00H - 7FFFH (R) +// Enable signals for reading inputs +// and and DIP switches +//------------------------------------ + +wire [7:0]W_4B_Q; + +logic_74xx138 U_4B +( + .I_G1(1'b1), + .I_G2a(I_RD_n), + .I_G2b(W_4A2_Q[3]), + .I_Sel(I_AB[9:7]), + .O_Q(W_4B_Q) +); + +assign O_SW1_OE_n = W_4B_Q[0]; // 7C00H - Service,2P Start,1P Start,Jump,D,U,L,R +assign O_SW2_OE_n = W_4B_Q[1]; // 7C80H - x,Coin 2,Coin 1,Jump2,2D,2U,2L,2R +assign O_DIPSW_OE_n = W_4B_Q[7]; // 7F80H - Dip switches + +//------------------------------------ +// 74LS138 @ 4C +// Address decoding 7C00H - 7FFFH (W) +// Miscellaneous addressing. +//------------------------------------ + +wire [7:0]W_4C_Q; + +logic_74xx138 U_4C +( + .I_G1(1'b1), + .I_G2a(I_WR_n), + .I_G2b(W_4A2_Q[3]), + .I_Sel(I_AB[9:7]), + .O_Q(W_4C_Q) +); + +// W_4C_Q[0] - 7C00H - Mario Walk analogue sound trigger +// W_4C_Q[1] - 7C80H - Luigi Walk analogue sound trigger +// W_4C_Q[2] - 7D00H - V MOV, Vertical scroll register select +// W_4C_Q[3] - 7D80H - ??? Write to video. +// W_4C_Q[4] - 7E00H - Write to sound register (sound select) (7J). +// W_4C_Q[5] - 7E80H - Enable for misc. control signals (2L). +// W_4C_Q[6] - 7F00H - Enable for sound port (7M). +assign O_4C_Q = W_4C_Q; + +//-------------------------------------- +// 74LS259 @ 2L +// Misc control signals (7E80H - 7E87H) +//-------------------------------------- + +reg [7:0]W_2L_Q; + +always@(posedge I_CLK_48M or negedge I_RESET_n) +begin + if(I_RESET_n == 1'b0) begin + W_2L_Q <= 0; + end + else if (I_CEN_12M) begin + if(W_4C_Q[5] == 1'b0) begin + case(I_AB[2:0]) + 3'h0 : W_2L_Q[0] <= I_DB[0]; // 7E80H - T ROM - GFX bank select + 3'h1 : W_2L_Q[1] <= I_DB[0]; // 7E81H - 2PSL - sprite bank select + 3'h2 : W_2L_Q[2] <= I_DB[0]; // 7E82H - Flip (must be inverted) + 3'h3 : W_2L_Q[3] <= I_DB[0]; // 7E83H - CREF 0 - colour palette bank select. + 3'h4 : W_2L_Q[4] <= I_DB[0]; // 7E84H - Reset NMI (Sets flip flop) + 3'h5 : W_2L_Q[5] <= I_DB[0]; // 7E85H - Z80 DMA RDY write + 3'h6 : W_2L_Q[6] <= I_DB[0]; // 7E86H - Coin counter 1 (misnumbered on schematic) + 3'h7 : W_2L_Q[7] <= I_DB[0]; // 7E87H - Coin counter 2 (misnumbered on schematic) + endcase + end + end +end + +assign O_2L_Q = W_2L_Q; + +//---------------------------- +// 74LS259 @ 7M +// Sound Port (7F00H - 7F07H) +// Tiggers sound effects. +//---------------------------- + +reg [7:0]W_7M_Q; + +always@(posedge I_CLK_48M or negedge I_RESET_n) +begin + if(I_RESET_n == 1'b0) begin + W_7M_Q <= 0; + end + else if (I_CEN_12M) begin + if(W_4C_Q[6] == 1'b0) begin + case(I_AB[2:0]) + 3'h0 : W_7M_Q[0] <= I_DB[0]; // 7F00H - /INT + 3'h1 : W_7M_Q[1] <= I_DB[0]; // 7F01H - T0 + 3'h2 : W_7M_Q[2] <= I_DB[0]; // 7F02H - T1 + 3'h3 : W_7M_Q[3] <= I_DB[0]; // 7F03H - PA0 + 3'h4 : W_7M_Q[4] <= I_DB[0]; // 7F04H - PA1 + 3'h5 : W_7M_Q[5] <= I_DB[0]; // 7F05H - PA2 + 3'h6 : W_7M_Q[6] <= I_DB[0]; // 7F06H - PA3 + 3'h7 : W_7M_Q[7] <= I_DB[0]; // 7F07H - Skid analogue sound trigger. + endcase + end + end +end + +assign O_7M_Q = W_7M_Q; + + +//-------------------------- +// 74LS374 @ 7J +// Sound data (7E00H) +// Data latch for sound CPU +//-------------------------- + +reg [7:0]W_7J_Q; + +reg W_4C_Q4q; +always@(posedge I_CLK_48M) begin + W_4C_Q4q <= W_4C_Q[4]; +end +wire W_4C_Q4_rise = ~W_4C_Q4q & W_4C_Q[4]; + +always@(posedge I_CLK_48M) begin + if (W_4C_Q4_rise) + W_7J_Q <= I_DB; +end + +assign O_7J_Q = W_7J_Q; + + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/mario_bram.v b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_bram.v new file mode 100644 index 00000000..a38d98b0 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_bram.v @@ -0,0 +1,324 @@ +//------------------- +// Block RAM modules +//------------------- + +module ram_1024_8_8 +( + input I_CLKA,I_CLKB, + input [9:0]I_ADDRA,I_ADDRB, + input [7:0]I_DA,I_DB, + input I_CEA,I_CEB, + input I_WEA,I_WEB, + output [7:0]O_DA,O_DB +); + +wire [7:0]W_DOA,W_DOB; +assign O_DA = I_CEA ? W_DOA : 8'h00; +assign O_DB = I_CEB ? W_DOB : 8'h00; + +dpram #(10,8) ram_1024_8_8 +( + .clock_a(I_CLKA), + .address_a(I_ADDRA), + .data_a(I_DA), + .enable_a(I_CEA), + .wren_a(I_WEA), + .q_a(W_DOA), + + .clock_b(I_CLKB), + .address_b(I_ADDRB), + .data_b(I_DB), + .enable_b(I_CEB), + .wren_b(I_WEB), + .q_b(W_DOB) +); + +endmodule + +///////////////////////////////////////////////////////////////////// + +module ram_1024_8 +( + input I_CLK, + input [9:0]I_ADDR, + input [7:0]I_D, + input I_CE, + input I_WE, + output [7:0]O_D +); + +wire [7:0]W_DO; +assign O_D = I_CE ? W_DO : 8'h00; + +dpram #(10,8) ram_1024_8 +( + .clock_a(I_CLK), + .address_a(I_ADDR), + .data_a(I_D), + .wren_a(I_WE), + .enable_a(I_CE), + .q_a(W_DO), + + .clock_b(I_CLK) +); + +endmodule + +///////////////////////////////////////////////////////////////////// + +module ram_2N +( + input I_CLK, + input [7:0]I_ADDR, + input [3:0]I_D, + input I_CE, + input I_WE, + output [3:0]O_D +); + +dpram #(8,4) ram_256_4 +( + .clock_a(I_CLK), + .address_a(I_ADDR), + .data_a(I_D), + .wren_a(I_WE), + .enable_a(I_CE), + .q_a(O_D), + + .clock_b(I_CLK) +); + +endmodule + +///////////////////////////////////////////////////////////////////// + +module ram_256_8 +( + input I_CLKA, + input [7:0]I_ADDRA, + input [7:0]I_DA, + input I_CEA, + input I_WEA, + output [7:0]O_DA +); + +dpram #(8,8) ram_256_8 +( + .clock_a(I_CLKA), + .address_a(I_ADDRA), + .data_a(I_DA), + .enable_a(I_CEA), + .wren_a(I_WEA), + .q_a(O_DA), + + .clock_b(I_CLKA) +); + +endmodule + +///////////////////////////////////////////////////////////////////// + +module ram_64_9 +( + input I_CLKA, + input [5:0]I_ADDRA, + input [8:0]I_DA, + input I_CEA, + input I_WEA, + output [8:0]O_DA +); + + +dpram #(6,9) ram_64x9 +( + .clock_a(I_CLKA), + .address_a(I_ADDRA), + .data_a(I_DA), + .enable_a(I_CEA), + .wren_a(I_WEA), + .q_a(O_DA), + + .clock_b(I_CLKA) +); + +endmodule + +///////////////////////////////////////////////////////////////////// + +module ram_2EF +( + input I_CLKA,I_CLKB, + input [7:0]I_ADDRA,I_ADDRB, + input [7:0]I_DA,I_DB, + input I_CEA,I_CEB, + input I_WEA,I_WEB, + output [7:0]O_DA,O_DB +); + +dpram #(9,8) ram_512_8 +( + .clock_a(I_CLKA), + .address_a({1'b0,I_ADDRA}), + .data_a(I_DA), + .enable_a(I_CEA), + .wren_a(I_WEA), + .q_a(O_DA), + + .clock_b(I_CLKB), + .address_b({1'b1,I_ADDRB}), + .data_b(I_DB), + .enable_b(I_CEB), + .wren_b(I_WEB), + .q_b(O_DB) +); + +endmodule + +///////////////////////////////////////////////////////////////////// + +module double_scan +( + input I_CLKA,I_CLKB, + input [8:0]I_ADDRA,I_ADDRB, + input [7:0]I_DA,I_DB, + input I_CEA,I_CEB, + input I_WEA,I_WEB, + output [7:0]O_DA,O_DB +); + +dpram #(9,8) ram_512_8 +( + .clock_a(I_CLKA), + .address_a(I_ADDRA), + .data_a(I_DA), + .enable_a(I_CEA), + .wren_a(I_WEA), + .q_a(O_DA), + + .clock_b(I_CLKB), + .address_b(I_ADDRB), + .data_b(I_DB), + .enable_b(I_CEB), + .wren_b(I_WEB), + .q_b(O_DB) +); + +endmodule + +///////////////////////////////////////////////////////////////////// + +module ram_128_8 +( + input I_CLK, + input [6:0]I_ADDR, + input [7:0]I_D, + input I_CE, + input I_WE, + output [7:0]O_D +); + +dpram #(7,8) ram_128_8 +( + .clock_a(I_CLK), + .address_a(I_ADDR), + .data_a(I_D), + .wren_a(I_WE), + .enable_a(I_CE), + .q_a(O_D), + + .clock_b(I_CLK) +); + +endmodule + +///////////////////////////////////////////////////////////////////// + +module ram_2048_8_8 +( + input I_CLKA,I_CLKB, + input [10:0]I_ADDRA,I_ADDRB, + input [7:0]I_DA,I_DB, + input I_CEA,I_CEB, + input I_OEA,I_OEB, + input I_WEA,I_WEB, + output [7:0]O_DA,O_DB +); + +wire [7:0]W_DOA,W_DOB; +assign O_DA = I_CEA & I_OEA ? W_DOA : 8'h00; +assign O_DB = I_CEB & I_OEB ? W_DOB : 8'h00; + +dpram #(11,8) ram_2048_8_8 +( + .clock_a(I_CLKA), + .address_a(I_ADDRA), + .data_a(I_DA), + .enable_a(I_CEA), + .wren_a(I_WEA), + .q_a(W_DOA), + + .clock_b(I_CLKB), + .address_b(I_ADDRB), + .data_b(I_DB), + .enable_b(I_CEB), + .wren_b(I_WEB), + .q_b(W_DOB) +); + +endmodule + + +///////////////////////////////////////////////////////////////////// + + +module ram_2048_8 +( + input I_CLK, + input [10:0]I_ADDR, + input [7:0]I_D, + input I_CE, + input I_WE, + output [7:0]O_D +); + +dpram #(11,8) ram_2048_8 +( + .clock_a(I_CLK), + .address_a(I_ADDR), + .data_a(I_D), + .wren_a(I_WE), + .enable_a(I_CE), + .q_a(O_D), + + .clock_b(I_CLK) +); + +endmodule + +///////////////////////////////////////////////////////////////////// + +module ram_4096_8 +( + input I_CLK, + input [11:0]I_ADDR, + input [7:0]I_D, + input I_CE, + input I_WE, + output [7:0]O_D +); + + +dpram #(12,8) ram_4096_8 +( + .clock_a(I_CLK), + .address_a(I_ADDR), + .data_a(I_D), + .wren_a(I_WE), + .enable_a(I_CE), + .q_a(O_D), + + .clock_b(I_CLK) +); + +endmodule + diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/mario_col_pal.v b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_col_pal.v new file mode 100644 index 00000000..20586d63 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_col_pal.v @@ -0,0 +1,78 @@ +//---------------------------------------------------------------------------- +// Mario Bros Arcade +// +// Author: gaz68 (https://github.com/gaz68) June 2020 +// +// Colour palette. +// Based on the Donkey Kong version by Katsumi Degawa. +//---------------------------------------------------------------------------- + +module mario_col_pal +( + input I_CLK_48M, + input I_CEN_24Mn, + input I_CEN_6M, + input [6:0]I_VRAM_D, + input [6:0]I_OBJ_D, + input I_CMPBLKn, + input I_CPAL_SEL, + output [2:0]O_R, + output [2:0]O_G, + output [1:0]O_B +); + +// Link CL2 on the schematics +// Uncut = 0 - Inverted colour palette +// Cut = 1 - Standard colour palette +parameter CL2 = 1'b1; + +//------------------------------------- +// Parts 4U, 5T (74LS157) +// Selects sprites or backgound pixels +// Sprites take priority +//------------------------------------- + +wire [6:0]W_4U5T_Y = (~(I_OBJ_D[0]|I_OBJ_D[1]|I_OBJ_D[2])) ? I_VRAM_D: I_OBJ_D; + +//-------------- +// Parts 6T, 6U +//-------------- + +wire [8:0]W_6TU_D = {I_CPAL_SEL,W_4U5T_Y[6:0],I_CMPBLKn}; +reg [8:0]W_6TU_Q; +wire W_6TU_RST = I_CMPBLKn | W_6TU_Q[0]; + +always@(posedge I_CLK_48M) +begin + if (I_CEN_24Mn) begin + if(W_6TU_RST == 1'b0) + W_6TU_Q <= 9'b0; + else if (I_CEN_6M) + W_6TU_Q <= W_6TU_D; + end +end + +//-------------------------------------------------------------- +// Colour PROM 4P (512 x 8bit) +// The PROM actually contains 2 versions of the colour palette: +// 0 - 255 = Inverted palette +// 256 - 512 = Standard palette +// Link CL2 on the PCB is used for selecting the palette. +//-------------------------------------------------------------- + +wire [8:0]W_PAL_AB = {CL2,W_6TU_Q[8:1]}; +wire [7:0]W_4P_DO; + +//CLUT_PROM_512_8 prom4p(I_CLK_48M, W_PAL_AB, W_4P_DO, +// I_DLCLK, I_DLADDR, I_DLDATA, I_DLWR); + +clut_4p clut_4p( + .clk(I_CLK_48M), + .addr(W_PAL_AB), + .data(W_4P_DO) +); + +assign {O_R, O_G, O_B} = W_4P_DO; // 3R:3G:2B + +endmodule + diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/mario_dma.v b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_dma.v new file mode 100644 index 00000000..2afa2971 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_dma.v @@ -0,0 +1,76 @@ +//---------------------------------------------------------------------------- +// Mario Bros Arcade +// +// Author: gaz68 (https://github.com/gaz68) June 2020 +// +// Simplified sprite DMA. +// To Do: Implement full z80 DMA controller. +// Mario Bros transfers $180 bytes from $6900 to $7000 +// when DMA is triggered. +//---------------------------------------------------------------------------- + +module mario_dma +( + input I_CLK_48M, + input I_CEN_4M, + input I_RSTn, + input I_DMA_TRIG, + input [7:0]I_DMA_DS, + + output [9:0]O_DMA_AS, + output [9:0]O_DMA_AD, + output [7:0]O_DMA_DD, + output O_DMA_CES, + output O_DMA_CED +); + +parameter dma_cnt_end = 10'h180; + +reg W_DMA_EN = 1'b0; +reg [10:0]W_DMA_CNT; +reg [7:0]W_DMA_DATA; +reg [9:0]DMA_ASr; +reg [9:0]DMA_ADr; +reg [7:0]DMA_DDr; +reg DMA_CESr, DMA_CEDr; + +always @(posedge I_CLK_48M) +begin + if (I_CEN_4M) begin + reg old_trig; + old_trig <= I_DMA_TRIG; +if(~old_trig & I_DMA_TRIG) + begin + DMA_ASr <= 10'h100; + DMA_ADr <= 0; + W_DMA_CNT <= 0; + W_DMA_EN <= 1'b1; + DMA_CESr <= 1'b1; + DMA_CEDr <= 1'b1; + end + else if(W_DMA_EN == 1'b1) + begin + case(W_DMA_CNT[1:0]) + 1: DMA_DDr <= I_DMA_DS; + 2: DMA_ASr <= DMA_ASr + 1'd1; + 3: DMA_ADr <= DMA_ADr + 1'd1; + default:; + endcase + W_DMA_CNT <= W_DMA_CNT + 1'd1; + W_DMA_EN <= W_DMA_CNT==dma_cnt_end*4 ? 1'b0 : 1'b1; + end + else + begin + DMA_CESr <= 1'b0; + DMA_CEDr <= 1'b0; + end + end +end + +assign O_DMA_AS = DMA_ASr; +assign O_DMA_AD = DMA_ADr; +assign O_DMA_DD = DMA_DDr; +assign O_DMA_CES = DMA_CESr; +assign O_DMA_CED = DMA_CEDr; + +endmodule diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/mario_hv_generator.v b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_hv_generator.v new file mode 100644 index 00000000..34acb068 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_hv_generator.v @@ -0,0 +1,111 @@ +//=============================================================================== +// FPGA DONKEY KONG H&V COUNTER +// +// Version : 2.00 +// +// Copyright(c) 2003 - 2004 Katsumi Degawa , All rights reserved +// +// Important ! +// +// This program is freeware for non-commercial use. +// An author does no guarantee about this program. +// You can use this under your own risk. +// +// 2005- 2- 9 some changed. +//================================================================================ +//----------------------------------------------------------------------------------------- +// 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],H_CNT[9] +// 1/2 H 1 H 2 H 4H 8H 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 +//----------------------------------------------------------------------------------------- +// VF_CNT[0],VF_CNT[1],VF_CNT[2],VF_CNT[3],VF_CNT[4],VF_CNT[5],VF_CNT[6],VF_CNT[7] +// 1 VF 2 VF 4 VF 8 VF 16 VF 32 VF 64 VF 128 VF + +module mario_hv_generator( + input I_CLK, + input I_CEN, + input I_RST_n, + input I_VFLIP, + output [9:0]H_CNT, + output [7:0]V_CNT, + output [7:0]VF_CNT, + output H_BLANKn, + output V_BLANKn, + output C_BLANKn, + output H_SYNCn, + output V_SYNCn, + output VCKn +); + +parameter H_count = 768; +parameter H_BL_P = 511; +parameter H_BL_W = 767; +parameter V_CL_P = 576; +parameter V_CL_W = 640; + +parameter V_BL_P = 239; +parameter V_BL_W = 15; + +reg [9:0]H_CNT_r = 0; +always@(posedge I_CLK) +begin + if (I_CEN) + H_CNT_r <= (H_CNT_r == H_count - 1'd1)? 0 : H_CNT_r + 1'd1 ; +end + + +assign H_CNT = H_CNT_r; + +reg H_BLANK = 1'b0; +reg V_CLK = 1'b0; +reg V_CLK_q; + +always@(posedge I_CLK) begin + if (H_CNT == H_BL_P) + H_BLANK <= 1'b1; + else if (H_CNT == H_BL_W) + H_BLANK <= 1'b0; + + if (H_CNT == V_CL_P) + V_CLK <= 1'b1; + else if (H_CNT == V_CL_W) + V_CLK <= 1'b0; + V_CLK_q <= V_CLK; +end + +assign H_SYNCn = ~V_CLK; +assign H_BLANKn = ~H_BLANK; +wire V_CLK_EN = ~V_CLK_q & V_CLK; + +reg [8:0]V_CNT_r; +always@(posedge I_CLK or negedge I_RST_n) +begin + if(I_RST_n == 1'b0) + V_CNT_r <= 0 ; + else if (V_CLK_EN) + V_CNT_r <= (V_CNT_r == 255)? 9'd504 : V_CNT_r + 1'd1; +end + +reg V_BLANK; +always@(posedge I_CLK or negedge I_RST_n) +begin + if(I_RST_n == 1'b0)begin + V_BLANK <= 1'b0; + end + else if (V_CLK_EN) begin + if (V_CNT_r == V_BL_P) + V_BLANK <= 1'b1; + else if (V_CNT_r == V_BL_W) + V_BLANK <= 1'b0; + end +end + +assign V_CNT[7:0] = V_CNT_r[7:0]; +assign V_SYNCn = ~V_CNT_r[8]; +assign V_BLANKn = ~V_BLANK; +assign C_BLANKn = ~(H_BLANK | V_BLANK); +assign VF_CNT[7:0]= V_CNT ^ {8{I_VFLIP}}; +assign VCKn = V_CLK; +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/mario_iir_filter.v b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_iir_filter.v new file mode 100644 index 00000000..b8ff3dac --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_iir_filter.v @@ -0,0 +1,171 @@ +/*MIT License +Copyright (c) 2019 Gregory Hogan (Soltan_G42) +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 iir_1st_order +#( + parameter COEFF_WIDTH = 18, + parameter COEFF_SCALE = 15, + parameter DATA_WIDTH = 16, + parameter COUNT_BITS = 11 +) +( + input clk, + input reset, + input [COUNT_BITS - 1 : 0] div, + input signed [COEFF_WIDTH - 1 : 0] A2, B1, B2, + input signed [DATA_WIDTH - 1 :0] in, + output signed [DATA_WIDTH - 1:0] out +); + + reg signed [DATA_WIDTH-1:0] x0,x1,y0; + reg signed [DATA_WIDTH + COEFF_WIDTH - 1 : 0] out32; + reg [COUNT_BITS - 1:0] count; + + // Usage: + // Design your 1st order iir low/high-pass with a tool that will give you the + // filter coefficients for the difference equation. Filter coefficients can + // be generated in Octave/matlab/scipy using a command similar to + // [B, A] = butter( 1, 3500/(106528/2), 'low') for a 3500 hz 1st order low-pass + // assuming 106528Hz sample rate. + // + // The Matlab output is: + // B = [0.093863 0.093863] + // A = [1.00000 -0.81227] + // + // Then scale coefficients by multiplying by 2^COEFF_SCALE and round to nearest integer + // + // B = [3076 3076] + // A = [32768 -26616] + // + // Discard A(1) because it is assumed 1.0 before scaling + // + // This leaves you with A2 = -26616 , B1 = 3076 , B2 = 3076 + // B1 + B2 - A2 should sum to 2^COEFF_SCALE = 32768 + // + // Sample frequency is "clk rate/div": for Genesis this is 53.69mhz/504 = 106528hz + // + // COEFF_WIDTH must be at least COEFF_SCALE+1 and must be large enough to + // handle temporary overflow during this computation: out32 <= (B1*x0 + B2*x1) - A2*y0 + + assign out = y0; + + always @ (*) begin + out32 <= (B1*x0 + B2*x1) - A2*y0; //Previous output is y0 not y1 + end + + always @ (posedge clk) begin + if(reset) begin + count <= 0; + x0 <= 0; + x1 <= 0; + y0 <= 0; + end + else begin + count <= count + 1'd1; + if (count == div - 1) begin + count <= 0; + y0 <= {out32[DATA_WIDTH + COEFF_WIDTH - 1] , out32[COEFF_SCALE + DATA_WIDTH - 2 : COEFF_SCALE]}; + x1 <= x0; + x0 <= in; + end + end + end + +endmodule //iir_1st_order + + + +module iir_2nd_order +#( + parameter COEFF_WIDTH = 18, + parameter COEFF_SCALE = 14, + parameter DATA_WIDTH = 16, + parameter COUNT_BITS = 10 +) +( + input clk, + input reset, + input [COUNT_BITS - 1 : 0] div, + input signed [COEFF_WIDTH - 1 : 0] A2, A3, B1, B2, B3, + input signed [DATA_WIDTH - 1 : 0] in, + output [DATA_WIDTH - 1 : 0] out +); + + reg signed [DATA_WIDTH-1 : 0] x0,x1,x2; + reg signed [DATA_WIDTH-1 : 0] y0,y1; + reg signed [(DATA_WIDTH + COEFF_WIDTH - 1) : 0] out32; + reg [COUNT_BITS : 0] count; + + + // Usage: + // Design your 1st order iir low/high-pass with a tool that will give you the + // filter coefficients for the difference equation. Filter coefficients can + // be generated in Octave/matlab/scipy using a command similar to + // [B, A] = butter( 2, 5000/(48000/2), 'low') for a 5000 hz 2nd order low-pass + // assuming 48000Hz sample rate. + // + // Output is: + // B = [ 0.072231 0.144462 0.072231] + // A = [1.00000 -1.10923 0.39815] + // + // Then scale coefficients by multiplying by 2^COEFF_SCALE and round to nearest integer + // Make sure your coefficients can be stored as a signed number with COEFF_WIDTH bits. + // + // B = [1183 2367 1183] + // A = [16384 -18174 6523] + // + // Discard A(1) because it is assumed 1.0 before scaling + // + // This leaves you with A2 = -18174 , A3 = 6523, B1 = 1183 , B2 = 2367 , B3 = 1183 + // B1 + B2 + B3 - A2 - A3 should sum to 2^COEFF_SCALE = 16384 + // + // Sample frequency is "clk rate/div" + // + // COEFF_WIDTH must be at least COEFF_SCALE+1 and must be large enough to + // handle temporary overflow during this computation: + // out32 <= (B1*x0 + B2*x1 + B3*x2) - (A2*y0 + A3*y1); + + assign out = y0; + + always @ (*) begin + out32 <= (B1*x0 + B2*x1 + B3*x2) - (A2*y0 + A3*y1); //Previous output is y0 not y1 + end + + always @ (posedge clk) begin + if(reset) begin + count <= 0; + x0 <= 0; + x1 <= 0; + x2 <= 0; + y0 <= 0; + y1 <= 0; + end + else begin + count <= count + 1'd1; + if (count == div - 1) begin + count <= 0; + y1 <= y0; + y0 <= {out32[DATA_WIDTH + COEFF_WIDTH - 1] , out32[(DATA_WIDTH + COEFF_SCALE - 2) : COEFF_SCALE]}; + x2 <= x1; + x1 <= x0; + x0 <= in; + end + end + end + +endmodule //iir_2nd_order diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/mario_input.v b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_input.v new file mode 100644 index 00000000..b3ec621d --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_input.v @@ -0,0 +1,74 @@ +//--------------------------------------------------------------------------------- +// Mario Bros Arcade +// +// Author: gaz68 (https://github.com/gaz68) June 2020 +// +// Controls and DIP Switches. +//--------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------- +// CONTROLS +// +// BIT 0 1 2 3 4 5 6 7 +//--------------------------------------------------------------------------------- +// SW1(MAIN) RIGHT LEFT - - JUMP 1P START 2P START TEST +// SW2(SUB) RIGHT2 LEFT2 - - JUMP2 COIN - - +//--------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------- +// DIP SWITCHES +// +// Toggle (DIP1) Settings: +// A B C D E F G H Option +//--------------------------------------------------------------------------------- +// Number of Players per Game +// -------------------------- +// Off Off 3 +// On Off 4 +// Off On 5 +// On On 6 +// +// Coin/Credit +// ---------- +// Off Off 1/1 +// On Off 2/1 +// Off On 1/2 +// On On 1/3 +// +// Extra Life +// ---------- +// Off Off 20,000 points +// On Off 30,000 points +// Off On 40,000 points +// On On No extra life +// +// Difficulty +// ---------- +// Off Off (1) Easy +// On Off (3) Hard +// Off On (2) Medium +// On On (4) Hardest +// +//--------------------------------------------------------------------------------- +// NOTE: Mario Bros does not have a cocktail mode. + +module mario_inport +( + input [7:0]I_SW1, + input [7:0]I_SW2, + input [7:0]I_DIPSW, + input I_SW1_OEn, + input I_SW2_OEn, + input I_DIPSW_OEn, + + output [7:0]O_D +); + +wire [7:0]W_SW1 = I_SW1_OEn ? 8'h00: ~I_SW1; +wire [7:0]W_SW2 = I_SW2_OEn ? 8'h00: ~I_SW2; + +wire [7:0]W_DIPSW = I_DIPSW_OEn ? 8'h00: {I_DIPSW[6],I_DIPSW[7],I_DIPSW[5:0]}; + +assign O_D = W_SW1 | W_SW2 | W_DIPSW; + +endmodule diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/mario_logic.v b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_logic.v new file mode 100644 index 00000000..b5c227d4 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_logic.v @@ -0,0 +1,117 @@ +//=============================================================================== +// FPGA DONKEY KONG used LOGIC IP +// +// Version : 1.00 +// +// Copyright(c) 2003 - 2004 Katsumi Degawa , All rights reserved +// +// Important ! +// +// This program is freeware for non-commercial use. +// An author does no guarantee about this program. +// You can use this under your own risk. +// +//================================================================================ + +//================================================ +// 74xx109 +// JK FLIP-FLOPS with PRESET & RST +// PRESET NO USE +//================================================ + +module logic_74xx109( +input FAST_CLK, +input CLK, +input RST, +input I_J, +input I_K, +output O_Q +); + +reg CLK_q; +reg Q; + +assign O_Q = Q; + +always@(posedge FAST_CLK)begin + CLK_q <= CLK; +end + +wire CLK_rise = ~CLK_q & CLK; + +always@(posedge FAST_CLK or negedge RST) +begin + if(RST == 1'b0) Q <= 1'b0; + else if (CLK_rise) begin + case({I_J,I_K}) + 2'b00: Q <= 1'b0; + 2'b01: Q <= Q; + 2'b10: Q <= ~Q; + 2'b11: Q <= 1'b1; + endcase + end +end + +endmodule + +//================================================ +// 74xx138 +// 3-to-8 line decoder +//================================================ + +module logic_74xx138( +input I_G1, +input I_G2a, +input I_G2b, +input [2:0]I_Sel, +output reg [7:0]O_Q +); + +wire [2:0]I_G = {I_G1,I_G2a,I_G2b}; +always@(I_G or I_Sel or O_Q) +begin + if(I_G == 3'b100 )begin + case(I_Sel) + 3'b000: O_Q = 8'b11111110; + 3'b001: O_Q = 8'b11111101; + 3'b010: O_Q = 8'b11111011; + 3'b011: O_Q = 8'b11110111; + 3'b100: O_Q = 8'b11101111; + 3'b101: O_Q = 8'b11011111; + 3'b110: O_Q = 8'b10111111; + 3'b111: O_Q = 8'b01111111; + endcase + end + else begin + O_Q = 8'b11111111; + end +end +endmodule + +//================================================ +// 74xx139 +// 2-to-4 line decoder +//================================================ + +module logic_74xx139( +input I_G, +input [1:0]I_Sel, +output reg [3:0]O_Q +); + +always@(I_G or I_Sel or O_Q) +begin + if(I_G == 1'b0 )begin + case(I_Sel) + 2'b00: O_Q = 4'b1110; + 2'b01: O_Q = 4'b1101; + 2'b10: O_Q = 4'b1011; + 2'b11: O_Q = 4'b0111; + endcase + end + else begin + O_Q = 4'b1111; + end +end + +endmodule diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/mario_main.v b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_main.v new file mode 100644 index 00000000..1357d668 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_main.v @@ -0,0 +1,272 @@ +//---------------------------------------------------------------------------- +// Mario Bros Arcade +// +// Author: gaz68 (https://github.com/gaz68) June 2020 +// +// Main CPU, ROM, RAM, address decoding, DMA and inputs. +//---------------------------------------------------------------------------- + +module mario_main +( + input I_CLK_48M, + input I_CEN_12M, + input I_MCPU_CEN4Mp, + input I_MCPU_CEN4Mn, + input I_MCPU_RESETn, + + input I_VRAMBUSY_n, + input I_VBLK_n, + input [7:0]I_SW1, + input [7:0]I_SW2, + input [7:0]I_DIPSW, + input [7:0]I_VRAM_DB, + + output [15:0]O_MCPU_A, + output [7:0]WI_D, + output [15:0]cpu_rom_addr, + input [7:0]cpu_rom_do, + output O_MCPU_RDn, + output O_MCPU_WRn, + + output [9:0]O_DMAD_A, + output [7:0]O_DMAD_D, + output O_DMAD_CE, + + output O_OBJ_RQn, + output O_OBJ_RDn, + output O_OBJ_WRn, + output O_VRAM_RDn, + output O_VRAM_WRn, + output [7:0]O_4C_Q, + output [7:0]O_2L_Q, + output [7:0]O_7M_Q, + output [7:0]O_7J_Q +); + +//----------------------- +// Main CPU - Z80 (4MHz) +//----------------------- + +wire W_MCPU_WAITn; +wire W_MCPU_RFSHn; +wire W_MCPU_M1n; +wire W_MCPU_NMIn; +wire W_MCPU_MREQn; +wire W_MCPU_RDn; +wire W_MCPU_WRn; +wire [15:0]W_MCPU_A; + +// INPUT DATA BUS +wire [7:0]ZDO, ZDI; +assign WI_D = ZDI; + +T80pa z80core( + .RESET_n(I_MCPU_RESETn), + .CLK(I_CLK_48M), + .CEN_p(I_MCPU_CEN4Mp), + .CEN_n(I_MCPU_CEN4Mn), + .WAIT_n(W_MCPU_WAITn), + .INT_n(1'b1), + .NMI_n(W_MCPU_NMIn), + .BUSRQ_n(), + .BUSAK_n(), + .M1_n(W_MCPU_M1n), + .IORQ_n(), + .MREQ_n(W_MCPU_MREQn), + .RD_n(W_MCPU_RDn), + .WR_n(W_MCPU_WRn), + .RFSH_n(W_MCPU_RFSHn), + .A(W_MCPU_A), + .DI(ZDO), + .DO(ZDI) + ); + +assign O_MCPU_A = W_MCPU_A; +assign O_MCPU_RDn = W_MCPU_RDn; +assign O_MCPU_WRn = W_MCPU_WRn; +assign cpu_rom_addr = W_MCPU_A; +// CPU Data Bus (Data In) +wire [7:0]WO_D = W_MROM_DO | W_MRAM7B_DO | W_MRAM7A_DO | W_SW_DO | I_VRAM_DB; +assign ZDO = WO_D; + +//------------------ +// Address decoding +//------------------ + +wire [3:0]W_MROM_CS_n; +wire [1:0]W_MRAM_CS_n; + +wire W_OBJ_RQn; +wire W_OBJ_RDn; +wire W_OBJ_WRn; +wire W_VRAM_RDn; +wire W_VRAM_WRn; +wire W_SW1_OEn; +wire W_SW2_OEn; +wire W_DIPSW_OEn; +wire [7:0]W_4C_Q; +wire [7:0]W_2L_Q; +wire [7:0]W_7M_Q; +wire [7:0]W_7J_Q; + +mario_adec adec +( + .I_CLK_48M(I_CLK_48M), + .I_CEN_12M(I_CEN_12M), + .I_CEN_4Mp(I_MCPU_CEN4Mp), + .I_CEN_4Mn(I_MCPU_CEN4Mn), + .I_RESET_n(I_MCPU_RESETn), + .I_AB(W_MCPU_A), + .I_DB(WI_D), + .I_MREQ_n(W_MCPU_MREQn), + .I_RFSH_n(W_MCPU_RFSHn), + .I_RD_n(W_MCPU_RDn), + .I_WR_n(W_MCPU_WRn), + .I_VRAMBUSY_n(I_VRAMBUSY_n), + .I_VBLK_n(I_VBLK_n), + .O_WAIT_n(W_MCPU_WAITn), + .O_NMI_n(W_MCPU_NMIn), + + .O_MROM_CSn(W_MROM_CS_n), + .O_MRAM_CSn(W_MRAM_CS_n), + + .O_3J_G_n(/*W_3J_G_n*/), + .O_OBJ_RQ_n(W_OBJ_RQn), + .O_OBJ_RD_n(W_OBJ_RDn), + .O_OBJ_WR_n(W_OBJ_WRn), + .O_VRAM_RD_n(W_VRAM_RDn), + .O_VRAM_WR_n(W_VRAM_WRn), + .O_SW1_OE_n(W_SW1_OEn), + .O_SW2_OE_n(W_SW2_OEn), + .O_DIPSW_OE_n(W_DIPSW_OEn), + .O_4C_Q(W_4C_Q), + .O_2L_Q(W_2L_Q), + .O_7M_Q(W_7M_Q), + .O_7J_Q(W_7J_Q) +); + +assign O_OBJ_RQn = W_OBJ_RQn; +assign O_OBJ_RDn = W_OBJ_RDn; +assign O_OBJ_WRn = W_OBJ_WRn; +assign O_VRAM_RDn = W_VRAM_RDn; +assign O_VRAM_WRn = W_VRAM_WRn; +assign O_4C_Q = W_4C_Q; +assign O_2L_Q = W_2L_Q; +assign O_7M_Q = W_7M_Q; +assign O_7J_Q = W_7J_Q; + +//---------- +// Main ROM +//---------- + +wire [7:0]W_MROM_DO; + +assign cpu_rom_addr = W_MCPU_A; + +assign W_MROM_DO = (W_MROM_CS_n[0] == 1'b0 & W_MCPU_RDn == 1'b0) ? cpu_rom_do : + (W_MROM_CS_n[1] == 1'b0 & W_MCPU_RDn == 1'b0) ? cpu_rom_do : + (W_MROM_CS_n[2] == 1'b0 & W_MCPU_RDn == 1'b0) ? cpu_rom_do : + (W_MROM_CS_n[3] == 1'b0 & W_MCPU_RDn == 1'b0) ? cpu_rom_do : + 8'h00; + +//--------------------- +// Main CPU RAM 7A, 7B +// 2 x 2KB (6116) +//--------------------- + +wire [7:0]W_7B_DO; +reg [7:0]W_MRAM7B_DO; + +ram_2048_8 U_7B // 6000H - 67FFH +( + .I_CLK(I_CLK_48M), + .I_ADDR(W_MCPU_A[10:0]), + .I_D(WI_D), + .I_CE(~W_MRAM_CS_n[0]), + .I_WE(~W_MCPU_WRn), + .O_D(W_7B_DO) +); + +wire [7:0]W_7A_DO; +reg [7:0]W_MRAM7A_DO; + +ram_2048_8_8 U_7A // 6800H - 6FFFH +( + // A Port + .I_CLKA(I_CLK_48M), + .I_ADDRA(W_MCPU_A[10:0]), + .I_DA(WI_D), + .I_CEA(~W_MRAM_CS_n[1]), + .I_OEA(~W_MCPU_RDn), + .I_WEA(~W_MCPU_WRn), + .O_DA(W_7A_DO), + + // B Port - DMA port (read-only) + .I_CLKB(I_CLK_48M), + .I_ADDRB(W_DMAS_A), + .I_DB(8'h00), + .I_CEB(W_DMAS_CE), + .I_OEB(1'b1), + .I_WEB(1'b0), + .O_DB(W_DMAS_D) +); + +always@(posedge I_CLK_48M) +begin + if (I_CEN_12M) begin + W_MRAM7B_DO <= (W_MCPU_RDn == 1'b0 & W_MRAM_CS_n[0] == 1'b0) ? W_7B_DO : 8'h00; + W_MRAM7A_DO <= (W_MCPU_RDn == 1'b0 & W_MRAM_CS_n[1] == 1'b0) ? W_7A_DO : 8'h00; + end +end + +//------------------------------------------ +// Sprite DMA +// transfers $180 bytes from $6900 to $7000 +//------------------------------------------ + +wire [9:0]W_DMAS_A; +wire [7:0]W_DMAS_D; +wire W_DMAS_CE; +wire [9:0]W_DMAD_A; +wire [7:0]W_DMAD_D; +wire W_DMAD_CE; + +mario_dma sprite_dma +( + .I_CLK_48M(I_CLK_48M), + .I_CEN_4M(I_MCPU_CEN4Mn), + .I_DMA_TRIG(W_2L_Q[5]), + .I_DMA_DS(W_DMAS_D), + + .O_DMA_AS(W_DMAS_A), + .O_DMA_CES(W_DMAS_CE), + .O_DMA_AD(W_DMAD_A), + .O_DMA_DD(W_DMAD_D), + .O_DMA_CED(W_DMAD_CE) +); + +assign O_DMAD_A = W_DMAD_A; +assign O_DMAD_D = W_DMAD_D; +assign O_DMAD_CE = W_DMAD_CE; + +//--------------------------- +// Inputs +// Controls and dip switches +//--------------------------- + +wire [7:0]W_SW_DO; + +mario_inport inport +( + .I_SW1(I_SW1), + .I_SW2(I_SW2), + .I_DIPSW(I_DIPSW), + .I_SW1_OEn(W_SW1_OEn), + .I_SW2_OEn(W_SW2_OEn), + .I_DIPSW_OEn(W_DIPSW_OEn), + + .O_D(W_SW_DO) +); + + +endmodule diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/mario_obj.v b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_obj.v new file mode 100644 index 00000000..1f08c4e0 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_obj.v @@ -0,0 +1,626 @@ +//---------------------------------------------------------------------------- +// Mario Bros Arcade +// +// Author: gaz68 (https://github.com/gaz68) June 2020 +// +// Objects (sprites) +// Based on the Donkey Kong version by Katsumi Degawa. +//---------------------------------------------------------------------------- + +//----------------------------------------------------------------------------------------- +// 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],H_CNT[9] +// 1/2H 1H 2H 4H 8H 16H 32H 64H 128H 256H +//----------------------------------------------------------------------------------------- +// V_CNT[0],V_CNT[1],V_CNT[2],V_CNT[3],V_CNT[4],V_CNT[5],V_CNT[6],V_CNT[7] +// 1V 2V 4V 8V 16V 32V 64V 128V +//----------------------------------------------------------------------------------------- +// VF_CNT[0],VF_CNT[1],VF_CNT[2],VF_CNT[3],VF_CNT[4],VF_CNT[5],VF_CNT[6],VF_CNT[7] +// 1 VF 2 VF 4 VF 8 VF 16 VF 32 VF 64 VF 128 VF +//----------------------------------------------------------------------------------------- + +module mario_obj +( + input I_CLK_48M, + input I_CEN_24Mp, + input I_CEN_24Mn, + input I_CEN_12M, + input [9:0]I_AB, + input [7:0]I_DB, + //input [7:0]I_OBJ_D, + input I_OBJ_WRn, + input I_OBJ_RDn, + input I_OBJ_RQn, + input I_2PSL, + input I_FLIPn, + input I_CMPBLKn, + input [9:0]I_H_CNT, + input [7:0]I_VF_CNT, + input [9:0]I_OBJ_DMA_A, + input [7:0]I_OBJ_DMA_D, + input I_OBJ_DMA_CE, + output [7:0]O_DB, // Not used + output [6:0]O_OBJ_DO, + output O_FLIP_VRAM, + output O_FLIP_HV, + output O_L_CMPBLKn +); + +reg [1:0] cnt; +always@(posedge I_CLK_48M) begin + cnt <= cnt + 1'd1; +end +wire I_CLK_12M; // as data not clock +assign I_CLK_12M = (cnt == 0) || (cnt == 1); + + +// Add a bit delay to make it work correctly +reg I_CMPBLKn_delayed; +always@(posedge I_CLK_48M) begin + I_CMPBLKn_delayed <= I_CMPBLKn; +end + +//------------ +// Part 6P(1) +//------------ + +reg W_6P1; +always@(posedge I_CLK_48M) begin + if (I_CEN_24Mn) begin + W_6P1 <= ~(I_H_CNT[0]&I_H_CNT[1]&I_H_CNT[2]&I_H_CNT[3]); + end +end + +//----------------- +// Part 4K (LS139) +//----------------- + +wire W_4K1_G = ~(I_H_CNT[0]&I_H_CNT[1]&I_H_CNT[2]&I_H_CNT[3]); + +wire [3:0]W_4K1_Q; +wire [3:0]W_4K2_QB; + +logic_74xx139 U_4K1 +( + .I_G(W_4K1_G), + .I_Sel({~I_H_CNT[9],I_H_CNT[3]}), + .O_Q(W_4K1_Q) + +); + +// The outputs from this are wired +// differently from DK, DKJ and DK3. +logic_74xx139 U_4K2 +( + .I_G(1'b0), + .I_Sel({I_H_CNT[3],I_H_CNT[2]}), + .O_Q(W_4K2_QB) +); + +reg [3:0]W_4K2_Q; +always@(posedge I_CLK_48M) begin + if (I_CEN_24Mn) begin + W_4K2_Q <= W_4K2_QB; + end +end + +//------ +// Flip +//------ + +wire W_FLIP_1 = ~I_FLIPn; // INV +wire W_FLIP_2 = W_FLIP_1 ^ 1'b1; // INV => XOR +wire W_FLIP_3 = ~W_FLIP_2; // INV => XOR => INV +wire W_FLIP_4 = W_FLIP_3 | W_4K2_Q[0]; +wire W_FLIP_5 = ~W_FLIP_4; + +assign O_FLIP_VRAM = W_FLIP_1; +assign O_FLIP_HV = W_FLIP_3; + +//------------ +// DB CONTROL +//------------ + +wire [7:0]WI_DB = I_OBJ_WRn ? 8'h00: I_DB; +wire [7:0]WO_DB; +//assign O_DB = I_OBJ_RDn ? 8'h00: WO_DB; + +//------------------------------------------------ +// Object RAM 8B, 8C +// 2 x 2148 (1KB) +// Sprite data is written to these RAM's via DMA. +//------------------------------------------------ + +wire [9:0]W_OBJ_AB = {I_2PSL, I_H_CNT[8:0]}; +wire [7:0]W_OBJ_DI; + +ram_1024_8_8 U_8BC +( + // A Port - DMA port (write) + .I_CLKA(I_CLK_48M), + .I_ADDRA(I_OBJ_DMA_A), + .I_DA(I_OBJ_DMA_D), + .I_CEA(I_OBJ_DMA_CE), + .I_WEA(1'b1), + .O_DA(), + + // B Port (read) + .I_CLKB(I_CLK_48M), + .I_ADDRB(W_OBJ_AB[9:0]), + .I_DB(8'h00), + .I_CEB(1'b1), + .I_WEB(1'b0), + .O_DB(W_OBJ_DI) +); + +//------------ +// AB CONTROL +//------------ + +wire W_AB_SEL = I_OBJ_WRn & I_OBJ_RDn & I_OBJ_RQn; +wire [9:0]W_obj_AB = W_AB_SEL ? {I_2PSL,I_H_CNT[8:0]} : I_AB ; +wire W_obj_CS = W_AB_SEL ? 1'b0 : I_OBJ_WRn & I_OBJ_RDn; + +//-------------- +// VFC_CNT[7:0] +//-------------- + +reg I_H_CNT9_q; +wire I_H_CNT9_fall = I_H_CNT9_q & ~I_H_CNT[9]; +always@(posedge I_CLK_48M) begin + I_H_CNT9_q <= I_H_CNT[9]; +end + +reg [7:0]W_VFC_CNT; +always@(posedge I_CLK_48M) begin + if (I_H_CNT9_fall) begin + W_VFC_CNT <= I_VF_CNT; // 6J, 7J + end +end + +//----------------- +// Part 7D (LS273) +//----------------- + +reg [7:0]W_7D_Q; +always@(posedge I_CLK_48M) begin + if (I_CEN_24Mn) begin + if (I_CLK_12M == 1'b0) + W_7D_Q <= W_OBJ_DI; + end +end + +//---------------------- +// Parts 6E,7E,6F,7F +// 4-bit adders (LS283) +//---------------------- + +wire [7:0]W_67E_A = W_7D_Q; +wire [7:0]W_67E_B = {4'b1111,I_FLIPn,W_FLIP_1,W_FLIP_1,1'b1}; +wire [8:0]W_67E_Q = W_67E_A + W_67E_B + 8'b00000001; + +wire [7:0]W_67F_A = W_67E_Q[7:0]; +wire [7:0]W_67F_B = I_VF_CNT[7:0]; +wire [8:0]W_67F_Q = W_67F_A + W_67F_B; + +//---- + +reg W_5F; +always@(posedge I_CLK_48M) begin + if (I_CEN_24Mn) begin + if (I_CLK_12M) + W_5F <= ~(W_67F_Q[7]&W_67F_Q[6]&W_67F_Q[5]&W_67F_Q[4]); + end +end + +reg CLK_4F; +always@(posedge I_CLK_48M) begin + if (I_CEN_24Mn) begin + CLK_4F = ~(I_H_CNT[0] & (~I_H_CNT[1])); + end +end +wire W_5E = ~(W_5CD_Q[6] | W_5CD_Q[7]); +wire W_4J = ~(I_H_CNT[2]&I_H_CNT[3]&I_H_CNT[4]&I_H_CNT[5]&I_H_CNT[6]&I_H_CNT[7]&I_H_CNT[8] & W_5E); + +//--------------- +//Part 4F (LS74) +//--------------- + +reg W_4F_Q; +wire W_RST_4F = ~I_H_CNT[9]; + +reg CLK_4F_q; +wire CLK_4F_rise = ~CLK_4F_q & CLK_4F; +always@(posedge I_CLK_48M) begin + CLK_4F_q <= CLK_4F; +end + +always@(posedge I_CLK_48M or negedge W_RST_4F) +begin + if(W_RST_4F == 0) W_4F_Q <= 1'b0; + else if (CLK_4F_rise) W_4F_Q <= ~(W_5F & W_4J); +end + +//----------------- +// Counters 5C, 5D +//----------------- + +wire CLK_5CD = ~(I_CLK_12M & (~I_H_CNT[9]) & W_4F_Q & W_5E); +wire W_5CD_RST = ~I_H_CNT[9]; +reg [7:0]W_5CD_Q; + +reg CLK_5CD_q; +wire CLK_5CD_rise = ~CLK_5CD_q & CLK_5CD; +always@(posedge I_CLK_48M) begin + CLK_5CD_q <= CLK_5CD; +end + +always@(posedge I_CLK_48M or negedge W_5CD_RST) +begin + if(W_5CD_RST == 1'b0) W_5CD_Q <= 0; + else if (CLK_5CD_rise) W_5CD_Q <= W_5CD_Q + 1'd1; +end + +//--------- +// Part 8D +//--------- + +reg [7:0]W_8D_Q; +always@(posedge I_CLK_48M) begin + if (I_CEN_24Mn) begin + if (I_CLK_12M == 1'b0) + W_8D_Q <= W_7D_Q; + end +end + +//---------------------------------------------------- +// RAM 8E +// 64 x 9 bits bipolar RAM with inverted O/C outputs. +// A LS240 is used to re-invert the outputs. +//---------------------------------------------------- + +wire [5:0]W_RAM_8E_AB = ~I_H_CNT[9] ? W_5CD_Q[5:0] : I_H_CNT[7:2]; +wire [8:0]W_RAM_8E_DIB = {W_8D_Q[7:0],W_4J}; +wire [8:0]W_RAM_8E_DOB; + +ram_64_9 U_8E +( + .I_CLKA(I_CLK_48M), + .I_ADDRA(W_RAM_8E_AB), + .I_DA(W_RAM_8E_DIB), + .I_CEA(1'b1), + .I_WEA(~CLK_5CD), + .O_DA(W_RAM_8E_DOB) +); + +reg [7:0]W_HD; +always@(posedge I_CLK_48M) begin + if (I_CEN_24Mn) + W_HD <= W_RAM_8E_DOB[8:1]; // Not on the schematics? +end + +// Add a bit delay to make it work correctly +reg [8:0] W_RAM_8E_DOB_delayed; +always@(posedge I_CLK_48M) begin + W_RAM_8E_DOB_delayed <= W_RAM_8E_DOB; +end + +//---------------------- +// Parts 6K,7K,6L,7L +// 4-bit adders (LS283) +//---------------------- + +wire [7:0]W_67K_A = W_RAM_8E_DOB_delayed[8:1]; +wire [7:0]W_67K_B = {4'b1111,W_FLIP_5,W_FLIP_4,W_FLIP_4,1'b1}; +wire [8:0]W_67K_Q = W_67K_A + W_67K_B + 8'b00000001; + +wire [7:0]W_67L_A = W_67K_Q[7:0]; +wire [7:0]W_67L_B = W_VFC_CNT[7:0]; +wire [8:0]W_67L_Q = W_67L_A + W_67L_B; + +//------------------- +// Part 6M (LS273) +//------------------- + +wire [7:0]W_6M_D = W_67L_Q[7:0]; +reg [7:0]W_6M_Q; +reg W_4K2_Q0_q; +wire W_4K2_Q0_rise = ~W_4K2_Q0_q & W_4K2_Q[0]; +always@(posedge I_CLK_48M) begin + W_4K2_Q0_q <= W_4K2_Q[0]; +end + +always@(posedge I_CLK_48M) begin + if (W_4K2_Q0_rise) + W_6M_Q <= W_6M_D; +end + +//------------------- +// Part 8J (LS273) +//------------------- + +reg [7:0]W_8J_Q; + +reg W_4K2_Q1_q; +wire W_4K2_Q1_rise = ~W_4K2_Q1_q & W_4K2_Q[1]; +always@(posedge I_CLK_48M) begin + W_4K2_Q1_q <= W_4K2_Q[1]; +end + +always@(posedge I_CLK_48M) begin + if (W_4K2_Q1_rise) + W_8J_Q <= W_HD[7:0]; +end + +//------------------- +// Part 6R (LS377) +//------------------- + +wire [7:0]W_6R_D = {W_8J_Q[7],I_CMPBLKn_delayed,~I_H_CNT[9], + ~(I_H_CNT[9]|W_FLIP_2),W_8J_Q[3:0]}; +reg [7:0]W_6R_Q; + +always@(posedge I_CLK_48M) +begin + if (I_CEN_12M) begin + if(W_6P1 == 1'b0) + W_6R_Q <= W_6R_D; + else + W_6R_Q <= W_6R_Q; + end +end + +assign O_L_CMPBLKn = W_6R_Q[6]; + +//--------------- +// Part 3M +// J-K flip flop +//--------------- + +wire W_3M_Q; + +logic_74xx109 U_3M +( + .FAST_CLK(I_CLK_48M), + .CLK(W_4K2_Q[0]), + .RST(I_H_CNT[9]), + .I_J(~W_RAM_8E_DOB[0]), + .I_K(1'b1), + .O_Q(W_3M_Q) +); + +wire W_6P2 = ~(W_6M_Q[4]&W_6M_Q[5]&W_6M_Q[6]&W_6M_Q[7]); +wire W_4L = W_3M_Q | W_6P2; +wire W_6S = ~(W_4L | W_6P1); + +//----------------- +// Part 8K (LS373) +//----------------- + +wire W_8K_G = ~W_4K2_Q[2]; +reg [7:0]W_8K_Q; + +always@(W_8K_G or W_HD[7:0]) +begin + if(W_8K_G) + W_8K_Q <= W_HD[7:0]; + else + W_8K_Q <= W_8K_Q; +end + +//------------------------ +// Object ROMs (6 x 2732) +//------------------------ + +wire [11:0]W_ROM_OBJ_AB; +assign W_ROM_OBJ_AB[3:0] = W_6M_Q[3:0]^{W_8J_Q[6],W_8J_Q[6],W_8J_Q[6],W_8J_Q[6]}; +assign W_ROM_OBJ_AB[11:4] = W_8K_Q; +wire [47:0]W_ROM_OBJ_D; + +//OBJ_ROM objrom(I_CLK_48M, W_ROM_OBJ_AB, W_ROM_OBJ_D, +// I_CLK_48M, I_DLADDR, I_DLDATA, I_DLWR); + +obj_7m obj_7m( + .clk(I_CLK_48M), + .addr(W_ROM_OBJ_AB), + .data(W_ROM_OBJ_D[47:40]) +); + +obj_7n obj_7n( + .clk(I_CLK_48M), + .addr(W_ROM_OBJ_AB), + .data(W_ROM_OBJ_D[39:32]) +); + +obj_7p obj_7p( + .clk(I_CLK_48M), + .addr(W_ROM_OBJ_AB), + .data(W_ROM_OBJ_D[31:24]) +); + +obj_7s obj_7s( + .clk(I_CLK_48M), + .addr(W_ROM_OBJ_AB), + .data(W_ROM_OBJ_D[23:16]) +); + +obj_7t obj_7t( + .clk(I_CLK_48M), + .addr(W_ROM_OBJ_AB), + .data(W_ROM_OBJ_D[15:8]) +); + +obj_7u obj_7u( + .clk(I_CLK_48M), + .addr(W_ROM_OBJ_AB), + .data(W_ROM_OBJ_D[7:0]) +); + +//----------------------------- +// Parts 8N, 8P +// Shift registers (2 x LS299) +//----------------------------- + +wire W_8N_Qa, W_8P_Qh; + +wire [1:0]C_8NP = W_8LM_Y[1:0]; +wire [15:0]W_8NP = W_ROM_OBJ_D[47:32]; +reg [15:0]reg_8NP; + +assign W_8N_Qa = reg_8NP[15]; +assign W_8P_Qh = reg_8NP[0]; + +always@(posedge I_CLK_48M) +begin + if (I_CEN_12M) begin + case(C_8NP) + 2'b00: reg_8NP <= reg_8NP; + 2'b10: reg_8NP <= {reg_8NP[14:0],1'b0}; + 2'b01: reg_8NP <= {1'b0,reg_8NP[15:1]}; + 2'b11: reg_8NP <= W_8NP; + endcase + end +end + +//----------------------------- +// Parts 8R, 8S +// Shift registers (2 x LS299) +//----------------------------- + +wire W_8R_Qa, W_8S_Qh; + +wire [1:0]C_8RS = W_8LM_Y[1:0]; +wire [15:0]W_8RS = W_ROM_OBJ_D[31:16]; +reg [15:0]reg_8RS; + +assign W_8R_Qa = reg_8RS[15]; +assign W_8S_Qh = reg_8RS[0]; + +always@(posedge I_CLK_48M) +begin + if (I_CEN_12M) begin + case(C_8RS) + 2'b00: reg_8RS <= reg_8RS; + 2'b10: reg_8RS <= {reg_8RS[14:0],1'b0}; + 2'b01: reg_8RS <= {1'b0,reg_8RS[15:1]}; + 2'b11: reg_8RS <= W_8RS; + endcase + end +end + +//----------------------------- +// Parts 8T, 8U +// Shift registers (2 x LS299) +//----------------------------- + +wire W_8T_Qa, W_8U_Qh; + +wire [1:0]C_8TU = W_8LM_Y[1:0]; +wire [15:0]W_8TU = W_ROM_OBJ_D[15:0]; +reg [15:0]reg_8TU; + +assign W_8T_Qa = reg_8TU[15]; +assign W_8U_Qh = reg_8TU[0]; + +always@(posedge I_CLK_48M) +begin + if (I_CEN_12M) begin + case(C_8TU) + 2'b00: reg_8TU <= reg_8TU; + 2'b10: reg_8TU <= {reg_8TU[14:0],1'b0}; + 2'b01: reg_8TU <= {1'b0,reg_8TU[15:1]}; + 2'b11: reg_8TU <= W_8TU; + endcase + end +end + +//-------------- +// Parts 8L, 8M +// 2 x LS157 +//-------------- + +wire [4:0]W_8LM_A, W_8LM_B, W_8LM_Y; + +assign W_8LM_A = {W_8N_Qa,W_8R_Qa,W_8T_Qa,1'b1,W_6S}; +assign W_8LM_B = {W_8P_Qh,W_8S_Qh,W_8U_Qh,W_6S,1'b1}; +assign W_8LM_Y = W_6R_Q[7] ? W_8LM_B : W_8LM_A; + +//-------------- +// Parts 4M, 5M +// 2 x LS163 +//-------------- + +reg CLK_4M5M; + +always@(posedge I_CLK_48M) begin + if (I_CEN_24Mn) + CLK_4M5M <= ~(~(I_H_CNT[0] & W_6R_Q[5]) & I_CLK_12M); +end + +wire [7:0]W_4M5M_DI = W_67K_Q[7:0]; + +wire W_4M5M_RST = W_4K1_Q[3] | W_6R_Q[5]; +wire W_4M5M_LD = W_4K1_Q[1]; + +reg [7:0]W_4M5M_Q; + +reg CLK_4M5M_q; +wire CLK_4M5M_rise = ~CLK_4M5M_q & CLK_4M5M; +always@(posedge I_CLK_48M) begin + CLK_4M5M_q <= CLK_4M5M; +end + +always@(posedge I_CLK_48M) +begin + if (CLK_4M5M_rise) begin + if(W_4M5M_LD == 1'b0) + W_4M5M_Q <= W_4M5M_DI; + else begin + if(W_4M5M_RST == 1'b0) + W_4M5M_Q <= 0 ; + else + W_4M5M_Q <= W_4M5M_Q + 1'd1; + end + end +end + +//------------------------------- +// ECL RAM (2 x 256x4bit) 3R, 3P +//------------------------------- + +wire [7:0]W_RAM_3RP_AB = W_4M5M_Q[7:0]^{8{W_6R_Q[4]}}; + +wire [6:0]W_4S5S_A = {W_6R_Q[3:0],W_8LM_Y[2],W_8LM_Y[3],W_8LM_Y[4]}; +wire [6:0]W_RAM_3RP_DI = W_6R_Q[5] ? 7'h00 :(W_8LM_Y[2]|W_8LM_Y[3]|W_8LM_Y[4])? W_4S5S_A : W_RAM_3RP_DO; +wire [6:0]W_RAM_3RP_DO; + +ram_256_8 U_3RP +( + .I_CLKA(I_CLK_48M), + .I_ADDRA(W_RAM_3RP_AB), + .I_DA(W_RAM_3RP_DI), + .I_CEA(1'b1), + .I_WEA(~CLK_4M5M), + .O_DA(W_RAM_3RP_DO) +); + +//----------------- +// Part 4T (LS373) +//----------------- + +reg [6:0]W_OBJ_DO; + +always@(posedge I_CLK_48M) +begin + if (I_CEN_24Mp) begin + if(~I_CLK_12M) + W_OBJ_DO <= W_RAM_3RP_DO; + else + W_OBJ_DO <= W_OBJ_DO ; + end +end + +assign O_OBJ_DO = W_OBJ_DO; + + +endmodule + diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/mario_sound.v b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_sound.v new file mode 100644 index 00000000..7638c511 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_sound.v @@ -0,0 +1,84 @@ +//---------------------------------------------------------------------------- +// Mario Bros Arcade +// +// Author: gaz68 (https://github.com/gaz68) June 2020 +// +// Top level sound module. +//---------------------------------------------------------------------------- + +module mario_sound +( + input I_CLK_48M, + input I_CEN_12M, + input I_CEN_11M, + input I_RESETn, + input [7:0]I_SND_DATA, + input [9:0]I_SND_CTRL, + input [3:0]I_ANLG_VOL, + input [3:0]I_H_CNT, + output signed [15:0]O_SND_DAT +); + +//------------------------------------------------ +// Digital sound +// Background music and some of the sound effects +//------------------------------------------------ + +wire [15:0]W_D_S_DATA; + +mario_sound_digital digital_sound +( + .I_CLK_48M(I_CLK_48M), + .I_CEN_12M(I_CEN_12M), + .I_CEN_11M(I_CEN_11M), + .I_RST(I_RESETn), + .I_SND_DATA(I_SND_DATA), + .I_SND_CTRL(I_SND_CTRL[6:0]), + + .O_SND_OUT(W_D_S_DATA) +); + +//-------------------------------------- +// Analogue Sounds (samples) +// Mario run, Luigi run and skid sounds +//-------------------------------------- + +wire signed [15:0]W_WAVROM_DS[0:2]; + +//mario_sound_analog analog_sound +//( +// .I_CLK_48M(I_CLK_48M), +// .I_RESETn(I_RESETn), +// +// .I_SND_CTRL(I_SND_CTRL[9:7]), +// .I_ANLG_VOL(I_ANLG_VOL), +// .I_H_CNT(I_H_CNT), +// +// .I_DLADDR(I_DLADDR), +// .I_DLDATA(I_DLDATA), +// .I_DLWR(I_DLWR), +// +// .O_WAVROM_DS0(W_WAVROM_DS[0]), +// .O_WAVROM_DS1(W_WAVROM_DS[1]), +// .O_WAVROM_DS2(W_WAVROM_DS[2]) +//); + +//---------------------------------- +// Sound Mixer (Analogue & Digital) +//---------------------------------- + +wire signed [15:0]W_SND_MIX; + +mario_sound_mixer mixer +( + .I_CLK_48M(I_CLK_48M), + .I_SND1(W_WAVROM_DS[0]), + .I_SND2(W_WAVROM_DS[1]), + .I_SND3(W_WAVROM_DS[2]), + .I_SND4(W_D_S_DATA), + .O_SND_DAT(W_SND_MIX) +); + +assign O_SND_DAT = W_SND_MIX; + +endmodule diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/mario_sound_digital.v b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_sound_digital.v new file mode 100644 index 00000000..d370debd --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_sound_digital.v @@ -0,0 +1,160 @@ +//---------------------------------------------------------------------------- +// Mario Bros Arcade +// +// Author: gaz68 (https://github.com/gaz68) June 2020 +// +// Digital sound module. +//---------------------------------------------------------------------------- + +module mario_sound_digital +( + input I_CLK_48M, + input I_CEN_12M, + input I_CEN_11M, + input I_RST, + input I_DLCLK, + input [16:0]I_DLADDR, + input [7:0]I_DLDATA, + input I_DLWR, + input [7:0]I_SND_DATA, + input [6:0]I_SND_CTRL, + + output signed [15:0]O_SND_DAC, + output signed [15:0]O_SND_OUT +); + +//---------------- +// Sub CPU M58715 +//---------------- + +wire [7:0]M58715_DBI; +wire [7:0]M58715_DBO; +wire [7:0]M58715_PAI; +wire [7:0]M58715_PBI; +wire M58715_ALE; +wire M58715_RDn; +wire M58715_WRn; +wire M58715_PSENn; + +wire [7:0]M58715_PAO = {4'b0000, I_SND_CTRL[6:3]}; + +M58715IP SOUND_CPU +( + .I_CLK(I_CLK_48M), + .I_CLK_EN(I_CEN_11M), + .I_RSTn(I_RST), + .I_INTn(~I_SND_CTRL[0]), + .I_EA(~M58715_PBI[5]), + .O_PSENn(M58715_PSENn), + .O_RDn(M58715_RDn), + .O_WRn(M58715_WRn), + .O_ALE(M58715_ALE), + .O_PROGn(), + .I_T0(I_SND_CTRL[1]), + .O_T0(), + .I_T1(I_SND_CTRL[2]), + .I_DB(M58715_DBO), + .O_DB(M58715_DBI), + .I_P1(M58715_PAO), + .O_P1(M58715_PAI), + .I_P2(8'h00), + .O_P2(M58715_PBI) +); + +//-------------------------------------------- +// The Mario Bros schematics show a sound ROM +// labelled as 2732 with the pinout of a 2764. +// A 2732 is used on the real board with the +// option of using a 2764. +// M58715 has 2KB internal ROM. The External +// 4KB ROM is accessed as 2 banks of 2KB. +//-------------------------------------------- + +wire [11:0]S_ROM_A; +reg [7:0]L_ROM_A; + +reg M58715_ALE_q; +wire M58715_ALE_fall = M58715_ALE_q & ~M58715_ALE; +always@(posedge I_CLK_48M) begin + M58715_ALE_q <= M58715_ALE; +end + +always@(posedge I_CLK_48M) begin + if (M58715_ALE_fall) + L_ROM_A <= M58715_DBI; +end + +wire A12 = ~M58715_RDn & ~M58715_PBI[7]; +wire S_ROM_OE = ~A12 & M58715_PSENn; + +assign S_ROM_A = {M58715_PBI[3:0],L_ROM_A[7:0]}; + + +reg S_7J_OC; +always@(posedge I_CLK_48M) begin + if (I_CEN_12M) + S_7J_OC <= ~(~M58715_RDn & M58715_PBI[7]); +end + +wire [7:0]S_PROG_D ; + +//SUB_EXT_ROM srom5k(I_CLK_48M, S_ROM_A, 1'b0, S_ROM_OE, S_PROG_D, +// I_CLK_48M, I_DLADDR, I_DLDATA, I_DLWR); +snd_rom snd_rom( + .clk(I_CLK_48M), + .addr(S_ROM_A), + .data(S_PROG_D) +); + + + +// M58715 Data Bus +wire [7:0]M58715_DO = S_7J_OC == 1'b0 ? I_SND_DATA : S_PROG_D; + +reg [7:0]DO; +always@(posedge I_CLK_48M) begin + if (I_CEN_12M) + DO <= M58715_DO; +end + +assign M58715_DBO = DO; + +// Sound out +reg [15:0]SND_DAC; + +reg M58715_WRn_q; +wire M58715_WRn_rise = ~M58715_WRn_q & M58715_WRn; +always@(posedge I_CLK_48M) begin + M58715_WRn_q <= M58715_WRn; +end + +always@(posedge I_CLK_48M) begin + if (M58715_WRn_rise) + SND_DAC <= {2{~M58715_DBI[7],M58715_DBI[6:0]}}; // 16-bit signed; +end + +//----------------------------------------------------- +// Sound filter +// Low pass filter. f= 1178.9 Hz @ 48KHz. +//----------------------------------------------------- + +// Reduce volume +wire [15:0]W_SND_IN = {SND_DAC[15],SND_DAC[15:1]} + {{3{SND_DAC[15]}}, SND_DAC[15:3]}; + +wire [15:0]W_FILT_OUT; + +iir_1st_order filter +( + .clk(I_CLK_48M), + .reset(~I_RST), + .div(12'd1000), // 48Mhz / 1000 = 48KHz + .A2(-18'sd28065), + .B1(18'sd2352), + .B2(18'sd2352), + .in(W_SND_IN), + .out(W_FILT_OUT) +); + +assign O_SND_OUT = W_FILT_OUT; + +endmodule diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/mario_sound_mixer.v b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_sound_mixer.v new file mode 100644 index 00000000..7bf0c684 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_sound_mixer.v @@ -0,0 +1,38 @@ +//---------------------------------------------------------------------------- +// Mario Bros Arcade +// +// Author: gaz68 (https://github.com/gaz68) June 2020 +// +// Sound mixer. +// Mixes the analogue sounds (samples) with the digital +// sound produced by the M58715 chip. +//---------------------------------------------------------------------------- + +module mario_sound_mixer +( + input I_CLK_48M, + input [15:0]I_SND1,I_SND2,I_SND3,I_SND4, + output signed [15:0]O_SND_DAT +); + +wire signed [18:0]sound_mix = {{3{I_SND1[15]}}, I_SND1} + + {{3{I_SND2[15]}}, I_SND2} + + {{3{I_SND3[15]}}, I_SND3} + + {{3{I_SND4[15]}}, I_SND4}; + +reg signed [15:0]dac_di; + +always@(posedge I_CLK_48M) +begin + if(sound_mix >= 19'sh07FFF) + dac_di <= 16'sh7FFF; + else if(sound_mix <= -19'sh08000) + dac_di <= -16'sh8000; + else + dac_di <= sound_mix[15:0]; +end + + +assign O_SND_DAT = dac_di; + +endmodule diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/mario_top.v b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_top.v new file mode 100644 index 00000000..745f68e9 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_top.v @@ -0,0 +1,249 @@ +//---------------------------------------------------------------------------- +// Mario Bros Arcade +// +// Author: gaz68 (https://github.com/gaz68) June 2020 +// +// Top level module +//---------------------------------------------------------------------------- + +module mario_top +( + input I_CLK_48M, + input I_RESETn, + + input [3:0] I_ANLG_VOL, + input [7:0] I_SW1, + input [7:0] I_SW2, + input [7:0] I_DIPSW, + + output [15:0] cpu_rom_addr, + input [7:0] cpu_rom_do, + output [11:0] bg_rom_addr, + input [15:0] bg_rom_do, + + output [2:0] O_VGA_R, + output [2:0] O_VGA_G, + output [1:0] O_VGA_B, + output O_HBLANK, + output O_VBLANK, + output O_VGA_HSYNCn, + output O_VGA_VSYNCn, + output O_PIX, + + output signed [15:0] O_SOUND_DAT +); + +wire W_RESETn = I_RESETn; +wire W_CPU_RESETn = W_RESETn; +wire W_CLK_48M = I_CLK_48M; +wire cen24p, cen24n, cen12p, cen12n, cen11, cen6, cen4p, cen4n; + +reg [2:0] div8; + +always @(posedge W_CLK_48M) begin + div8 <= div8 + 1'd1; +end + +assign cen24p = div8[0]; +assign cen24n = ~div8[0]; +assign cen12p = div8[0] & div8[1]; +assign cen12n = div8[0] & ~div8[1]; +assign cen6 = div8 == 0; + +reg [3:0] div12; + +always @(posedge W_CLK_48M) begin + div12 <= div12 + 1'd1; + if (div12 == 4'd11) begin + div12 <= 0; + end +end + +assign cen4p = div12 == 0; +assign cen4n = div12 == 6; + +reg [2:0] div8b; +reg [2:0] div5; +reg flip; + +always @(posedge W_CLK_48M) begin + if (flip) begin + div8b <= div8b + 1'd1; + if (div8b == 7) begin + flip <= 1'b0; + div5 <= 0; + end + end else begin + div5 <= div5 + 1'd1; + if (div5 == 4) begin + flip <= 1'b1; + div8b <= 0; + end + end +end + +assign cen11 = flip ? (div8b == 0 || div8b == 4) : (div5 == 0); + +//----------------- +// Video timing +//----------------- + + +wire [9:0]W_H_CNT; +wire [7:0]W_V_CNT; +wire [7:0]W_VF_CNT; +wire W_HBLANKn; +wire W_VBLANKn; +wire W_CBLANKn; +wire W_HSYNCn; +wire W_VSYNCn; +wire W_VCKn; + +mario_hv_generator hv +( + .I_CLK(W_CLK_48M), + .I_CEN(cen12n), + .I_RST_n(W_RESETn), + .I_VFLIP(W_FLIP_HV), + .H_CNT(W_H_CNT), + .V_CNT(W_V_CNT), // Not used + .VF_CNT(W_VF_CNT), + .H_BLANKn(W_HBLANKn), + .V_BLANKn(W_VBLANKn), + .C_BLANKn(W_CBLANKn), + .H_SYNCn(W_HSYNCn), + .V_SYNCn(W_VSYNCn), + .VCKn(W_VCKn) +); + +assign O_PIX = W_H_CNT[0]; + +assign O_HBLANK = ~W_HBLANKn; +assign O_VBLANK = ~W_VBLANKn; +assign O_VGA_HSYNCn = W_HSYNCn; +assign O_VGA_VSYNCn = W_VSYNCn; + +//----------------------------------------- +// Main CPU +// ROM, RAM, address decoding, inputs etc. +//----------------------------------------- + +wire [15:0]W_MCPU_A; +wire [7:0]ZDI; +wire [7:0]WI_D = ZDI; +wire W_MCPU_RDn; +wire W_MCPU_WRn; + +wire [9:0]W_DMAD_A; +wire [7:0]W_DMAD_D; +wire W_DMAD_CE; + +wire W_OBJ_RQn; +wire W_OBJ_RDn; +wire W_OBJ_WRn; +wire W_VRAM_RDn; +wire W_VRAM_WRn; + +wire [7:0]W_4C_Q; +wire [7:0]W_2L_Q; +wire [7:0]W_7M_Q; +wire [7:0]W_7J_Q; + +mario_main maincpu +( + .I_CLK_48M(I_CLK_48M), + .I_CEN_12M(cen12p), + .I_MCPU_CEN4Mp(cen4p), + .I_MCPU_CEN4Mn(cen4n), + .I_MCPU_RESETn(W_CPU_RESETn), + .I_VRAMBUSY_n(W_VRAMBUSYn), + .I_VBLK_n(W_VBLANKn), + .I_VRAM_DB(W_VRAM_DB), + .I_SW1(I_SW1), + .I_SW2(I_SW2), + .I_DIPSW(I_DIPSW), + .cpu_rom_addr(cpu_rom_addr), + .cpu_rom_do(cpu_rom_do), + .O_MCPU_A(W_MCPU_A), + .WI_D(ZDI), + .O_MCPU_RDn(W_MCPU_RDn), + .O_MCPU_WRn(W_MCPU_WRn), + .O_DMAD_A(W_DMAD_A), + .O_DMAD_D(W_DMAD_D), + .O_DMAD_CE(W_DMAD_CE), + .O_OBJ_RQn(W_OBJ_RQn), + .O_OBJ_RDn(W_OBJ_RDn), + .O_OBJ_WRn(W_OBJ_WRn), + .O_VRAM_RDn(W_VRAM_RDn), + .O_VRAM_WRn(W_VRAM_WRn), + .O_4C_Q(W_4C_Q), + .O_2L_Q(W_2L_Q), + .O_7M_Q(W_7M_Q), + .O_7J_Q(W_7J_Q) +); + +//------------------------------------ +// Video +// Background tiles, sprites, colours +//------------------------------------ + +wire W_VRAMBUSYn; +wire [7:0]W_VRAM_DB; +wire [7:0]W_OBJ_DB; +wire W_FLIP_HV; + +mario_video vid +( + .I_CLK_48M(I_CLK_48M), + .I_CEN_24Mp(cen24p), + .I_CEN_24Mn(cen24n), + .I_CEN_12M(cen12p), + .I_CEN_6M(cen6), + .I_RESETn(W_RESETn), + .I_CPU_A(W_MCPU_A[9:0]), + .I_CPU_D(WI_D), + + .I_VRAM_WRn(W_VRAM_WRn), + .I_VRAM_RDn(W_VRAM_RDn), + .I_2L_Q(W_2L_Q), + .I_VMOV(W_4C_Q[2]), + + .I_H_CNT(W_H_CNT), + .I_VF_CNT(W_VF_CNT), + .I_CBLANKn(W_CBLANKn), + .I_VBLKn(W_VBLANKn), + .I_VCKn(W_VCKn), + .I_OBJDMA_A(W_DMAD_A), + .I_OBJDMA_D(W_DMAD_D), + .I_OBJDMA_CE(W_DMAD_CE), + .bg_rom_addr(bg_rom_addr), + .bg_rom_do(bg_rom_do), + .O_VRAM_DB(W_VRAM_DB), + .O_VRAMBUSYn(W_VRAMBUSYn), + .O_FLIP_HV(W_FLIP_HV), + .O_OBJ_DB(W_OBJ_DB), // Not used + .O_VGA_RED(O_VGA_R), + .O_VGA_GRN(O_VGA_G), + .O_VGA_BLU(O_VGA_B) +); + + +//------- +// Sound +//------- + +mario_sound sound +( + .I_CLK_48M(I_CLK_48M), + .I_CEN_12M(cen12p), + .I_CEN_11M(cen11), + .I_RESETn(W_RESETn), + .I_SND_DATA(W_7J_Q), + .I_SND_CTRL({W_4C_Q[1:0],W_7M_Q}), + .I_ANLG_VOL(I_ANLG_VOL), + .I_H_CNT(W_H_CNT[3:0]), + .O_SND_DAT(O_SOUND_DAT) +); + + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/mario_video.v b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_video.v new file mode 100644 index 00000000..eeaedb4f --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_video.v @@ -0,0 +1,149 @@ +//---------------------------------------------------------------------------- +// Mario Bros Arcade +// +// Author: gaz68 (https://github.com/gaz68) June 2020 +// +// Top level video module. +//---------------------------------------------------------------------------- + +module mario_video +( + input I_CLK_48M, + input I_CEN_24Mp, + input I_CEN_24Mn, + input I_CEN_6M, + input I_CEN_12M, + input I_RESETn, + input [9:0]I_CPU_A, + input [7:0]I_CPU_D, + input I_VRAM_WRn, + input I_VRAM_RDn, + input [7:0]I_2L_Q, + input I_VMOV, + input [9:0]I_H_CNT, + input [7:0]I_VF_CNT, + input I_CBLANKn, + input I_VBLKn, + input I_VCKn, + input [9:0]I_OBJDMA_A, + input [7:0]I_OBJDMA_D, + input I_OBJDMA_CE, + output [7:0]O_VRAM_DB, + output O_VRAMBUSYn, + output O_FLIP_HV, + output [7:0]O_OBJ_DB, + output [2:0]O_VGA_RED, + output [2:0]O_VGA_GRN, + output [1:0]O_VGA_BLU, + output [15:0]bg_rom_addr, + input [15:0]bg_rom_do +); + +//------------------ +// VRAM +// Background tiles +//------------------ + +wire [3:0]W_VRAM_COL; +wire [1:0]W_VRAM_VID; +wire [7:0]W_VRAM_DB; +wire W_VRAMBUSYn; +wire W_TROMn = I_2L_Q[0]; + +mario_vram vram +( + .I_CLK_48M(I_CLK_48M), + .I_CEN_24Mp(I_CEN_24Mp), + .I_CEN_24Mn(I_CEN_24Mn), + .I_AB(I_CPU_A), + .I_DB(I_CPU_D), + .I_VRAM_WRn(I_VRAM_WRn), + .I_VRAM_RDn(I_VRAM_RDn), + .I_FLIP(W_FLIP_VRAM), + .I_H_CNT(I_H_CNT), + .I_CMPBLK(I_CBLANKn), + .I_VBLKn(I_VBLKn), + .I_VCKn(I_VCKn), + .I_GFXBANK(W_TROMn), + .I_VMOV(I_VMOV), + .O_DB(W_VRAM_DB), + .O_COL(W_VRAM_COL), + .O_VID(W_VRAM_VID), + .O_VRAMBUSYn(W_VRAMBUSYn), + .bg_rom_addr(bg_rom_addr), + .bg_rom_do(bg_rom_do) +); + +wire [6:0]W_VRAM_DAT = {W_VRAM_COL[3:0],1'b0,W_VRAM_VID[1:0]}; + +assign O_VRAM_DB = W_VRAM_DB; +assign O_VRAMBUSYn = W_VRAMBUSYn; + +//------------------- +// Objects / Sprites +//------------------- + +wire [6:0]W_OBJ_DAT; +wire W_FLIP_VRAM; +wire W_FLIP_HV; +wire W_FLIPn = ~I_2L_Q[2]; +wire W_2PSL = I_2L_Q[1]; +wire W_L_CMPBLKn; +wire [7:0]W_OBJ_DB; + +mario_obj sprites +( + .I_CLK_48M(I_CLK_48M), + .I_CEN_24Mp(I_CEN_24Mp), + .I_CEN_24Mn(I_CEN_24Mn), + .I_CEN_12M(I_CEN_12M), + .I_AB(), // Not used + .I_DB(/*W_2N_DO*/), // Not used + .I_OBJ_WRn(1'b1), // Not used + .I_OBJ_RDn(1'b1), // Not used + .I_OBJ_RQn(1'b1), // Not used + .I_2PSL(W_2PSL), + .I_FLIPn(W_FLIPn), + .I_CMPBLKn(I_CBLANKn), + .I_H_CNT(I_H_CNT), + .I_VF_CNT(I_VF_CNT), + .I_OBJ_DMA_A(I_OBJDMA_A), + .I_OBJ_DMA_D(I_OBJDMA_D), + .I_OBJ_DMA_CE(I_OBJDMA_CE), + .O_DB(W_OBJ_DB), // Not used + .O_OBJ_DO(W_OBJ_DAT), + .O_FLIP_VRAM(W_FLIP_VRAM), + .O_FLIP_HV(W_FLIP_HV), + .O_L_CMPBLKn(W_L_CMPBLKn) +); + +assign O_OBJ_DB = W_OBJ_DB; +assign O_FLIP_HV = W_FLIP_HV; + +//---------------- +// Colour Palette +//---------------- + +wire [2:0]W_R; +wire [2:0]W_G; +wire [1:0]W_B; + +mario_col_pal cpal +( + .I_CLK_48M(I_CLK_48M), + .I_CEN_24Mn(I_CEN_24Mn), + .I_CEN_6M(I_CEN_6M), + .I_VRAM_D(W_VRAM_DAT), + .I_OBJ_D(W_OBJ_DAT), + .I_CMPBLKn(W_L_CMPBLKn), + .I_CPAL_SEL(I_2L_Q[3]), + .O_R(W_R), + .O_G(W_G), + .O_B(W_B) +); + +assign O_VGA_RED = W_R; +assign O_VGA_GRN = W_G; +assign O_VGA_BLU = W_B; + +endmodule diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/mario_vram.v b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_vram.v new file mode 100644 index 00000000..a0e8c4de --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/mario_vram.v @@ -0,0 +1,233 @@ +//---------------------------------------------------------------------------- +// Mario Bros Arcade +// +// Author: gaz68 (https://github.com/gaz68) June 2020 +// +// Video RAM (background tiles) +// Based on the Donkey Kong version by Katsumi Degawa. +//---------------------------------------------------------------------------- + +//----------------------------------------------------------------------------------------- +// 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],H_CNT[9] +// 1/2 H 1 H 2 H 4H 8H 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 +//----------------------------------------------------------------------------------------- +// VF_CNT[0],VF_CNT[1],VF_CNT[2],VF_CNT[3],VF_CNT[4],VF_CNT[5],VF_CNT[6],VF_CNT[7] +// 1 VF 2 VF 4 VF 8 VF 16 VF 32 VF 64 VF 128 VF +//----------------------------------------------------------------------------------------- + +module mario_vram( + input I_CLK_48M, + input I_CEN_24Mp, + input I_CEN_24Mn, + input [9:0]I_AB, + input [7:0]I_DB, + input I_VRAM_WRn, + input I_VRAM_RDn, + input I_FLIP, + input [9:0]I_H_CNT, + input I_CMPBLK, + input I_VBLKn, + input I_VCKn, + input I_GFXBANK, + input I_VMOV, + + output [7:0]O_DB, + output reg [3:0]O_COL, + output [1:0]O_VID, + output O_VRAMBUSYn, + output [15:0]bg_rom_addr, + input [15:0]bg_rom_do +); + +//--------------------------------------------------- +// Vertical scroll register +// Used to make screen bounce when POW block is used +//--------------------------------------------------- + +reg [7:0]W_1E_Q; +reg [7:0]W_1AC_Q; +wire [7:0]W_1BD_Q = W_1E_Q[7:0]^{8{I_FLIP}}; + +always@(posedge I_CLK_48M) +begin + if (I_CEN_24Mn) begin + reg VCKnp, VBLKnp, VMOVp; + VCKnp <= I_VCKn; + VBLKnp <= I_VBLKn; + VMOVp <= I_VMOV; + + if(I_VMOV && !VMOVp) W_1E_Q <= I_DB; + + if(I_VBLKn && !VBLKnp) + W_1AC_Q <= W_1BD_Q; // Load + else + if(!VCKnp && I_VCKn) + W_1AC_Q <= W_1AC_Q + 8'd1; + end +end + + +wire [7:0]W_VF_CNT = W_1AC_Q[7:0]^{8{I_FLIP}}; + +//------------------------- +// VRAM +// 2 x 2114 @ 3D, 3E (1KB) +//------------------------- + +wire [7:0]WI_DB = I_VRAM_WRn ? 8'h00: I_DB; +wire [7:0]WO_DB; + +assign O_DB = I_VRAM_RDn ? 8'h00: WO_DB; + +wire [4:0]W_HF_CNT = I_H_CNT[8:4]^{I_FLIP,I_FLIP,I_FLIP,I_FLIP,I_FLIP}; +wire [9:0]W_CNT_AB = {W_VF_CNT[7:3],W_HF_CNT[4:0]}; +wire [9:0]W_VRAM_AB = I_CMPBLK ? W_CNT_AB : I_AB ; +wire W_VRAM_CS = I_CMPBLK ? 1'b0 : I_VRAM_WRn & I_VRAM_RDn; +wire W_2S4 = I_CMPBLK ? 1'b0 : 1'b1 ; + +ram_1024_8 U_3DE( + + .I_CLK(I_CLK_48M), + .I_ADDR(W_VRAM_AB), + .I_D(WI_DB), + .I_CE(~W_VRAM_CS), + .I_WE(~I_VRAM_WRn), + .O_D(WO_DB) + +); + +reg CLK_3K; + +// TCOL 0-2 connections to 3K are numbered +// in the wrong order on the schematics +reg [3:0]TCOL; + +always@(posedge I_CLK_48M) begin + if (I_CEN_24Mn) begin + reg CLK_3Kp, H_CNT0p; + + CLK_3K <= ~(I_H_CNT[1]&I_H_CNT[2]&I_H_CNT[3]); + CLK_3Kp <= CLK_3K; + + if (CLK_3Kp && !CLK_3K) TCOL <= {1'b1,WO_DB[7:5]}; + + // Fix for timing issue + H_CNT0p <= I_H_CNT[0]; + if (!H_CNT0p && I_H_CNT[0]) O_COL <= TCOL; + end +end + +//------------------- +// Video ROMs 3F, 3J +//------------------- + +wire [11:0]W_VROM_AB = {I_GFXBANK,WO_DB[7:0],W_VF_CNT[2:0]}; +wire [15:0]W_3FJ_DO; + +//VID_ROM roms3FJ(I_CLK_48M, W_VROM_AB, 1'b0, W_3FJ_DO, +// I_DLCLK, I_DLADDR, I_DLDATA, I_DLWR); + +gfx_3f gfx_3f( + .clk(I_CLK_48M), + .addr(W_VROM_AB), + .data(W_3FJ_DO[15:8]) +); + +gfx_3j gfx_3j( + .clk(I_CLK_48M), + .addr(W_VROM_AB), + .data(W_3FJ_DO[7:0]) +); + +//assign bg_rom_addr = W_VROM_AB; +//assign W_3FJ_DO = bg_rom_do; + +//------------------- +// Shift register 2H +//------------------- + +wire W_2H_Qa, W_2H_Qh; + +wire [1:0]C_2H = W_2K_Y[1:0]; +wire [7:0]W_2H = W_3FJ_DO[7:0]; +reg [7:0]reg_2H; + +assign W_2H_Qa = reg_2H[7]; +assign W_2H_Qh = reg_2H[0]; + +//------------------- +// Shift register 2J +//------------------- + +wire W_2J_Qa, W_2J_Qh; + +wire [1:0]C_2J = W_2K_Y[1:0]; +wire [7:0]W_2J = W_3FJ_DO[15:8]; +reg [7:0]reg_2J; + +assign W_2J_Qa = reg_2J[7]; +assign W_2J_Qh = reg_2J[0]; + +always@(posedge I_CLK_48M) begin + if (I_CEN_24Mp) begin + reg H_CNT0p; + H_CNT0p <= I_H_CNT[0]; + + if (!H_CNT0p && I_H_CNT[0]) begin + case(C_2H) + 2'b00: reg_2H <= reg_2H; + 2'b10: reg_2H <= {reg_2H[6:0],1'b0}; + 2'b01: reg_2H <= {1'b0,reg_2H[7:1]}; + 2'b11: reg_2H <= W_2H; + endcase + + case(C_2J) + 2'b00: reg_2J <= reg_2J; + 2'b10: reg_2J <= {reg_2J[6:0],1'b0}; + 2'b01: reg_2J <= {1'b0,reg_2J[7:1]}; + 2'b11: reg_2J <= W_2J; + endcase + end + end +end + +//--------- +// Part 2K +//--------- + +wire [3:0]W_2K_a,W_2K_b; +wire [3:0]W_2K_Y; + +assign W_2K_a = {W_2H_Qa,W_2J_Qa,1'b1,~(CLK_3K|W_2S4)}; +assign W_2K_b = {W_2H_Qh,W_2J_Qh,~(CLK_3K|W_2S4),1'b1}; +assign W_2K_Y = I_FLIP ? W_2K_b : W_2K_a; + +assign O_VID[0] = W_2K_Y[2]; +assign O_VID[1] = W_2K_Y[3]; + +//------------------ +// VRAM BUSY signal +//------------------ + +reg W_VRAMBUSY; + +always@(posedge I_CLK_48M) +begin + if (I_CEN_24Mp) begin + reg last_HCNT2; + last_HCNT2 <= I_H_CNT[2]; + + if(I_H_CNT[9] == 1'b0) + W_VRAMBUSY <= 1'b1; + else if (I_H_CNT[2] && !last_HCNT2) + W_VRAMBUSY <= I_H_CNT[4]&I_H_CNT[5]&I_H_CNT[6]&I_H_CNT[7]; + end +end + +assign O_VRAMBUSYn = ~W_VRAMBUSY; + + +endmodule diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/pll.qip b/Arcade_MiST/Nintendo Mario Bros/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/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_MiST/Nintendo Mario Bros/rtl/pll.v b/Arcade_MiST/Nintendo Mario Bros/rtl/pll.v new file mode 100644 index 00000000..db4af42f --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/pll.v @@ -0,0 +1,337 @@ +// 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, + locked); + + input inclk0; + output c0; + output c1; + output locked; + + 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 ( + .inclk (sub_wire5), + .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 = 9, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 32, + altpll_component.clk0_phase_shift = "0", + altpll_component.clk1_divide_by = 9, + altpll_component.clk1_duty_cycle = 50, + altpll_component.clk1_multiply_by = 16, + 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", + 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_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: DIV_FACTOR1 NUMERIC "9" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "96.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "48.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 "32" +// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "16" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "96.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "48.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 "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: 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 "9" +// 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 "9" +// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "16" +// 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_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: 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.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_MiST/Nintendo Mario Bros/rtl/rom/adec_5p.vhd b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/adec_5p.vhd new file mode 100644 index 00000000..5b6bf9bf --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/adec_5p.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity adec_5p 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 adec_5p is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"FE",X"FE",X"FE",X"FE",X"FD",X"FD",X"FD",X"FD",X"FB",X"FB",X"FB",X"FB",X"F7",X"F7",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"7F",X"7F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/rom/clut_4p.vhd b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/clut_4p.vhd new file mode 100644 index 00000000..79ff92c6 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/clut_4p.vhd @@ -0,0 +1,54 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity clut_4p is +port ( + clk : in std_logic; + addr : in std_logic_vector(8 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of clut_4p is + type rom is array(0 to 511) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"FF",X"D7",X"6B",X"00",X"1F",X"93",X"FB",X"FF",X"FF",X"E3",X"00",X"4F",X"00",X"FF",X"7F",X"FE", + X"FF",X"74",X"08",X"0F",X"00",X"FF",X"7F",X"FE",X"FF",X"1F",X"00",X"0F",X"00",X"FF",X"7F",X"FE", + X"FF",X"00",X"03",X"1F",X"7F",X"13",X"92",X"FE",X"FF",X"00",X"E0",X"F4",X"FE",X"EC",X"92",X"5F", + X"FF",X"00",X"08",X"1C",X"9E",X"5E",X"92",X"FE",X"FF",X"FC",X"E4",X"E3",X"F3",X"00",X"B2",X"DF", + X"FF",X"00",X"FE",X"FF",X"1C",X"1F",X"03",X"6C",X"FF",X"00",X"FE",X"FF",X"E3",X"E0",X"00",X"6C", + X"FF",X"FE",X"9B",X"0A",X"00",X"1F",X"13",X"FF",X"FF",X"E3",X"9B",X"0E",X"00",X"DF",X"BC",X"FF", + X"FF",X"1F",X"C8",X"00",X"FC",X"F1",X"EA",X"E3",X"FF",X"17",X"7F",X"00",X"FF",X"0F",X"1F",X"97", + X"FF",X"E8",X"FE",X"00",X"FF",X"6F",X"FC",X"7A",X"FF",X"07",X"B7",X"00",X"FF",X"BF",X"FC",X"7A", + X"FF",X"FE",X"9B",X"0A",X"00",X"1F",X"13",X"7A",X"FF",X"E3",X"9B",X"0E",X"00",X"DF",X"BC",X"FF", + X"FF",X"00",X"6E",X"92",X"DB",X"1F",X"9F",X"8E",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"BF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FF",X"FF", + X"FF",X"00",X"92",X"FE",X"DB",X"00",X"00",X"92",X"FF",X"FF",X"FF",X"FF",X"FF",X"EC",X"FF",X"FF", + X"FF",X"00",X"FE",X"FF",X"00",X"8C",X"F9",X"FE",X"FF",X"00",X"FE",X"FF",X"F7",X"00",X"F9",X"FE", + X"FF",X"A0",X"FE",X"FF",X"EF",X"F7",X"00",X"8C",X"FF",X"A0",X"FE",X"FF",X"83",X"EF",X"F7",X"00", + X"FF",X"0F",X"5F",X"FF",X"00",X"83",X"EF",X"F7",X"FF",X"0F",X"5F",X"FF",X"FE",X"00",X"83",X"EF", + X"FF",X"00",X"1E",X"FF",X"F9",X"FE",X"00",X"83",X"FF",X"00",X"1E",X"FF",X"8C",X"F9",X"FE",X"00", + X"00",X"28",X"94",X"FF",X"E0",X"6C",X"04",X"00",X"00",X"1C",X"FF",X"B0",X"FF",X"00",X"80",X"01", + X"00",X"8B",X"F7",X"F0",X"FF",X"00",X"80",X"01",X"00",X"E0",X"FF",X"F0",X"FF",X"00",X"80",X"01", + X"00",X"FF",X"FC",X"E0",X"80",X"EC",X"6D",X"01",X"00",X"FF",X"1F",X"0B",X"01",X"13",X"6D",X"A0", + X"00",X"FF",X"F7",X"E3",X"61",X"A1",X"6D",X"01",X"00",X"03",X"1B",X"1C",X"0C",X"FF",X"4D",X"20", + X"00",X"FF",X"01",X"00",X"E3",X"E0",X"FC",X"93",X"00",X"FF",X"01",X"00",X"1C",X"1F",X"FF",X"93", + X"00",X"01",X"64",X"F5",X"FF",X"E0",X"EC",X"00",X"00",X"1C",X"64",X"F1",X"FF",X"20",X"43",X"00", + X"00",X"E0",X"37",X"FF",X"03",X"0E",X"15",X"1C",X"00",X"E8",X"80",X"FF",X"00",X"F0",X"E0",X"68", + X"00",X"17",X"01",X"FF",X"00",X"90",X"03",X"85",X"00",X"F8",X"48",X"FF",X"00",X"40",X"03",X"85", + X"00",X"01",X"64",X"F5",X"FF",X"E0",X"EC",X"85",X"00",X"1C",X"64",X"F1",X"FF",X"20",X"43",X"00", + X"00",X"FF",X"91",X"6D",X"24",X"E0",X"60",X"71",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"40",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"6D",X"01",X"24",X"FF",X"FF",X"6D",X"00",X"00",X"00",X"00",X"00",X"13",X"00",X"00", + X"00",X"FF",X"01",X"00",X"FF",X"73",X"06",X"01",X"00",X"FF",X"01",X"00",X"08",X"FF",X"06",X"01", + X"00",X"5F",X"01",X"00",X"10",X"08",X"FF",X"73",X"00",X"5F",X"01",X"00",X"7C",X"10",X"08",X"FF", + X"00",X"F0",X"A0",X"00",X"FF",X"7C",X"10",X"08",X"00",X"F0",X"A0",X"00",X"01",X"FF",X"7C",X"10", + X"00",X"FF",X"E1",X"00",X"06",X"01",X"FF",X"7C",X"00",X"FF",X"E1",X"00",X"73",X"06",X"01",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_MiST/Nintendo Mario Bros/rtl/rom/gfx_3f.vhd b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/gfx_3f.vhd new file mode 100644 index 00000000..f044ace1 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/gfx_3f.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity gfx_3f 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 gfx_3f is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"1C",X"26",X"63",X"63",X"63",X"32",X"1C",X"00",X"7E",X"18",X"18",X"18",X"18",X"1C",X"18", + X"00",X"7F",X"07",X"1E",X"3C",X"70",X"63",X"3E",X"00",X"3E",X"63",X"60",X"3C",X"18",X"30",X"7E", + X"00",X"30",X"30",X"7F",X"33",X"36",X"3C",X"38",X"00",X"3E",X"63",X"60",X"60",X"3F",X"03",X"3F", + X"00",X"3E",X"63",X"63",X"3F",X"03",X"06",X"3C",X"00",X"0C",X"0C",X"0C",X"18",X"30",X"63",X"7F", + X"00",X"3E",X"61",X"61",X"1E",X"27",X"23",X"1E",X"00",X"1E",X"30",X"60",X"7E",X"63",X"63",X"3E", + X"00",X"00",X"00",X"00",X"00",X"24",X"36",X"36",X"00",X"00",X"00",X"00",X"3E",X"00",X"00",X"00", + X"00",X"38",X"1C",X"0E",X"07",X"0E",X"1C",X"38",X"00",X"00",X"00",X"3E",X"00",X"00",X"3E",X"00", + X"00",X"0E",X"1C",X"38",X"70",X"38",X"1C",X"0E",X"00",X"18",X"00",X"18",X"38",X"63",X"63",X"3E", + X"3C",X"42",X"99",X"A5",X"85",X"99",X"42",X"3C",X"00",X"63",X"63",X"7F",X"63",X"63",X"36",X"1C", + X"00",X"3F",X"63",X"63",X"3F",X"63",X"63",X"3F",X"00",X"3C",X"66",X"03",X"03",X"03",X"66",X"3C", + X"00",X"1F",X"33",X"63",X"63",X"63",X"33",X"1F",X"00",X"7F",X"03",X"03",X"3F",X"03",X"03",X"7F", + X"00",X"03",X"03",X"03",X"3F",X"03",X"03",X"7F",X"00",X"7C",X"66",X"63",X"73",X"03",X"06",X"7C", + X"00",X"63",X"63",X"63",X"7F",X"63",X"63",X"63",X"00",X"7E",X"18",X"18",X"18",X"18",X"18",X"7E", + X"00",X"3E",X"63",X"63",X"60",X"60",X"60",X"60",X"00",X"73",X"3B",X"1F",X"0F",X"1B",X"33",X"63", + X"00",X"7E",X"06",X"06",X"06",X"06",X"06",X"06",X"00",X"63",X"63",X"6B",X"7F",X"7F",X"77",X"63", + X"00",X"63",X"73",X"7B",X"7F",X"6F",X"67",X"63",X"00",X"3E",X"63",X"63",X"63",X"63",X"63",X"3E", + X"00",X"03",X"03",X"3F",X"63",X"63",X"63",X"3F",X"00",X"5E",X"33",X"7B",X"63",X"63",X"63",X"3E", + X"00",X"73",X"3B",X"1F",X"73",X"63",X"63",X"3F",X"00",X"3E",X"63",X"60",X"3E",X"03",X"33",X"1E", + X"00",X"18",X"18",X"18",X"18",X"18",X"18",X"7E",X"00",X"3E",X"63",X"63",X"63",X"63",X"63",X"63", + X"00",X"08",X"1C",X"3E",X"77",X"63",X"63",X"63",X"00",X"63",X"77",X"7F",X"7F",X"6B",X"63",X"63", + X"00",X"63",X"77",X"3E",X"1C",X"3C",X"77",X"63",X"00",X"18",X"18",X"18",X"3C",X"66",X"66",X"66", + X"00",X"7F",X"07",X"0E",X"1C",X"38",X"70",X"7F",X"00",X"08",X"06",X"06",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"02",X"04",X"08",X"10",X"20",X"00", + X"00",X"00",X"18",X"18",X"00",X"00",X"00",X"00",X"00",X"7E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"18",X"0C",X"0C",X"0C",X"0C",X"0C",X"18",X"00",X"0C",X"18",X"18",X"18",X"18",X"18",X"0C", + X"00",X"5E",X"46",X"46",X"CE",X"C6",X"C6",X"5E",X"00",X"3A",X"5B",X"5B",X"5B",X"5A",X"5A",X"3A", + X"00",X"96",X"D6",X"D6",X"CE",X"D6",X"D6",X"CE",X"00",X"39",X"5A",X"5A",X"3A",X"5A",X"5A",X"3A", + X"00",X"33",X"33",X"00",X"33",X"77",X"77",X"77",X"00",X"18",X"18",X"00",X"18",X"38",X"38",X"38", + X"00",X"00",X"22",X"14",X"08",X"14",X"22",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"20",X"30",X"30",X"00",X"54",X"54",X"54",X"54",X"54",X"40",X"28", + X"00",X"24",X"24",X"24",X"20",X"24",X"20",X"10",X"00",X"12",X"12",X"12",X"08",X"12",X"10",X"08", + X"00",X"41",X"91",X"91",X"91",X"91",X"81",X"41",X"00",X"00",X"00",X"00",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"EF",X"EF",X"FF",X"FF",X"EF",X"EF",X"FF",X"BC", + X"FB",X"FB",X"FB",X"FF",X"EF",X"FB",X"FF",X"EF",X"0E",X"1F",X"37",X"37",X"37",X"37",X"3F",X"1E", + X"00",X"00",X"F0",X"80",X"D8",X"A0",X"F8",X"E0",X"00",X"00",X"01",X"01",X"02",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"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"00",X"00",X"00",X"00",X"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"00",X"42",X"00",X"24",X"00",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"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"7C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"00",X"8E",X"93",X"93",X"93",X"93",X"93",X"93", + X"00",X"F1",X"99",X"99",X"D9",X"19",X"19",X"F1",X"00",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C", + X"00",X"00",X"F0",X"80",X"D8",X"A0",X"F8",X"E0",X"00",X"00",X"01",X"01",X"02",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"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"D3",X"D3",X"D3",X"8F",X"00",X"FE",X"FE",X"00",X"AA",X"AA",X"AA",X"A9",X"00",X"7F",X"7F",X"00", + X"00",X"FE",X"FE",X"00",X"81",X"C1",X"CF",X"D3",X"24",X"00",X"42",X"00",X"24",X"00",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"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"63",X"63",X"7F",X"63",X"63",X"36",X"1C",X"00",X"3F",X"63",X"63",X"3F",X"63",X"63",X"3F", + X"00",X"3C",X"66",X"03",X"03",X"03",X"66",X"3C",X"00",X"1F",X"33",X"63",X"63",X"63",X"33",X"1F", + X"00",X"7F",X"03",X"03",X"3F",X"03",X"03",X"7F",X"00",X"03",X"03",X"03",X"3F",X"03",X"03",X"7F", + X"00",X"7C",X"66",X"63",X"73",X"03",X"06",X"7C",X"00",X"63",X"63",X"63",X"7F",X"63",X"63",X"63", + X"00",X"7E",X"18",X"18",X"18",X"18",X"18",X"7E",X"00",X"3E",X"63",X"63",X"60",X"60",X"60",X"60", + X"00",X"73",X"3B",X"1F",X"0F",X"1B",X"33",X"63",X"00",X"7E",X"06",X"06",X"06",X"06",X"06",X"06", + X"00",X"63",X"63",X"6B",X"7F",X"7F",X"77",X"63",X"00",X"63",X"73",X"7B",X"7F",X"6F",X"67",X"63", + X"00",X"3E",X"63",X"63",X"63",X"63",X"63",X"3E",X"00",X"03",X"03",X"3F",X"63",X"63",X"63",X"3F", + X"00",X"5E",X"33",X"7B",X"63",X"63",X"63",X"3E",X"00",X"73",X"3B",X"1F",X"73",X"63",X"63",X"3F", + X"00",X"3E",X"63",X"60",X"3E",X"03",X"33",X"1E",X"00",X"18",X"18",X"18",X"18",X"18",X"18",X"7E", + X"00",X"3E",X"63",X"63",X"63",X"63",X"63",X"63",X"00",X"08",X"1C",X"3E",X"77",X"63",X"63",X"63", + X"00",X"63",X"77",X"7F",X"7F",X"6B",X"63",X"63",X"00",X"63",X"77",X"3E",X"1C",X"3C",X"77",X"63", + X"00",X"18",X"18",X"18",X"3C",X"66",X"66",X"66",X"00",X"7F",X"07",X"0E",X"1C",X"38",X"70",X"7F", + X"00",X"33",X"33",X"00",X"33",X"77",X"77",X"77",X"00",X"00",X"06",X"06",X"00",X"00",X"00",X"00", + X"F8",X"FC",X"FC",X"FC",X"FC",X"FC",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"1F", + X"FC",X"06",X"03",X"01",X"FF",X"FF",X"FE",X"FC",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF", + X"3F",X"60",X"C0",X"80",X"FF",X"FF",X"7F",X"3F",X"FF",X"00",X"00",X"3C",X"3C",X"3C",X"7E",X"FF", + X"FF",X"00",X"00",X"3C",X"3C",X"3C",X"7E",X"FF",X"FF",X"00",X"00",X"3C",X"3C",X"3C",X"7E",X"FF", + X"00",X"00",X"08",X"0E",X"00",X"00",X"80",X"E0",X"2C",X"6C",X"6C",X"EC",X"1C",X"00",X"00",X"00", + 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"00",X"00",X"00", + X"00",X"78",X"F0",X"C0",X"F0",X"F8",X"FC",X"FB",X"B7",X"7F",X"67",X"4E",X"4E",X"04",X"00",X"00", + X"00",X"00",X"08",X"0E",X"00",X"00",X"80",X"E0",X"2C",X"6C",X"6C",X"EC",X"1C",X"00",X"00",X"00", + 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"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"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"02",X"02",X"66",X"77",X"FF",X"FF",X"FF",X"FE",X"20",X"22",X"66",X"76",X"7F",X"FF",X"FF",X"FF", + X"40",X"40",X"66",X"EE",X"FF",X"FF",X"FF",X"7F",X"7F",X"01",X"03",X"07",X"0F",X"1F",X"3F",X"7F", + X"7F",X"01",X"03",X"07",X"0F",X"1F",X"3F",X"7F",X"7F",X"01",X"03",X"07",X"0F",X"1F",X"3F",X"7F", + X"FC",X"06",X"03",X"01",X"FF",X"FF",X"FE",X"FC",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF", + X"3F",X"60",X"C0",X"80",X"FF",X"FF",X"7F",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"7C",X"3F",X"F3",X"BD",X"FF",X"FF",X"C7",X"01", + X"00",X"18",X"18",X"18",X"3C",X"66",X"66",X"66",X"00",X"3E",X"63",X"63",X"63",X"63",X"63",X"3E", + X"00",X"3E",X"63",X"63",X"63",X"63",X"63",X"63",X"00",X"1F",X"33",X"63",X"63",X"63",X"33",X"1F", + X"00",X"7E",X"18",X"18",X"18",X"18",X"18",X"7E",X"00",X"18",X"18",X"18",X"18",X"18",X"18",X"7E", + X"00",X"73",X"3B",X"1F",X"0F",X"1B",X"33",X"63",X"00",X"7F",X"03",X"03",X"3F",X"03",X"03",X"7F", + X"00",X"03",X"03",X"3F",X"63",X"63",X"63",X"3F",X"00",X"7C",X"66",X"63",X"73",X"03",X"06",X"7C", + X"00",X"63",X"73",X"7B",X"7F",X"6F",X"67",X"63",X"00",X"3E",X"63",X"60",X"3E",X"03",X"33",X"1E", + X"00",X"63",X"63",X"63",X"7F",X"63",X"63",X"63",X"00",X"00",X"06",X"06",X"00",X"00",X"00",X"00", + X"00",X"33",X"33",X"00",X"33",X"77",X"77",X"77",X"00",X"18",X"18",X"00",X"18",X"38",X"38",X"38", + X"FC",X"06",X"03",X"01",X"FF",X"FF",X"FE",X"FC",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF", + X"3F",X"60",X"C0",X"80",X"FF",X"FF",X"7F",X"3F",X"00",X"00",X"77",X"77",X"77",X"77",X"77",X"77", + X"00",X"00",X"77",X"77",X"77",X"77",X"77",X"77",X"00",X"00",X"77",X"77",X"77",X"77",X"77",X"77", + X"00",X"03",X"03",X"3F",X"63",X"63",X"63",X"3F",X"00",X"7F",X"03",X"03",X"3F",X"03",X"03",X"7F", + X"00",X"73",X"3B",X"1F",X"73",X"63",X"63",X"3F",X"00",X"03",X"03",X"03",X"3F",X"03",X"03",X"7F", + X"00",X"3C",X"66",X"03",X"03",X"03",X"66",X"3C",X"00",X"18",X"18",X"18",X"18",X"18",X"18",X"7E", + X"00",X"03",X"03",X"3F",X"63",X"63",X"63",X"3F",X"00",X"18",X"18",X"18",X"18",X"18",X"18",X"7E", + X"00",X"3E",X"63",X"60",X"3E",X"03",X"33",X"1F",X"00",X"00",X"00",X"00",X"00",X"20",X"30",X"30", + X"00",X"1C",X"26",X"63",X"63",X"63",X"32",X"1C",X"00",X"7E",X"18",X"18",X"18",X"18",X"1C",X"18", + X"00",X"7F",X"07",X"1E",X"3C",X"70",X"63",X"3E",X"00",X"3E",X"63",X"60",X"3C",X"18",X"30",X"7E", + X"00",X"30",X"30",X"7F",X"33",X"36",X"3C",X"38",X"00",X"3E",X"63",X"60",X"60",X"3F",X"03",X"3F", + X"00",X"3E",X"63",X"63",X"3F",X"03",X"06",X"3C",X"00",X"0C",X"0C",X"0C",X"18",X"30",X"63",X"7F", + X"00",X"3E",X"61",X"61",X"1E",X"27",X"23",X"1E",X"00",X"1E",X"30",X"60",X"7E",X"63",X"63",X"3E", + X"00",X"03",X"03",X"03",X"3F",X"03",X"03",X"7F",X"00",X"63",X"63",X"7F",X"63",X"63",X"36",X"1C", + X"00",X"3C",X"66",X"03",X"03",X"03",X"66",X"3C",X"00",X"7F",X"03",X"03",X"3F",X"03",X"03",X"7F", + X"00",X"33",X"33",X"00",X"33",X"77",X"77",X"77",X"00",X"18",X"18",X"00",X"18",X"38",X"38",X"38", + X"00",X"1C",X"26",X"63",X"63",X"63",X"32",X"1C",X"00",X"7E",X"18",X"18",X"18",X"18",X"1C",X"18", + X"00",X"7F",X"07",X"1E",X"3C",X"70",X"63",X"3E",X"00",X"3E",X"63",X"60",X"3C",X"18",X"30",X"7E", + X"00",X"30",X"30",X"7F",X"33",X"36",X"3C",X"38",X"00",X"3E",X"63",X"60",X"60",X"3F",X"03",X"3F", + X"00",X"3E",X"63",X"63",X"3F",X"03",X"06",X"3C",X"00",X"0C",X"0C",X"0C",X"18",X"30",X"63",X"7F", + X"00",X"3E",X"61",X"61",X"1E",X"27",X"23",X"1E",X"00",X"1E",X"30",X"60",X"7E",X"63",X"63",X"3E", + X"00",X"00",X"00",X"00",X"00",X"24",X"36",X"36",X"00",X"00",X"00",X"00",X"3E",X"00",X"00",X"00", + X"00",X"38",X"1C",X"0E",X"07",X"0E",X"1C",X"38",X"00",X"00",X"00",X"3E",X"00",X"00",X"3E",X"00", + X"00",X"0E",X"1C",X"38",X"70",X"38",X"1C",X"0E",X"00",X"18",X"00",X"18",X"38",X"63",X"63",X"3E", + X"00",X"6E",X"31",X"39",X"4E",X"14",X"14",X"08",X"00",X"63",X"63",X"7F",X"63",X"63",X"36",X"1C", + X"00",X"3F",X"63",X"63",X"3F",X"63",X"63",X"3F",X"00",X"3C",X"66",X"03",X"03",X"03",X"66",X"3C", + X"00",X"1F",X"33",X"63",X"63",X"63",X"33",X"1F",X"00",X"7F",X"03",X"03",X"3F",X"03",X"03",X"7F", + X"00",X"03",X"03",X"03",X"3F",X"03",X"03",X"7F",X"00",X"7C",X"66",X"63",X"73",X"03",X"06",X"7C", + X"00",X"63",X"63",X"63",X"7F",X"63",X"63",X"63",X"00",X"7E",X"18",X"18",X"18",X"18",X"18",X"7E", + X"00",X"3E",X"63",X"63",X"60",X"60",X"60",X"60",X"00",X"73",X"3B",X"1F",X"0F",X"1B",X"33",X"63", + X"00",X"7E",X"06",X"06",X"06",X"06",X"06",X"06",X"00",X"63",X"63",X"6B",X"7F",X"7F",X"77",X"63", + X"00",X"63",X"73",X"7B",X"7F",X"6F",X"67",X"63",X"00",X"3E",X"63",X"63",X"63",X"63",X"63",X"3E", + X"00",X"03",X"03",X"3F",X"63",X"63",X"63",X"3F",X"00",X"5E",X"33",X"7B",X"63",X"63",X"63",X"3E", + X"00",X"73",X"3B",X"1F",X"73",X"63",X"63",X"3F",X"00",X"3E",X"63",X"60",X"3E",X"03",X"33",X"1E", + X"00",X"18",X"18",X"18",X"18",X"18",X"18",X"7E",X"00",X"3E",X"63",X"63",X"63",X"63",X"63",X"63", + X"00",X"08",X"1C",X"3E",X"77",X"63",X"63",X"63",X"00",X"63",X"77",X"7F",X"7F",X"6B",X"63",X"63", + X"00",X"63",X"77",X"3E",X"1C",X"3C",X"77",X"63",X"00",X"18",X"18",X"18",X"3C",X"66",X"66",X"66", + X"00",X"7F",X"07",X"0E",X"1C",X"38",X"70",X"7F",X"00",X"08",X"06",X"06",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"02",X"04",X"08",X"10",X"20",X"00", + X"00",X"00",X"18",X"18",X"00",X"00",X"00",X"00",X"00",X"7E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"18",X"0C",X"0C",X"0C",X"0C",X"0C",X"18",X"00",X"0C",X"18",X"18",X"18",X"18",X"18",X"0C", + X"00",X"5E",X"46",X"46",X"CE",X"C6",X"C6",X"5E",X"00",X"3A",X"5B",X"5B",X"5B",X"5A",X"5A",X"3A", + X"00",X"96",X"D6",X"D6",X"CE",X"D6",X"D6",X"CE",X"00",X"39",X"5A",X"5A",X"3A",X"5A",X"5A",X"3A", + X"00",X"33",X"33",X"00",X"33",X"77",X"77",X"77",X"00",X"18",X"18",X"00",X"18",X"38",X"38",X"38", + X"00",X"00",X"22",X"14",X"08",X"14",X"22",X"00",X"00",X"00",X"00",X"18",X"18",X"00",X"00",X"00", + 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"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"00",X"04",X"26",X"3C",X"66",X"3C",X"64",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"1C",X"26",X"63",X"63",X"63",X"32",X"1C",X"00",X"7E",X"18",X"18",X"18",X"18",X"1C",X"18", + X"00",X"7F",X"07",X"1E",X"3C",X"70",X"63",X"3E",X"00",X"3E",X"63",X"60",X"3C",X"18",X"30",X"7E", + X"00",X"30",X"30",X"7F",X"33",X"36",X"3C",X"38",X"00",X"3E",X"63",X"60",X"60",X"3F",X"03",X"3F", + X"00",X"3E",X"63",X"63",X"3F",X"03",X"06",X"3C",X"00",X"0C",X"0C",X"0C",X"18",X"30",X"63",X"7F", + X"00",X"3E",X"61",X"61",X"1E",X"27",X"23",X"1E",X"00",X"1E",X"30",X"60",X"7E",X"63",X"63",X"3E", + X"00",X"00",X"00",X"00",X"00",X"24",X"36",X"36",X"00",X"00",X"00",X"00",X"3E",X"00",X"00",X"00", + X"00",X"38",X"1C",X"0E",X"07",X"0E",X"1C",X"38",X"00",X"0E",X"1C",X"38",X"70",X"38",X"1C",X"0E", + X"00",X"0E",X"1C",X"38",X"70",X"38",X"1C",X"0E",X"00",X"18",X"00",X"18",X"38",X"63",X"63",X"3E", + X"00",X"6E",X"31",X"39",X"4E",X"14",X"14",X"08",X"00",X"63",X"63",X"7F",X"63",X"63",X"36",X"1C", + X"00",X"3F",X"63",X"63",X"3F",X"63",X"63",X"3F",X"00",X"3C",X"66",X"03",X"03",X"03",X"66",X"3C", + X"00",X"1F",X"33",X"63",X"63",X"63",X"33",X"1F",X"00",X"7F",X"03",X"03",X"3F",X"03",X"03",X"7F", + X"00",X"03",X"03",X"03",X"3F",X"03",X"03",X"7F",X"00",X"7C",X"66",X"63",X"73",X"03",X"06",X"7C", + X"00",X"63",X"63",X"63",X"7F",X"63",X"63",X"63",X"00",X"7E",X"18",X"18",X"18",X"18",X"18",X"7E", + X"00",X"3E",X"63",X"63",X"60",X"60",X"60",X"60",X"00",X"73",X"3B",X"1F",X"0F",X"1B",X"33",X"63", + X"00",X"7E",X"06",X"06",X"06",X"06",X"06",X"06",X"00",X"63",X"63",X"6B",X"7F",X"7F",X"77",X"63", + X"00",X"63",X"73",X"7B",X"7F",X"6F",X"67",X"63",X"00",X"3E",X"63",X"63",X"63",X"63",X"63",X"3E", + X"00",X"03",X"03",X"3F",X"63",X"63",X"63",X"3F",X"00",X"5E",X"33",X"7B",X"63",X"63",X"63",X"3E", + X"00",X"73",X"3B",X"1F",X"73",X"63",X"63",X"3F",X"00",X"3E",X"63",X"60",X"3E",X"03",X"33",X"1E", + X"00",X"18",X"18",X"18",X"18",X"18",X"18",X"7E",X"00",X"3E",X"63",X"63",X"63",X"63",X"63",X"63", + X"00",X"08",X"1C",X"3E",X"77",X"63",X"63",X"63",X"00",X"63",X"77",X"7F",X"7F",X"6B",X"63",X"63", + X"00",X"63",X"77",X"3E",X"1C",X"3C",X"77",X"63",X"00",X"18",X"18",X"18",X"3C",X"66",X"66",X"66", + X"00",X"7F",X"07",X"0E",X"1C",X"38",X"70",X"7F",X"00",X"08",X"06",X"06",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"02",X"04",X"08",X"10",X"20",X"00", + X"00",X"B6",X"B7",X"B7",X"B6",X"B6",X"06",X"36",X"00",X"7E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"18",X"0C",X"0C",X"0C",X"0C",X"0C",X"18",X"00",X"0C",X"18",X"18",X"18",X"18",X"18",X"0C", + X"00",X"5E",X"46",X"46",X"CE",X"C6",X"C6",X"5E",X"00",X"3A",X"5B",X"5B",X"5B",X"5A",X"5A",X"3A", + X"00",X"96",X"D6",X"D6",X"CE",X"D6",X"D6",X"CE",X"00",X"39",X"5A",X"5A",X"3A",X"5A",X"5A",X"3A", + X"00",X"33",X"33",X"00",X"33",X"77",X"77",X"77",X"00",X"18",X"18",X"00",X"18",X"38",X"38",X"38", + X"00",X"00",X"22",X"14",X"08",X"14",X"22",X"00",X"00",X"00",X"00",X"18",X"18",X"00",X"00",X"00", + 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"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"00",X"04",X"26",X"3C",X"66",X"3C",X"64",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"1C",X"26",X"63",X"63",X"63",X"32",X"1C",X"00",X"7E",X"18",X"18",X"18",X"18",X"1C",X"18", + X"00",X"7F",X"07",X"1E",X"3C",X"70",X"63",X"3E",X"00",X"3E",X"63",X"60",X"3C",X"18",X"30",X"7E", + X"00",X"30",X"30",X"7F",X"33",X"36",X"3C",X"38",X"00",X"3E",X"63",X"60",X"60",X"3F",X"03",X"3F", + X"00",X"3E",X"63",X"63",X"3F",X"03",X"06",X"3C",X"00",X"0C",X"0C",X"0C",X"18",X"30",X"63",X"7F", + X"00",X"3E",X"61",X"61",X"1E",X"27",X"23",X"1E",X"00",X"1E",X"30",X"60",X"7E",X"63",X"63",X"3E", + X"00",X"00",X"00",X"00",X"00",X"24",X"36",X"36",X"00",X"00",X"00",X"00",X"3E",X"00",X"00",X"00", + X"00",X"3E",X"41",X"5D",X"45",X"5D",X"41",X"3E",X"00",X"F6",X"06",X"06",X"E6",X"36",X"37",X"E6", + X"00",X"F1",X"9B",X"9B",X"F3",X"9B",X"9B",X"F1",X"00",X"78",X"CD",X"CD",X"60",X"C1",X"CC",X"78", + X"3C",X"42",X"99",X"A5",X"85",X"99",X"42",X"3C",X"00",X"63",X"63",X"7F",X"63",X"63",X"36",X"1C", + X"00",X"3F",X"63",X"63",X"3F",X"63",X"63",X"3F",X"00",X"3C",X"66",X"03",X"03",X"03",X"66",X"3C", + X"00",X"1F",X"33",X"63",X"63",X"63",X"33",X"1F",X"00",X"7F",X"03",X"03",X"3F",X"03",X"03",X"7F", + X"00",X"03",X"03",X"03",X"3F",X"03",X"03",X"7F",X"00",X"7C",X"66",X"63",X"73",X"03",X"06",X"7C", + X"00",X"63",X"63",X"63",X"7F",X"63",X"63",X"63",X"00",X"7E",X"18",X"18",X"18",X"18",X"18",X"7E", + X"00",X"3E",X"63",X"63",X"60",X"60",X"60",X"60",X"00",X"73",X"3B",X"1F",X"0F",X"1B",X"33",X"63", + X"00",X"7E",X"06",X"06",X"06",X"06",X"06",X"06",X"00",X"63",X"63",X"6B",X"7F",X"7F",X"77",X"63", + X"00",X"63",X"73",X"7B",X"7F",X"6F",X"67",X"63",X"00",X"3E",X"63",X"63",X"63",X"63",X"63",X"3E", + X"00",X"03",X"03",X"3F",X"63",X"63",X"63",X"3F",X"00",X"5E",X"33",X"7B",X"63",X"63",X"63",X"3E", + X"00",X"73",X"3B",X"1F",X"73",X"63",X"63",X"3F",X"00",X"3E",X"63",X"60",X"3E",X"03",X"33",X"1E", + X"00",X"18",X"18",X"18",X"18",X"18",X"18",X"7E",X"00",X"3E",X"63",X"63",X"63",X"63",X"63",X"63", + X"00",X"08",X"1C",X"3E",X"77",X"63",X"63",X"63",X"00",X"63",X"77",X"7F",X"7F",X"6B",X"63",X"63", + X"00",X"63",X"77",X"3E",X"1C",X"3C",X"77",X"63",X"00",X"18",X"18",X"18",X"3C",X"66",X"66",X"66", + X"00",X"7F",X"07",X"0E",X"1C",X"38",X"70",X"7F",X"00",X"08",X"06",X"06",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"30",X"30",X"B0",X"B0",X"F0",X"70",X"30", + X"00",X"B6",X"B7",X"B7",X"B6",X"B6",X"06",X"36",X"00",X"99",X"99",X"99",X"99",X"CF",X"80",X"00", + X"00",X"F1",X"19",X"F9",X"99",X"F3",X"01",X"00",X"00",X"CD",X"CC",X"CD",X"CD",X"7C",X"00",X"00", + X"00",X"7C",X"66",X"66",X"66",X"7C",X"60",X"60",X"00",X"1E",X"33",X"33",X"33",X"1E",X"00",X"00", + X"00",X"3C",X"66",X"66",X"66",X"3C",X"00",X"00",X"00",X"86",X"86",X"86",X"86",X"8F",X"06",X"0C", + X"00",X"D9",X"DF",X"DF",X"D9",X"D9",X"0F",X"06",X"00",X"9A",X"DA",X"DA",X"DA",X"8D",X"00",X"00", + X"00",X"6F",X"60",X"EF",X"EC",X"67",X"00",X"00",X"00",X"00",X"00",X"18",X"18",X"00",X"00",X"00", + X"00",X"98",X"D8",X"D8",X"DB",X"9B",X"00",X"18",X"00",X"C7",X"30",X"30",X"30",X"E7",X"00",X"00", + X"00",X"C6",X"C7",X"C3",X"C3",X"C3",X"C0",X"C0",X"00",X"66",X"66",X"66",X"66",X"3E",X"00",X"00", + X"00",X"5E",X"03",X"03",X"03",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"1C",X"26",X"63",X"63",X"63",X"32",X"1C",X"00",X"7E",X"18",X"18",X"18",X"18",X"1C",X"18", + X"00",X"7F",X"07",X"1E",X"3C",X"70",X"63",X"3E",X"00",X"3E",X"63",X"60",X"3C",X"18",X"30",X"7E", + X"00",X"30",X"30",X"7F",X"33",X"36",X"3C",X"38",X"00",X"3E",X"63",X"60",X"60",X"3F",X"03",X"3F", + X"00",X"3E",X"63",X"63",X"3F",X"03",X"06",X"3C",X"00",X"0C",X"0C",X"0C",X"18",X"30",X"63",X"7F", + X"00",X"3E",X"61",X"61",X"1E",X"27",X"23",X"1E",X"00",X"1E",X"30",X"60",X"7E",X"63",X"63",X"3E", + X"00",X"33",X"33",X"00",X"33",X"77",X"77",X"77",X"00",X"00",X"00",X"00",X"3E",X"00",X"00",X"00", + X"00",X"38",X"1C",X"0E",X"07",X"0E",X"1C",X"38",X"00",X"00",X"00",X"3E",X"00",X"00",X"3E",X"00", + X"00",X"0E",X"1C",X"38",X"70",X"38",X"1C",X"0E",X"00",X"18",X"00",X"18",X"38",X"63",X"63",X"3E", + X"3C",X"42",X"99",X"A5",X"85",X"99",X"42",X"3C",X"00",X"63",X"63",X"7F",X"63",X"63",X"36",X"1C", + X"00",X"3F",X"63",X"63",X"3F",X"63",X"63",X"3F",X"00",X"3C",X"66",X"03",X"03",X"03",X"66",X"3C", + X"00",X"1F",X"33",X"63",X"63",X"63",X"33",X"1F",X"00",X"7F",X"03",X"03",X"3F",X"03",X"03",X"7F", + X"00",X"03",X"03",X"03",X"3F",X"03",X"03",X"7F",X"00",X"7C",X"66",X"63",X"73",X"03",X"06",X"7C", + X"00",X"63",X"63",X"63",X"7F",X"63",X"63",X"63",X"00",X"7E",X"18",X"18",X"18",X"18",X"18",X"7E", + X"00",X"3E",X"63",X"63",X"60",X"60",X"60",X"60",X"00",X"73",X"3B",X"1F",X"0F",X"1B",X"33",X"63", + X"00",X"7E",X"06",X"06",X"06",X"06",X"06",X"06",X"00",X"63",X"63",X"6B",X"7F",X"7F",X"77",X"63", + X"00",X"63",X"73",X"7B",X"7F",X"6F",X"67",X"63",X"00",X"3E",X"63",X"63",X"63",X"63",X"63",X"3E", + X"00",X"03",X"03",X"3F",X"63",X"63",X"63",X"3F",X"00",X"5E",X"33",X"7B",X"63",X"63",X"63",X"3E", + X"00",X"73",X"3B",X"1F",X"73",X"63",X"63",X"3F",X"00",X"3E",X"63",X"60",X"3E",X"03",X"33",X"1E", + X"00",X"18",X"18",X"18",X"18",X"18",X"18",X"7E",X"00",X"3E",X"63",X"63",X"63",X"63",X"63",X"63", + X"00",X"08",X"1C",X"3E",X"77",X"63",X"63",X"63",X"00",X"63",X"77",X"7F",X"7F",X"6B",X"63",X"63", + X"00",X"63",X"77",X"3E",X"1C",X"3C",X"77",X"63",X"00",X"18",X"18",X"18",X"3C",X"66",X"66",X"66", + X"00",X"7F",X"07",X"0E",X"1C",X"38",X"70",X"7F",X"00",X"08",X"06",X"06",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"02",X"04",X"08",X"10",X"20",X"00", + X"00",X"00",X"18",X"18",X"00",X"00",X"00",X"00",X"00",X"7E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"18",X"0C",X"0C",X"0C",X"0C",X"0C",X"18",X"00",X"0C",X"18",X"18",X"18",X"18",X"18",X"0C", + X"00",X"5E",X"46",X"46",X"CE",X"C6",X"C6",X"5E",X"00",X"3A",X"5B",X"5B",X"5B",X"5A",X"5A",X"3A", + X"00",X"96",X"D6",X"D6",X"CE",X"D6",X"D6",X"CE",X"00",X"39",X"5A",X"5A",X"3A",X"5A",X"5A",X"3A", + X"00",X"33",X"33",X"00",X"33",X"77",X"77",X"77",X"00",X"00",X"00",X"00",X"00",X"20",X"30",X"30", + X"00",X"00",X"00",X"00",X"00",X"02",X"06",X"06",X"00",X"00",X"00",X"18",X"18",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"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_MiST/Nintendo Mario Bros/rtl/rom/gfx_3j.vhd b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/gfx_3j.vhd new file mode 100644 index 00000000..6d85a848 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/gfx_3j.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity gfx_3j 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 gfx_3j is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"3C",X"62",X"C8",X"84",X"84",X"94",X"4C",X"20",X"FE",X"80",X"20",X"20",X"20",X"24",X"20",X"20", + X"FF",X"80",X"38",X"60",X"C0",X"87",X"9C",X"40",X"7E",X"C1",X"84",X"9C",X"00",X"60",X"CE",X"80", + X"70",X"40",X"CF",X"80",X"4C",X"48",X"40",X"40",X"7E",X"C1",X"80",X"80",X"9F",X"00",X"7C",X"40", + X"7E",X"C1",X"84",X"9C",X"00",X"0C",X"78",X"40",X"1C",X"10",X"10",X"30",X"60",X"C7",X"9C",X"80", + X"7E",X"C1",X"82",X"86",X"61",X"48",X"5C",X"20",X"3E",X"60",X"C0",X"9E",X"81",X"84",X"9C",X"40", + X"00",X"00",X"00",X"00",X"6C",X"5A",X"48",X"48",X"00",X"00",X"00",X"7E",X"40",X"00",X"00",X"00", + X"78",X"40",X"20",X"10",X"18",X"30",X"60",X"40",X"00",X"00",X"7E",X"40",X"00",X"7E",X"40",X"00", + X"1E",X"30",X"60",X"C0",X"80",X"40",X"20",X"10",X"38",X"20",X"38",X"60",X"C7",X"84",X"9C",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E7",X"84",X"9C",X"80",X"84",X"8C",X"48",X"20", + X"7F",X"C0",X"84",X"9C",X"40",X"84",X"9C",X"40",X"7C",X"C2",X"89",X"04",X"04",X"EC",X"98",X"00", + X"3F",X"60",X"C4",X"84",X"84",X"94",X"4C",X"20",X"FF",X"80",X"04",X"7C",X"40",X"04",X"FC",X"80", + X"07",X"04",X"04",X"7C",X"40",X"04",X"FC",X"80",X"FC",X"82",X"89",X"94",X"84",X"04",X"F8",X"80", + X"E7",X"84",X"84",X"9C",X"80",X"84",X"84",X"84",X"FE",X"80",X"20",X"20",X"20",X"20",X"E6",X"80", + X"7E",X"C1",X"84",X"84",X"80",X"80",X"80",X"80",X"F7",X"84",X"04",X"00",X"30",X"64",X"C4",X"84", + X"FE",X"80",X"08",X"08",X"08",X"08",X"08",X"08",X"E7",X"84",X"9C",X"94",X"80",X"80",X"88",X"84", + X"E7",X"84",X"84",X"84",X"80",X"90",X"88",X"84",X"3E",X"41",X"84",X"84",X"84",X"84",X"9C",X"40", + X"07",X"04",X"7C",X"C0",X"84",X"84",X"9C",X"40",X"DE",X"A1",X"CC",X"84",X"84",X"84",X"9C",X"40", + X"F7",X"84",X"04",X"E0",X"84",X"84",X"9C",X"40",X"7E",X"C1",X"84",X"9E",X"41",X"74",X"4C",X"20", + X"38",X"20",X"20",X"20",X"20",X"20",X"E6",X"80",X"7E",X"C1",X"84",X"84",X"84",X"84",X"84",X"84", + X"18",X"30",X"60",X"C0",X"88",X"84",X"84",X"84",X"E7",X"8C",X"88",X"80",X"80",X"94",X"84",X"84", + X"E7",X"8C",X"88",X"00",X"60",X"C0",X"88",X"84",X"38",X"20",X"20",X"64",X"C2",X"88",X"88",X"88", + X"FF",X"80",X"18",X"30",X"60",X"C0",X"8F",X"80",X"18",X"16",X"08",X"08",X"00",X"00",X"00",X"00", + X"70",X"40",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"04",X"08",X"10",X"20",X"40",X"00", + X"00",X"38",X"20",X"20",X"00",X"00",X"00",X"00",X"FE",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"38",X"24",X"10",X"10",X"10",X"10",X"10",X"20",X"1C",X"30",X"20",X"20",X"20",X"20",X"24",X"10", + X"FE",X"A0",X"80",X"98",X"10",X"00",X"38",X"A0",X"3E",X"44",X"A4",X"A4",X"A4",X"A5",X"A5",X"44", + X"BE",X"68",X"28",X"28",X"10",X"28",X"28",X"10",X"7B",X"46",X"A5",X"A5",X"45",X"A5",X"A5",X"45", + X"77",X"44",X"44",X"33",X"C4",X"88",X"88",X"88",X"38",X"20",X"20",X"18",X"60",X"40",X"40",X"40", + X"00",X"62",X"44",X"28",X"10",X"28",X"44",X"00",X"00",X"00",X"38",X"20",X"20",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"60",X"50",X"40",X"40",X"00",X"2B",X"2B",X"2B",X"2B",X"2B",X"3F",X"16", + X"00",X"93",X"93",X"93",X"9F",X"93",X"9F",X"8E",X"00",X"C9",X"C9",X"C9",X"C7",X"C9",X"CF",X"C7", + X"00",X"38",X"4C",X"4C",X"4C",X"4C",X"7C",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"50",X"50",X"50",X"50",X"50",X"00",X"A0",X"EF",X"49",X"59",X"41",X"49",X"49",X"59",X"20", + X"FB",X"92",X"92",X"96",X"88",X"92",X"96",X"88",X"0E",X"11",X"24",X"24",X"24",X"24",X"2C",X"10", + X"00",X"00",X"F0",X"F0",X"F8",X"A0",X"00",X"00",X"00",X"00",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"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"00",X"00",X"00",X"00",X"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"24",X"24",X"42",X"42",X"24",X"24",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"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"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"FC",X"80",X"10",X"10",X"10",X"10",X"10",X"10",X"8E",X"11",X"20",X"20",X"20",X"20",X"20",X"20", + X"F3",X"0A",X"22",X"62",X"22",X"22",X"E2",X"02",X"1D",X"11",X"11",X"11",X"11",X"10",X"11",X"11", + X"00",X"00",X"F0",X"F0",X"F8",X"A0",X"00",X"00",X"00",X"00",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"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"D3",X"D3",X"D3",X"8F",X"00",X"01",X"01",X"FE",X"AA",X"AA",X"AA",X"A9",X"00",X"80",X"80",X"7F", + X"FE",X"01",X"01",X"00",X"81",X"C1",X"CF",X"D3",X"18",X"24",X"24",X"42",X"42",X"24",X"24",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"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"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"E7",X"84",X"9C",X"80",X"84",X"8C",X"48",X"20",X"7F",X"C0",X"84",X"9C",X"40",X"84",X"9C",X"40", + X"7C",X"C2",X"89",X"04",X"04",X"EC",X"98",X"00",X"3F",X"60",X"C4",X"84",X"84",X"94",X"4C",X"20", + X"FF",X"80",X"04",X"7C",X"40",X"04",X"FC",X"80",X"07",X"04",X"04",X"7C",X"40",X"04",X"FC",X"80", + X"FC",X"82",X"89",X"94",X"84",X"04",X"F8",X"80",X"E7",X"84",X"84",X"9C",X"80",X"84",X"84",X"84", + X"FE",X"80",X"20",X"20",X"20",X"20",X"E6",X"80",X"7E",X"C1",X"84",X"84",X"80",X"80",X"80",X"80", + X"F7",X"84",X"04",X"00",X"30",X"64",X"C4",X"84",X"FE",X"80",X"08",X"08",X"08",X"08",X"08",X"08", + X"E7",X"84",X"9C",X"94",X"80",X"80",X"88",X"84",X"E7",X"84",X"84",X"84",X"80",X"90",X"88",X"84", + X"3E",X"41",X"84",X"84",X"84",X"84",X"9C",X"40",X"07",X"04",X"7C",X"C0",X"84",X"84",X"9C",X"40", + X"DE",X"A1",X"CC",X"84",X"84",X"84",X"9C",X"40",X"F7",X"84",X"04",X"E0",X"84",X"84",X"9C",X"40", + X"7E",X"C1",X"84",X"9E",X"41",X"74",X"4C",X"20",X"38",X"20",X"20",X"20",X"20",X"20",X"E6",X"80", + X"7E",X"C1",X"84",X"84",X"84",X"84",X"84",X"84",X"18",X"30",X"60",X"C0",X"88",X"84",X"84",X"84", + X"E7",X"8C",X"88",X"80",X"80",X"94",X"84",X"84",X"E7",X"8C",X"88",X"00",X"60",X"C0",X"88",X"84", + X"38",X"20",X"20",X"64",X"C2",X"88",X"88",X"88",X"FF",X"80",X"18",X"30",X"60",X"C0",X"8F",X"80", + X"77",X"44",X"44",X"33",X"C4",X"88",X"88",X"88",X"00",X"0E",X"08",X"08",X"00",X"00",X"00",X"00", + X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"F0",X"00",X"00",X"E1",X"31",X"31",X"31",X"31",X"E7",X"00", + X"00",X"E3",X"E6",X"E6",X"E6",X"E6",X"E3",X"00",X"00",X"00",X"00",X"0F",X"1C",X"1C",X"0F",X"00", + X"00",X"E0",X"F0",X"00",X"06",X"F6",X"F0",X"00",X"00",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"07",X"0F",X"00",X"60",X"6F",X"0F",X"00",X"00",X"81",X"C3",X"C3",X"C3",X"FF",X"FF",X"00", + X"00",X"81",X"C3",X"C3",X"C3",X"FF",X"FF",X"00",X"00",X"81",X"C3",X"C3",X"C3",X"FF",X"FF",X"00", + X"00",X"EF",X"E7",X"E1",X"00",X"FE",X"7E",X"1E",X"2E",X"6E",X"6E",X"EE",X"1E",X"02",X"00",X"FF", + X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"1A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"C0",X"F8",X"F0",X"C0",X"F0",X"78",X"7C",X"7B",X"37",X"7F",X"65",X"46",X"46",X"04",X"00",X"00", + X"00",X"EF",X"E7",X"E1",X"00",X"FE",X"7E",X"1E",X"2E",X"6E",X"6E",X"EE",X"1E",X"02",X"00",X"FF", + X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"1A",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"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"FE",X"FE",X"BA",X"BB",X"77",X"FF",X"FF",X"FE",X"FF",X"FF",X"BB",X"BB",X"B7",X"7F",X"DD",X"EF", + X"7F",X"7F",X"7B",X"77",X"FF",X"FF",X"FF",X"7F",X"80",X"C0",X"E0",X"F0",X"E8",X"DC",X"BE",X"80", + X"80",X"C0",X"E0",X"F0",X"E8",X"DC",X"BE",X"80",X"80",X"C0",X"E0",X"F0",X"E8",X"DC",X"BE",X"80", + X"00",X"E0",X"F0",X"00",X"06",X"F6",X"F0",X"00",X"00",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"07",X"0F",X"00",X"60",X"6F",X"0F",X"00",X"FF",X"01",X"01",X"01",X"01",X"03",X"06",X"FC", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"80",X"80",X"80",X"80",X"C0",X"60",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"83",X"C0",X"0C",X"5E",X"82",X"00",X"78",X"00", + X"38",X"20",X"20",X"64",X"C2",X"88",X"88",X"88",X"3E",X"41",X"84",X"84",X"84",X"84",X"9C",X"40", + X"7E",X"C1",X"84",X"84",X"84",X"84",X"84",X"84",X"3F",X"60",X"C4",X"84",X"84",X"94",X"4C",X"20", + X"FE",X"80",X"20",X"20",X"20",X"20",X"E6",X"80",X"38",X"20",X"20",X"20",X"20",X"20",X"E6",X"80", + X"F7",X"84",X"04",X"00",X"30",X"64",X"C4",X"84",X"FF",X"80",X"04",X"7C",X"40",X"04",X"FC",X"80", + X"07",X"04",X"7C",X"C0",X"84",X"84",X"9C",X"40",X"FC",X"82",X"89",X"94",X"84",X"04",X"F8",X"80", + X"E7",X"84",X"84",X"84",X"80",X"90",X"88",X"84",X"7E",X"C1",X"84",X"9E",X"41",X"74",X"4C",X"20", + X"E7",X"84",X"84",X"9C",X"80",X"84",X"84",X"84",X"00",X"0E",X"08",X"08",X"00",X"00",X"00",X"00", + X"77",X"44",X"44",X"33",X"C4",X"88",X"88",X"88",X"38",X"20",X"20",X"18",X"60",X"40",X"40",X"40", + X"00",X"E0",X"F0",X"00",X"06",X"F6",X"F0",X"00",X"00",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"07",X"0F",X"00",X"60",X"6F",X"0F",X"00",X"77",X"77",X"00",X"88",X"88",X"00",X"77",X"77", + X"77",X"77",X"00",X"88",X"88",X"00",X"77",X"77",X"77",X"77",X"00",X"08",X"08",X"00",X"77",X"77", + X"07",X"04",X"7C",X"C0",X"84",X"84",X"9C",X"40",X"FF",X"80",X"04",X"7C",X"40",X"04",X"FC",X"80", + X"F7",X"84",X"04",X"E0",X"84",X"84",X"9C",X"40",X"07",X"04",X"04",X"7C",X"40",X"04",X"FC",X"80", + X"7C",X"C0",X"88",X"04",X"04",X"EC",X"98",X"00",X"38",X"20",X"20",X"20",X"20",X"20",X"E6",X"80", + X"07",X"04",X"7C",X"C0",X"84",X"84",X"9C",X"40",X"38",X"20",X"20",X"20",X"20",X"20",X"E6",X"80", + X"7E",X"C0",X"84",X"9E",X"40",X"74",X"4C",X"20",X"00",X"00",X"00",X"00",X"60",X"50",X"40",X"40", + X"3C",X"62",X"C8",X"84",X"84",X"94",X"4C",X"20",X"FE",X"80",X"20",X"20",X"20",X"24",X"20",X"20", + X"FF",X"80",X"38",X"60",X"C0",X"87",X"9C",X"40",X"7E",X"C0",X"84",X"9C",X"00",X"60",X"CE",X"80", + X"70",X"40",X"CF",X"80",X"4C",X"48",X"40",X"40",X"7E",X"C0",X"80",X"80",X"9F",X"00",X"7C",X"40", + X"7E",X"C0",X"84",X"9C",X"00",X"0C",X"78",X"40",X"1C",X"10",X"10",X"30",X"60",X"C7",X"9C",X"80", + X"7E",X"C0",X"82",X"86",X"60",X"48",X"5C",X"20",X"3E",X"60",X"C0",X"9E",X"80",X"84",X"9C",X"40", + X"07",X"04",X"04",X"7C",X"40",X"04",X"FC",X"80",X"E7",X"84",X"9C",X"80",X"84",X"8C",X"48",X"20", + X"7C",X"C0",X"88",X"04",X"04",X"EC",X"98",X"00",X"FF",X"80",X"04",X"7C",X"40",X"04",X"FC",X"80", + X"77",X"44",X"44",X"33",X"C4",X"88",X"88",X"88",X"38",X"20",X"20",X"18",X"60",X"40",X"40",X"40", + X"3C",X"62",X"C8",X"84",X"84",X"94",X"4C",X"20",X"FE",X"80",X"20",X"20",X"20",X"24",X"20",X"20", + X"FF",X"80",X"38",X"60",X"C0",X"87",X"9C",X"40",X"7E",X"C1",X"84",X"9C",X"00",X"60",X"CE",X"80", + X"70",X"40",X"CF",X"80",X"4C",X"48",X"40",X"40",X"7E",X"C1",X"80",X"80",X"9F",X"00",X"7C",X"40", + X"7E",X"C1",X"84",X"9C",X"00",X"0C",X"78",X"40",X"1C",X"10",X"10",X"30",X"60",X"C7",X"9C",X"80", + X"7E",X"C1",X"82",X"86",X"61",X"48",X"5C",X"20",X"3E",X"60",X"C0",X"9E",X"81",X"84",X"9C",X"40", + X"00",X"00",X"00",X"00",X"6C",X"5A",X"48",X"48",X"00",X"00",X"00",X"7E",X"40",X"00",X"00",X"00", + X"78",X"40",X"20",X"10",X"18",X"30",X"60",X"40",X"00",X"00",X"7E",X"40",X"00",X"7E",X"40",X"00", + X"1E",X"30",X"60",X"C0",X"80",X"40",X"20",X"10",X"38",X"20",X"38",X"60",X"C7",X"84",X"9C",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E7",X"84",X"9C",X"80",X"84",X"8C",X"48",X"20", + X"7F",X"C0",X"84",X"9C",X"40",X"84",X"9C",X"40",X"7C",X"C2",X"89",X"04",X"04",X"EC",X"98",X"00", + X"3F",X"60",X"C4",X"84",X"84",X"94",X"4C",X"20",X"FF",X"80",X"04",X"7C",X"40",X"04",X"FC",X"80", + X"07",X"04",X"04",X"7C",X"40",X"04",X"FC",X"80",X"FC",X"82",X"89",X"94",X"84",X"04",X"F8",X"80", + X"E7",X"84",X"84",X"9C",X"80",X"84",X"84",X"84",X"FE",X"80",X"20",X"20",X"20",X"20",X"E6",X"80", + X"7E",X"C1",X"84",X"84",X"80",X"80",X"80",X"80",X"F7",X"84",X"04",X"00",X"30",X"64",X"C4",X"84", + X"FE",X"80",X"08",X"08",X"08",X"08",X"08",X"08",X"E7",X"84",X"9C",X"94",X"80",X"80",X"88",X"84", + X"E7",X"84",X"84",X"84",X"80",X"90",X"88",X"84",X"3E",X"41",X"84",X"84",X"84",X"84",X"9C",X"40", + X"07",X"04",X"7C",X"C0",X"84",X"84",X"9C",X"40",X"DE",X"A1",X"CC",X"84",X"84",X"84",X"9C",X"40", + X"F7",X"84",X"04",X"E0",X"84",X"84",X"9C",X"40",X"7E",X"C1",X"84",X"9E",X"41",X"74",X"4C",X"20", + X"38",X"20",X"20",X"20",X"20",X"20",X"E6",X"80",X"7E",X"C1",X"84",X"84",X"84",X"84",X"84",X"84", + X"18",X"30",X"60",X"C0",X"88",X"84",X"84",X"84",X"E7",X"8C",X"88",X"80",X"80",X"94",X"84",X"84", + X"E7",X"8C",X"88",X"00",X"60",X"C0",X"88",X"84",X"38",X"20",X"20",X"64",X"C2",X"88",X"88",X"88", + X"FF",X"80",X"18",X"30",X"60",X"C0",X"8F",X"80",X"18",X"16",X"08",X"08",X"00",X"00",X"00",X"00", + X"70",X"40",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"04",X"08",X"10",X"20",X"40",X"00", + X"00",X"38",X"20",X"20",X"00",X"00",X"00",X"00",X"FE",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"38",X"24",X"10",X"10",X"10",X"10",X"10",X"20",X"1C",X"30",X"20",X"20",X"20",X"20",X"24",X"10", + X"FE",X"A0",X"80",X"98",X"10",X"00",X"38",X"A0",X"3E",X"44",X"A4",X"A4",X"A4",X"A5",X"A5",X"44", + X"BE",X"68",X"28",X"28",X"10",X"28",X"28",X"10",X"7B",X"46",X"A5",X"A5",X"45",X"A5",X"A5",X"45", + X"77",X"44",X"44",X"33",X"C4",X"88",X"88",X"88",X"38",X"20",X"20",X"18",X"60",X"40",X"40",X"40", + X"00",X"62",X"44",X"28",X"10",X"28",X"44",X"00",X"00",X"00",X"38",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"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"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"62",X"C8",X"84",X"84",X"94",X"4C",X"20",X"FE",X"80",X"20",X"20",X"20",X"24",X"20",X"20", + X"FF",X"80",X"38",X"60",X"C0",X"87",X"9C",X"40",X"7E",X"C1",X"84",X"9C",X"00",X"60",X"CE",X"80", + X"70",X"40",X"CF",X"80",X"4C",X"48",X"40",X"40",X"7E",X"C1",X"80",X"80",X"9F",X"00",X"7C",X"40", + X"7E",X"C1",X"84",X"9C",X"00",X"0C",X"78",X"40",X"1C",X"10",X"10",X"30",X"60",X"C7",X"9C",X"80", + X"7E",X"C1",X"82",X"86",X"61",X"48",X"5C",X"20",X"3E",X"60",X"C0",X"9E",X"81",X"84",X"9C",X"40", + X"00",X"00",X"00",X"00",X"6C",X"5A",X"48",X"48",X"00",X"00",X"00",X"7E",X"40",X"00",X"00",X"00", + X"78",X"40",X"20",X"10",X"18",X"30",X"60",X"40",X"1E",X"30",X"60",X"C0",X"80",X"40",X"20",X"10", + X"1E",X"30",X"60",X"C0",X"80",X"40",X"20",X"10",X"38",X"20",X"38",X"60",X"C7",X"84",X"9C",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E7",X"84",X"9C",X"80",X"84",X"8C",X"48",X"20", + X"7F",X"C0",X"84",X"9C",X"40",X"84",X"9C",X"40",X"7C",X"C2",X"89",X"04",X"04",X"EC",X"98",X"00", + X"3F",X"60",X"C4",X"84",X"84",X"94",X"4C",X"20",X"FF",X"80",X"04",X"7C",X"40",X"04",X"FC",X"80", + X"07",X"04",X"04",X"7C",X"40",X"04",X"FC",X"80",X"FC",X"82",X"89",X"94",X"84",X"04",X"F8",X"80", + X"E7",X"84",X"84",X"9C",X"80",X"84",X"84",X"84",X"FE",X"80",X"20",X"20",X"20",X"20",X"E6",X"80", + X"7E",X"C1",X"84",X"84",X"80",X"80",X"80",X"80",X"F7",X"84",X"04",X"00",X"30",X"64",X"C4",X"84", + X"FE",X"80",X"08",X"08",X"08",X"08",X"08",X"08",X"E7",X"84",X"9C",X"94",X"80",X"80",X"88",X"84", + X"E7",X"84",X"84",X"84",X"80",X"90",X"88",X"84",X"3E",X"41",X"84",X"84",X"84",X"84",X"9C",X"40", + X"07",X"04",X"7C",X"C0",X"84",X"84",X"9C",X"40",X"DE",X"A1",X"CC",X"84",X"84",X"84",X"9C",X"40", + X"F7",X"84",X"04",X"E0",X"84",X"84",X"9C",X"40",X"7E",X"C1",X"84",X"9E",X"41",X"74",X"4C",X"20", + X"38",X"20",X"20",X"20",X"20",X"20",X"E6",X"80",X"7E",X"C1",X"84",X"84",X"84",X"84",X"84",X"84", + X"18",X"30",X"60",X"C0",X"88",X"84",X"84",X"84",X"E7",X"8C",X"88",X"80",X"80",X"94",X"84",X"84", + X"E7",X"8C",X"88",X"00",X"60",X"C0",X"88",X"84",X"38",X"20",X"20",X"64",X"C2",X"88",X"88",X"88", + X"FF",X"80",X"18",X"30",X"60",X"C0",X"8F",X"80",X"18",X"16",X"08",X"08",X"00",X"00",X"00",X"00", + X"70",X"40",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"04",X"08",X"10",X"20",X"40",X"00", + X"FE",X"48",X"48",X"48",X"49",X"48",X"78",X"48",X"FE",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"38",X"24",X"10",X"10",X"10",X"10",X"10",X"20",X"1C",X"30",X"20",X"20",X"20",X"20",X"24",X"10", + X"FE",X"A0",X"80",X"98",X"10",X"00",X"38",X"A0",X"3E",X"44",X"A4",X"A4",X"A4",X"A5",X"A5",X"44", + X"BE",X"68",X"28",X"28",X"10",X"28",X"28",X"10",X"7B",X"46",X"A5",X"A5",X"45",X"A5",X"A5",X"45", + X"77",X"44",X"44",X"33",X"C4",X"88",X"88",X"88",X"38",X"20",X"20",X"18",X"60",X"40",X"40",X"40", + X"00",X"62",X"44",X"28",X"10",X"28",X"44",X"00",X"00",X"00",X"38",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"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"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"62",X"C8",X"84",X"84",X"94",X"4C",X"20",X"FE",X"80",X"20",X"20",X"20",X"24",X"20",X"20", + X"FF",X"80",X"38",X"60",X"C0",X"87",X"9C",X"40",X"7E",X"C1",X"84",X"9C",X"00",X"60",X"CE",X"80", + X"70",X"40",X"CF",X"80",X"4C",X"48",X"40",X"40",X"7E",X"C1",X"80",X"80",X"9F",X"00",X"7C",X"40", + X"7E",X"C1",X"84",X"9C",X"00",X"0C",X"78",X"40",X"1C",X"10",X"10",X"30",X"60",X"C7",X"9C",X"80", + X"7E",X"C1",X"82",X"86",X"61",X"48",X"5C",X"20",X"3E",X"60",X"C0",X"9E",X"81",X"84",X"9C",X"40", + X"00",X"00",X"00",X"00",X"6C",X"5A",X"48",X"48",X"00",X"00",X"00",X"7E",X"40",X"00",X"00",X"00", + X"3E",X"41",X"BE",X"A2",X"BA",X"A2",X"BE",X"40",X"FE",X"08",X"08",X"F8",X"18",X"49",X"C8",X"08", + X"F1",X"0A",X"24",X"64",X"0C",X"24",X"64",X"02",X"78",X"85",X"12",X"32",X"81",X"1E",X"33",X"81", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E7",X"84",X"9C",X"80",X"84",X"8C",X"48",X"20", + X"7F",X"C0",X"84",X"9C",X"40",X"84",X"9C",X"40",X"7C",X"C2",X"89",X"04",X"04",X"EC",X"98",X"00", + X"3F",X"60",X"C4",X"84",X"84",X"94",X"4C",X"20",X"FF",X"80",X"04",X"7C",X"40",X"04",X"FC",X"80", + X"07",X"04",X"04",X"7C",X"40",X"04",X"FC",X"80",X"FC",X"82",X"89",X"94",X"84",X"04",X"F8",X"80", + X"E7",X"84",X"84",X"9C",X"80",X"84",X"84",X"84",X"FE",X"80",X"20",X"20",X"20",X"20",X"E6",X"80", + X"7E",X"C1",X"84",X"84",X"80",X"80",X"80",X"80",X"F7",X"84",X"04",X"00",X"30",X"64",X"C4",X"84", + X"FE",X"80",X"08",X"08",X"08",X"08",X"08",X"08",X"E7",X"84",X"9C",X"94",X"80",X"80",X"88",X"84", + X"E7",X"84",X"84",X"84",X"80",X"90",X"88",X"84",X"3E",X"41",X"84",X"84",X"84",X"84",X"9C",X"40", + X"07",X"04",X"7C",X"C0",X"84",X"84",X"9C",X"40",X"DE",X"A1",X"CC",X"84",X"84",X"84",X"9C",X"40", + X"F7",X"84",X"04",X"E0",X"84",X"84",X"9C",X"40",X"7E",X"C1",X"84",X"9E",X"41",X"74",X"4C",X"20", + X"38",X"20",X"20",X"20",X"20",X"20",X"E6",X"80",X"7E",X"C1",X"84",X"84",X"84",X"84",X"84",X"84", + X"18",X"30",X"60",X"C0",X"88",X"84",X"84",X"84",X"E7",X"8C",X"88",X"80",X"80",X"94",X"84",X"84", + X"E7",X"8C",X"88",X"00",X"60",X"C0",X"88",X"84",X"38",X"20",X"20",X"64",X"C2",X"88",X"88",X"88", + X"FF",X"80",X"18",X"30",X"60",X"C0",X"8F",X"80",X"18",X"16",X"08",X"08",X"00",X"00",X"00",X"00", + X"70",X"40",X"40",X"00",X"00",X"00",X"00",X"00",X"70",X"40",X"41",X"41",X"40",X"01",X"81",X"40", + X"FE",X"48",X"48",X"48",X"49",X"48",X"78",X"48",X"BB",X"22",X"22",X"22",X"66",X"10",X"00",X"00", + X"F3",X"0A",X"E2",X"02",X"66",X"04",X"00",X"00",X"DF",X"12",X"13",X"12",X"32",X"80",X"00",X"00", + X"FD",X"83",X"89",X"89",X"99",X"80",X"80",X"80",X"1E",X"21",X"44",X"44",X"4C",X"20",X"00",X"00", + X"3C",X"42",X"88",X"88",X"98",X"40",X"00",X"00",X"8E",X"08",X"08",X"08",X"19",X"10",X"08",X"10", + X"FB",X"26",X"20",X"20",X"22",X"26",X"10",X"08",X"BF",X"65",X"25",X"25",X"25",X"12",X"00",X"00", + X"FF",X"90",X"9F",X"10",X"13",X"88",X"00",X"00",X"00",X"00",X"38",X"20",X"20",X"00",X"00",X"00", + X"B8",X"60",X"20",X"27",X"24",X"24",X"38",X"20",X"EF",X"38",X"41",X"41",X"CF",X"08",X"00",X"00", + X"CF",X"09",X"08",X"04",X"04",X"04",X"00",X"00",X"EF",X"89",X"89",X"89",X"99",X"41",X"01",X"01", + X"FE",X"A1",X"04",X"04",X"3C",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3C",X"62",X"C8",X"84",X"84",X"94",X"4C",X"20",X"FE",X"80",X"20",X"20",X"20",X"24",X"20",X"20", + X"FF",X"80",X"38",X"60",X"C0",X"87",X"9C",X"40",X"7E",X"C1",X"84",X"9C",X"00",X"60",X"CE",X"80", + X"70",X"40",X"CF",X"80",X"4C",X"48",X"40",X"40",X"7E",X"C1",X"80",X"80",X"9F",X"00",X"7C",X"40", + X"7E",X"C1",X"84",X"9C",X"00",X"0C",X"78",X"40",X"1C",X"10",X"10",X"30",X"60",X"C7",X"9C",X"80", + X"7E",X"C1",X"82",X"86",X"61",X"48",X"5C",X"20",X"3E",X"60",X"C0",X"9E",X"81",X"84",X"9C",X"40", + X"77",X"44",X"44",X"33",X"C4",X"88",X"88",X"88",X"00",X"00",X"00",X"7E",X"40",X"00",X"00",X"00", + X"78",X"40",X"20",X"10",X"18",X"30",X"60",X"40",X"00",X"00",X"7E",X"40",X"00",X"7E",X"40",X"00", + X"1E",X"30",X"60",X"C0",X"80",X"40",X"20",X"10",X"38",X"20",X"38",X"60",X"C7",X"84",X"9C",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E7",X"84",X"9C",X"80",X"84",X"8C",X"48",X"20", + X"7F",X"C0",X"84",X"9C",X"40",X"84",X"9C",X"40",X"7C",X"C2",X"89",X"04",X"04",X"EC",X"98",X"00", + X"3F",X"60",X"C4",X"84",X"84",X"94",X"4C",X"20",X"FF",X"80",X"04",X"7C",X"40",X"04",X"FC",X"80", + X"07",X"04",X"04",X"7C",X"40",X"04",X"FC",X"80",X"FC",X"82",X"89",X"94",X"84",X"04",X"F8",X"80", + X"E7",X"84",X"84",X"9C",X"80",X"84",X"84",X"84",X"FE",X"80",X"20",X"20",X"20",X"20",X"E6",X"80", + X"7E",X"C1",X"84",X"84",X"80",X"80",X"80",X"80",X"F7",X"84",X"04",X"00",X"30",X"64",X"C4",X"84", + X"FE",X"80",X"08",X"08",X"08",X"08",X"08",X"08",X"E7",X"84",X"9C",X"94",X"80",X"80",X"88",X"84", + X"E7",X"84",X"84",X"84",X"80",X"90",X"88",X"84",X"3E",X"41",X"84",X"84",X"84",X"84",X"9C",X"40", + X"07",X"04",X"7C",X"C0",X"84",X"84",X"9C",X"40",X"DE",X"A1",X"CC",X"84",X"84",X"84",X"9C",X"40", + X"F7",X"84",X"04",X"E0",X"84",X"84",X"9C",X"40",X"7E",X"C1",X"84",X"9E",X"41",X"74",X"4C",X"20", + X"38",X"20",X"20",X"20",X"20",X"20",X"E6",X"80",X"7E",X"C1",X"84",X"84",X"84",X"84",X"84",X"84", + X"18",X"30",X"60",X"C0",X"88",X"84",X"84",X"84",X"E7",X"8C",X"88",X"80",X"80",X"94",X"84",X"84", + X"E7",X"8C",X"88",X"00",X"60",X"C0",X"88",X"84",X"38",X"20",X"20",X"64",X"C2",X"88",X"88",X"88", + X"FF",X"80",X"18",X"30",X"60",X"C0",X"8F",X"80",X"18",X"16",X"08",X"08",X"00",X"00",X"00",X"00", + X"70",X"40",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"04",X"08",X"10",X"20",X"40",X"00", + X"00",X"38",X"20",X"20",X"00",X"00",X"00",X"00",X"FE",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"38",X"24",X"10",X"10",X"10",X"10",X"10",X"20",X"1C",X"30",X"20",X"20",X"20",X"20",X"24",X"10", + X"FE",X"A0",X"80",X"98",X"10",X"00",X"38",X"A0",X"3E",X"44",X"A4",X"A4",X"A4",X"A5",X"A5",X"44", + X"BE",X"68",X"28",X"28",X"10",X"28",X"28",X"10",X"7B",X"46",X"A5",X"A5",X"45",X"A5",X"A5",X"45", + X"77",X"44",X"44",X"33",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"38",X"20",X"20",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"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_MiST/Nintendo Mario Bros/rtl/rom/obj_7m.vhd b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7m.vhd new file mode 100644 index 00000000..7d3bd15e --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7m.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity obj_7m 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 obj_7m 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"0D",X"00",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"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"1F",X"1F",X"0F",X"07",X"07",X"0F",X"06",X"0D", + X"00",X"00",X"00",X"07",X"0F",X"0F",X"0F",X"4F",X"EF",X"FF",X"7F",X"3F",X"07",X"0F",X"06",X"0D", + X"00",X"00",X"1E",X"1F",X"1F",X"1F",X"1F",X"3F",X"7F",X"7F",X"3F",X"0A",X"07",X"0F",X"06",X"0D", + X"00",X"00",X"3C",X"3F",X"1F",X"4F",X"EF",X"EF",X"FF",X"7F",X"3F",X"0F",X"07",X"0F",X"07",X"0E", + 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"00",X"00", + X"00",X"00",X"03",X"07",X"17",X"3F",X"3F",X"3F",X"1F",X"07",X"07",X"03",X"07",X"03",X"06",X"06", + X"00",X"00",X"0C",X"0F",X"07",X"07",X"07",X"07",X"07",X"07",X"03",X"03",X"07",X"03",X"06",X"06", + X"00",X"00",X"00",X"1F",X"1F",X"4F",X"FF",X"FF",X"7F",X"0F",X"1D",X"1B",X"00",X"0F",X"07",X"00", + X"34",X"06",X"3F",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"06",X"0F",X"0F",X"07",X"0F",X"4F",X"EF",X"FF",X"7F",X"3F",X"1F",X"3F",X"1A",X"37", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"2D",X"6F",X"63",X"FD",X"FF",X"FD",X"F9",X"2D",X"2D",X"2D",X"0D",X"04",X"01",X"01",X"01", + X"35",X"04",X"3F",X"1F",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"03",X"27",X"EF",X"FF",X"EF",X"FF",X"FF",X"7F",X"3F",X"1F",X"3F",X"1A",X"37", + X"00",X"00",X"00",X"03",X"27",X"EF",X"FF",X"EF",X"FF",X"FF",X"7F",X"3F",X"1F",X"3F",X"1A",X"37", + X"00",X"00",X"00",X"03",X"27",X"EF",X"FF",X"EF",X"EF",X"FF",X"7F",X"3F",X"1F",X"3F",X"1A",X"37", + X"00",X"3C",X"3F",X"3F",X"1F",X"DF",X"FE",X"FF",X"7F",X"0F",X"06",X"0D",X"0D",X"00",X"0F",X"07", + X"00",X"3F",X"3F",X"DF",X"FE",X"FF",X"3F",X"0F",X"1D",X"1B",X"00",X"0F",X"07",X"00",X"00",X"00", + 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"03",X"07",X"1F",X"1F",X"3D",X"3F",X"3F",X"0F",X"0B",X"1F",X"1C",X"39",X"F9",X"ED",X"24",X"04", + X"03",X"07",X"1F",X"1F",X"3D",X"BF",X"FF",X"EF",X"7B",X"7F",X"3C",X"19",X"09",X"0D",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"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"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"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"EE", + X"00",X"00",X"00",X"00",X"1F",X"3F",X"3F",X"3F",X"1F",X"1F",X"4F",X"FF",X"FF",X"FF",X"03",X"03", + X"06",X"06",X"06",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"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"7F",X"FF",X"FF",X"6F",X"06",X"0D", + X"00",X"00",X"02",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"03",X"07",X"03",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"0F",X"0E",X"1D",X"3F",X"33",X"60",X"60",X"60",X"60",X"60",X"60",X"30",X"38",X"1C",X"0F",X"07", + X"6B",X"DE",X"0B",X"12",X"43",X"07",X"07",X"05",X"17",X"06",X"0D",X"0B",X"0B",X"1B",X"17",X"0F", + X"0D",X"0F",X"1F",X"3F",X"31",X"60",X"60",X"60",X"60",X"60",X"60",X"30",X"38",X"1C",X"0F",X"07", + X"FC",X"75",X"22",X"17",X"07",X"27",X"86",X"0D",X"0B",X"0B",X"0B",X"17",X"17",X"0F",X"0F",X"0E", + 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"00",X"00",X"00",X"00", + X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE",X"7E",X"7E",X"3E",X"1E",X"06",X"00",X"00",X"00",X"00", + X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE",X"7E",X"7E",X"3E",X"1E",X"06",X"00",X"00",X"00",X"00", + X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE",X"7E",X"7E",X"3E",X"1E",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"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + 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"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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE",X"7E",X"3E",X"7E",X"FE",X"FE",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"FE",X"FE",X"FE",X"7E",X"7E",X"3E",X"1E",X"06",X"00",X"00",X"00",X"00", + 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"FC",X"FC",X"FC",X"FC", + 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"FC",X"FC",X"FC",X"FC", + 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"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"40",X"40",X"4E",X"0E",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"00",X"00",X"40",X"40",X"4E",X"0E",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"00",X"00",X"40",X"40",X"4E",X"0E",X"0E", + X"00",X"00",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"40",X"4E",X"0E",X"0E", + X"00",X"00",X"02",X"02",X"00",X"00",X"00",X"02",X"02",X"00",X"00",X"40",X"40",X"4E",X"0E",X"0E", + X"00",X"00",X"02",X"02",X"00",X"40",X"40",X"4E",X"0E",X"00",X"00",X"40",X"40",X"4E",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"00",X"00",X"FE",X"FE",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"4E",X"4E",X"4E",X"4E",X"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"4F",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"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"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE", + X"00",X"00",X"00",X"00",X"06",X"1E",X"3E",X"7E",X"7E",X"FE",X"FE",X"FE",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"44",X"AA",X"AA",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"31",X"4A",X"4A",X"4A",X"4A",X"31",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"31",X"4A",X"4A",X"4A",X"4A",X"31",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"31",X"4A",X"4A",X"4A",X"4A",X"31",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"31",X"4A",X"4A",X"4A",X"4A",X"31",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"55",X"55",X"55",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"22",X"55",X"55",X"55",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"44",X"AA",X"AA",X"AA",X"AA",X"44",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"13",X"17",X"3F",X"3F",X"FF",X"3C",X"3B",X"0C",X"0F",X"0F",X"08",X"03",X"D3",X"DD",X"4F",X"07", + X"13",X"17",X"3F",X"3F",X"FF",X"BC",X"FB",X"C4",X"0F",X"0F",X"08",X"03",X"03",X"1D",X"0F",X"07", + 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"04",X"44",X"9F",X"BF",X"BF",X"7F",X"1B",X"11",X"41",X"C1",X"C1",X"C1",X"03",X"03", + 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"FF",X"FF",X"00", + X"01",X"01",X"01",X"01",X"03",X"03",X"0F",X"FE",X"F8",X"00",X"00",X"00",X"00",X"FF",X"FF",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"07",X"0F",X"1F",X"1F",X"3F",X"BF",X"7F",X"3F",X"7F",X"7F",X"F3",X"E7",X"4F",X"0E",X"06",X"00", + X"07",X"0F",X"1F",X"1F",X"3F",X"3F",X"7F",X"BF",X"3F",X"3F",X"33",X"73",X"71",X"21",X"00",X"00", + X"E0",X"7F",X"7F",X"FF",X"7F",X"FF",X"7F",X"3F",X"3F",X"1F",X"0E",X"00",X"00",X"00",X"00",X"00", + X"70",X"61",X"7F",X"7F",X"FF",X"7F",X"FF",X"7F",X"3F",X"3F",X"1F",X"0E",X"00",X"00",X"00",X"00", + X"E3",X"7F",X"7F",X"FF",X"7F",X"FF",X"7F",X"3F",X"3F",X"1F",X"0E",X"00",X"00",X"00",X"00",X"00", + X"00",X"38",X"7F",X"7F",X"FF",X"7F",X"FF",X"7F",X"3F",X"3F",X"1F",X"0E",X"00",X"00",X"00",X"00", + X"38",X"7F",X"7F",X"FF",X"FF",X"FF",X"7F",X"3F",X"3F",X"1F",X"0E",X"00",X"00",X"00",X"00",X"00", + X"1E",X"1C",X"41",X"21",X"00",X"03",X"07",X"0E",X"0D",X"03",X"03",X"03",X"03",X"01",X"01",X"00", + X"01",X"0D",X"0E",X"23",X"40",X"03",X"07",X"0E",X"0D",X"03",X"03",X"03",X"03",X"01",X"01",X"00", + X"0E",X"1C",X"00",X"10",X"21",X"03",X"07",X"06",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"F4",X"72",X"30",X"00",X"00",X"00",X"CB",X"CB",X"7B",X"37",X"03",X"03",X"03",X"01",X"01",X"00", + X"03",X"03",X"02",X"00",X"00",X"00",X"06",X"1D",X"3D",X"7B",X"F7",X"E7",X"67",X"26",X"02",X"01", + X"01",X"07",X"0F",X"1F",X"1F",X"1F",X"0F",X"0F",X"03",X"3D",X"0F",X"07",X"34",X"7E",X"3F",X"0F", + X"01",X"07",X"0F",X"1F",X"1F",X"1F",X"1F",X"0F",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"0F",X"1F",X"1F",X"3F",X"3F",X"3F",X"3F",X"7F",X"1F",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"0F",X"1F",X"1F",X"3F",X"3F",X"7F",X"3F",X"7F",X"7F",X"37",X"00",X"00",X"00",X"00",X"00", + X"07",X"0F",X"1F",X"1F",X"3F",X"BF",X"7F",X"3F",X"7F",X"7F",X"73",X"27",X"01",X"00",X"00",X"00", + X"01",X"03",X"0B",X"0F",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"01",X"03",X"03",X"07",X"07",X"07",X"0F",X"0F",X"07",X"03",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"07",X"07",X"0F",X"0F",X"0F",X"0F",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"01",X"07",X"0F",X"1F",X"1F",X"1F",X"1F",X"0F",X"03",X"01", + X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"1F",X"1F",X"1F",X"1F",X"0F",X"03",X"01",X"00",X"00", + X"00",X"00",X"01",X"07",X"0F",X"1F",X"1F",X"1F",X"1F",X"0F",X"03",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"08",X"44",X"62",X"61",X"30",X"32",X"14",X"18",X"1A",X"0A",X"03",X"03",X"01",X"01", + X"20",X"11",X"0A",X"44",X"62",X"61",X"20",X"32",X"15",X"1B",X"1A",X"0A",X"02",X"02",X"01",X"01", + X"20",X"30",X"58",X"48",X"62",X"61",X"20",X"30",X"10",X"00",X"10",X"08",X"00",X"02",X"01",X"01", + X"00",X"30",X"08",X"00",X"42",X"40",X"40",X"70",X"00",X"00",X"00",X"42",X"62",X"03",X"08",X"00", + X"20",X"20",X"08",X"00",X"00",X"80",X"40",X"00",X"00",X"00",X"00",X"80",X"40",X"00",X"02",X"11", + X"4C",X"08",X"00",X"00",X"40",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"C0",X"30",X"0C",X"03",X"01",X"07",X"7F",X"FF",X"3F",X"0F",X"03",X"00", + X"00",X"00",X"00",X"00",X"80",X"40",X"20",X"F8",X"F7",X"F0",X"F0",X"F0",X"70",X"31",X"1B",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7F",X"01",X"03",X"07",X"0F",X"1F",X"3F",X"FF", + X"00",X"00",X"00",X"00",X"00",X"80",X"60",X"10",X"0F",X"80",X"E0",X"F8",X"FF",X"7F",X"1F",X"07", + X"00",X"00",X"00",X"00",X"00",X"80",X"60",X"18",X"07",X"80",X"E0",X"F8",X"FF",X"7F",X"1F",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"60",X"C0",X"80",X"FF",X"FF",X"7F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"EE",X"EE",X"EE",X"EE",X"0E",X"0E", + X"00",X"00",X"00",X"00",X"00",X"E0",X"EE",X"EE",X"EE",X"EE",X"EE",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"0E",X"0E",X"EE",X"EE",X"EE",X"EE",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"22",X"66",X"76",X"7F",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"22",X"66",X"76",X"7F",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"40",X"66",X"EE",X"FF",X"FF",X"FF",X"7F", + X"00",X"00",X"00",X"00",X"00",X"08",X"05",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"40",X"21",X"19",X"8B",X"6D",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"B1",X"69",X"16",X"36",X"30",X"27",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"81",X"63",X"9E",X"6D",X"21",X"74",X"86",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"C0",X"30",X"0C",X"03",X"30",X"3C",X"7C",X"FC",X"3C",X"0E",X"03",X"00", + X"00",X"00",X"00",X"00",X"80",X"40",X"20",X"98",X"C7",X"C0",X"C0",X"C3",X"63",X"23",X"1F",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"3C",X"3C",X"3C",X"7E",X"FF", + X"00",X"03",X"0F",X"1F",X"1D",X"39",X"35",X"34",X"36",X"37",X"37",X"1B",X"1C",X"0F",X"03",X"00", + X"00",X"00",X"00",X"01",X"03",X"03",X"23",X"37",X"3E",X"1E",X"1C",X"0F",X"07",X"03",X"00",X"00", + X"00",X"03",X"0F",X"0C",X"19",X"1B",X"1B",X"1C",X"0F",X"03",X"00",X"00",X"20",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"0E",X"0E",X"1B",X"19",X"1A",X"1A",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"01",X"0B",X"0F",X"06",X"03",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"07",X"06",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"00",X"00",X"00",X"01",X"02",X"07",X"07",X"06",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"01",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"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"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"00",X"00",X"10",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"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"03",X"04",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"04",X"03",X"00",X"00",X"00",X"00", + X"00",X"02",X"04",X"04",X"08",X"08",X"00",X"00",X"00",X"04",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"02",X"02",X"02",X"00",X"00",X"00",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"30",X"30",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"54",X"54",X"50",X"43",X"37",X"07",X"17",X"27",X"72",X"56",X"56",X"46",X"26",X"00",X"00",X"00", + X"A4",X"A4",X"90",X"43",X"37",X"07",X"37",X"67",X"E2",X"A6",X"86",X"C6",X"06",X"00",X"00",X"00", + X"04",X"A8",X"A8",X"50",X"43",X"17",X"07",X"37",X"27",X"72",X"2E",X"26",X"16",X"0E",X"00",X"00", + X"A8",X"A8",X"9D",X"4D",X"35",X"25",X"57",X"E7",X"F7",X"52",X"56",X"05",X"37",X"07",X"04",X"08", + X"54",X"54",X"2D",X"1D",X"05",X"05",X"37",X"67",X"C7",X"E2",X"F6",X"D5",X"57",X"67",X"34",X"18", + X"24",X"48",X"4D",X"0D",X"35",X"05",X"77",X"C7",X"E7",X"F2",X"56",X"55",X"27",X"37",X"04",X"08", + X"0E",X"20",X"4E",X"7E",X"E3",X"C7",X"57",X"67",X"0F",X"37",X"48",X"90",X"20",X"00",X"00",X"00", + X"0E",X"20",X"4E",X"7E",X"E3",X"C7",X"57",X"67",X"0F",X"17",X"08",X"28",X"24",X"20",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"F1",X"FF",X"7F",X"FF",X"7F",X"7F",X"7F",X"3F",X"3F",X"1F",X"0F",X"0E",X"00",X"00",X"00",X"00", + X"CF",X"67",X"3F",X"7F",X"3F",X"3F",X"1F",X"1F",X"0F",X"0F",X"0E",X"05",X"01",X"00",X"00",X"00", + X"38",X"1C",X"3C",X"1C",X"1C",X"1F",X"3F",X"7F",X"7F",X"7F",X"7B",X"31",X"39",X"18",X"00",X"00", + X"38",X"1C",X"18",X"1F",X"0F",X"4F",X"CF",X"FF",X"FF",X"FF",X"EE",X"C6",X"66",X"64",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"FF", + X"00",X"00",X"0C",X"0C",X"00",X"0C",X"0E",X"06",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00", + X"18",X"18",X"18",X"7F",X"04",X"08",X"00",X"00",X"0F",X"08",X"00",X"08",X"04",X"03",X"00",X"00", + X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"00",X"00",X"00",X"F0",X"F8",X"1C",X"0F",X"00", + X"00",X"00",X"0C",X"0C",X"00",X"0C",X"0E",X"06",X"07",X"03",X"01",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"0C",X"0C",X"0F",X"00",X"18",X"18",X"18",X"7F", + X"00",X"18",X"18",X"18",X"7F",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C", + X"00",X"00",X"01",X"02",X"04",X"09",X"10",X"01",X"04",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0F", + X"FF",X"FF",X"FF",X"FF",X"07",X"78",X"C7",X"00",X"00",X"00",X"00",X"C7",X"FF",X"78",X"00",X"03", + X"FF",X"FF",X"FF",X"FF",X"F0",X"07",X"F8",X"00",X"00",X"00",X"00",X"F8",X"FF",X"0F",X"00",X"E0", + X"FF",X"FF",X"FF",X"FF",X"FE",X"00",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"01",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"10",X"88",X"6D",X"1D",X"0D",X"3D",X"27",X"73",X"77",X"FA",X"5E",X"4F",X"4F",X"27",X"24",X"18", + X"04",X"08",X"08",X"0B",X"03",X"02",X"01",X"01",X"01",X"03",X"07",X"06",X"06",X"06",X"06",X"02", + X"05",X"09",X"08",X"03",X"03",X"03",X"1B",X"33",X"63",X"F1",X"FB",X"5B",X"4A",X"2A",X"20",X"10", + X"04",X"08",X"08",X"0B",X"03",X"02",X"01",X"01",X"01",X"03",X"07",X"06",X"06",X"06",X"06",X"02", + X"00",X"03",X"04",X"04",X"0F",X"1A",X"1A",X"0E",X"03",X"01",X"05",X"19",X"37",X"0E",X"3E",X"1C", + X"00",X"03",X"04",X"04",X"0F",X"1A",X"1A",X"0E",X"13",X"71",X"F5",X"F1",X"E3",X"40",X"00",X"00", + X"00",X"03",X"04",X"04",X"0F",X"3A",X"9A",X"CE",X"F3",X"71",X"05",X"01",X"03",X"00",X"00",X"00", + X"07",X"08",X"8F",X"D7",X"79",X"2C",X"03",X"11",X"05",X"01",X"03",X"00",X"00",X"00",X"00",X"00", + X"41",X"E5",X"F1",X"13",X"0E",X"1A",X"1A",X"0F",X"08",X"04",X"03",X"00",X"00",X"00",X"00",X"00", + X"41",X"E5",X"F1",X"13",X"0E",X"1A",X"1A",X"0F",X"08",X"04",X"03",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"40",X"40",X"60",X"60",X"30",X"30",X"10",X"10",X"1F",X"0B",X"03",X"03",X"01",X"01", + X"00",X"00",X"40",X"40",X"60",X"60",X"3F",X"3C",X"1C",X"1C",X"1F",X"0B",X"03",X"03",X"01",X"01", + X"00",X"00",X"40",X"7F",X"7A",X"7D",X"3F",X"3C",X"1C",X"1C",X"1F",X"0B",X"03",X"03",X"01",X"01", + X"3F",X"60",X"7F",X"7A",X"7D",X"7F",X"3F",X"3C",X"1C",X"1C",X"1F",X"0B",X"03",X"03",X"01",X"01", + X"3F",X"60",X"7F",X"7F",X"7A",X"7D",X"3F",X"3C",X"1C",X"1C",X"1F",X"0B",X"03",X"03",X"01",X"01", + X"00",X"00",X"40",X"40",X"60",X"60",X"30",X"30",X"10",X"10",X"1A",X"0A",X"03",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"FF",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"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"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"08",X"00", + X"00",X"0C",X"0C",X"0C",X"0C",X"4C",X"4C",X"4C",X"4C",X"4C",X"4C",X"4C",X"0C",X"0C",X"0C",X"00", + X"02",X"06",X"06",X"26",X"26",X"66",X"66",X"66",X"66",X"66",X"66",X"26",X"26",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"00",X"00",X"00",X"00",X"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"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"04",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"04",X"03",X"00",X"00",X"00", + X"00",X"00",X"02",X"04",X"04",X"08",X"08",X"00",X"00",X"00",X"04",X"04",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"02",X"02",X"02",X"00",X"00",X"00",X"02",X"02",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"04",X"05",X"05",X"05",X"05",X"05",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"01",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"03",X"07",X"0E",X"0D",X"FF",X"0D",X"0E",X"07",X"03",X"00",X"00",X"00",X"00", + X"00",X"00",X"07",X"0F",X"1C",X"19",X"1B",X"FF",X"1B",X"19",X"1C",X"0F",X"07",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"07",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"08",X"00",X"01",X"03",X"23",X"03",X"01",X"00",X"00",X"08",X"00",X"00",X"00", + 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"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"02",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"01",X"01",X"01",X"03",X"03",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"03",X"03",X"01",X"00",X"00",X"01",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"02",X"04",X"04",X"04",X"0C",X"0C",X"0C",X"0C",X"14", + X"00",X"00",X"00",X"00",X"20",X"22",X"72",X"22",X"24",X"04",X"04",X"0C",X"0C",X"0C",X"0C",X"14", + X"20",X"20",X"20",X"20",X"20",X"22",X"FA",X"22",X"24",X"24",X"24",X"2C",X"2C",X"2C",X"0C",X"14", + X"07",X"0F",X"1F",X"1F",X"3F",X"3F",X"7F",X"BF",X"7F",X"3F",X"33",X"73",X"71",X"21",X"00",X"00", + X"31",X"07",X"3F",X"3F",X"3F",X"7F",X"7F",X"27",X"1F",X"3F",X"38",X"13",X"07",X"07",X"07",X"03", + X"00",X"00",X"00",X"06",X"0F",X"07",X"03",X"31",X"7B",X"F3",X"FF",X"CF",X"EF",X"66",X"04",X"00", + X"00",X"03",X"1B",X"1B",X"3D",X"3C",X"14",X"B3",X"FF",X"FF",X"7F",X"37",X"03",X"01",X"01",X"00", + X"00",X"06",X"01",X"1F",X"1E",X"0F",X"0F",X"07",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"03", + X"00",X"00",X"06",X"1F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"3F",X"7C",X"9C",X"0E",X"0E",X"04", + X"07",X"25",X"57",X"57",X"F3",X"E7",X"DF",X"77",X"07",X"1B",X"2C",X"48",X"90",X"00",X"00",X"00", + X"0C",X"10",X"2C",X"78",X"60",X"3F",X"07",X"1F",X"07",X"2B",X"09",X"00",X"03",X"00",X"00",X"01", + X"01",X"00",X"00",X"03",X"00",X"08",X"2B",X"07",X"1F",X"07",X"1F",X"23",X"7C",X"70",X"3C",X"10", + X"00",X"00",X"00",X"10",X"92",X"4A",X"14",X"0F",X"6F",X"DF",X"EF",X"67",X"3F",X"CF",X"6A",X"0E", + X"00",X"20",X"32",X"6A",X"24",X"A5",X"8F",X"0F",X"3F",X"7F",X"5F",X"77",X"2F",X"0B",X"0E",X"06", + X"06",X"0F",X"0D",X"37",X"7A",X"6F",X"3F",X"3F",X"0F",X"2F",X"47",X"27",X"EA",X"FA",X"78",X"30", + X"01",X"05",X"01",X"13",X"4E",X"FA",X"FA",X"CF",X"08",X"04",X"03",X"00",X"00",X"00",X"00",X"00", + X"0E",X"1F",X"19",X"17",X"03",X"03",X"05",X"04",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"01",X"02",X"02",X"04",X"05",X"03",X"03",X"0F",X"1D",X"19",X"0A", + X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"04",X"47",X"DD",X"ED",X"7F",X"39",X"00",X"02",X"00", + X"00",X"30",X"78",X"18",X"4B",X"7C",X"3A",X"17",X"1D",X"2B",X"0E",X"1D",X"27",X"0B",X"00",X"00", + X"00",X"00",X"0B",X"27",X"1D",X"0E",X"2B",X"1D",X"17",X"3A",X"3C",X"2B",X"2C",X"34",X"18",X"00", + X"1B",X"09",X"0D",X"05",X"07",X"07",X"02",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"27",X"32",X"12",X"1A",X"1E",X"0A",X"0B",X"0D",X"07",X"07",X"07",X"07",X"05",X"01",X"01",X"01", + X"12",X"09",X"0D",X"05",X"07",X"07",X"03",X"03",X"03",X"03",X"0A",X"25",X"1F",X"3F",X"1F",X"0E", + X"32",X"0B",X"05",X"07",X"03",X"03",X"03",X"02",X"40",X"00",X"80",X"C0",X"60",X"7A",X"30",X"00", + X"0E",X"03",X"81",X"00",X"00",X"02",X"00",X"20",X"30",X"18",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"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"03",X"35",X"53",X"55",X"57",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"06",X"08",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"00",X"00",X"00",X"00",X"01",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"00",X"00",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"07",X"0C",X"09",X"09",X"09",X"0C",X"0F",X"08",X"0F",X"0C",X"00",X"00",X"00", + X"00",X"00",X"00",X"07",X"08",X"08",X"09",X"09",X"09",X"09",X"08",X"0F",X"0C",X"00",X"00",X"00", + X"00",X"00",X"00",X"07",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D",X"07",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"06",X"1E",X"3E",X"7E",X"7E",X"FE",X"FE",X"FE",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"FE",X"FE",X"FE", + X"7F",X"80",X"80",X"00",X"D9",X"FB",X"AA",X"AA",X"AA",X"AA",X"AA",X"A9",X"00",X"80",X"80",X"7F", + X"00",X"00",X"00",X"7F",X"80",X"80",X"00",X"D9",X"FA",X"AA",X"AA",X"A9",X"00",X"80",X"80",X"7F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7F",X"80",X"80",X"FB",X"AA",X"AB",X"80",X"80",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"00",X"00",X"00",X"00",X"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"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"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7n.vhd b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7n.vhd new file mode 100644 index 00000000..850cad9a --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7n.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity obj_7n 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 obj_7n 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"78",X"00",X"F0",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"E0",X"D0",X"BC",X"BC",X"FC",X"F0",X"E0",X"C0",X"E0",X"F0",X"80",X"DC", + X"00",X"00",X"00",X"E0",X"E0",X"E0",X"F0",X"60",X"FC",X"FF",X"FF",X"C3",X"E0",X"F0",X"80",X"DC", + X"00",X"00",X"00",X"C0",X"E0",X"E0",X"E0",X"F0",X"FC",X"FE",X"FE",X"84",X"E0",X"F0",X"80",X"DC", + X"00",X"00",X"3C",X"FC",X"FC",X"FA",X"FF",X"6F",X"FE",X"FC",X"F0",X"E0",X"E0",X"F0",X"80",X"DC", + X"00",X"F8",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"F0",X"F0",X"F8",X"F8",X"DE",X"FF",X"FB",X"F3",X"E0",X"F0",X"F8",X"40",X"EE",X"BC", + X"00",X"00",X"38",X"F8",X"F8",X"F8",X"FC",X"F8",X"F8",X"F0",X"E0",X"F0",X"F8",X"40",X"EE",X"BC", + X"00",X"00",X"00",X"FE",X"FE",X"FF",X"77",X"FF",X"FE",X"F0",X"80",X"DE",X"FC",X"F8",X"C0",X"00", + X"FC",X"1C",X"DC",X"38",X"78",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"E0",X"F8",X"F8",X"78",X"E0",X"F0",X"F0",X"F0",X"B8",X"F8",X"1C",X"7C", + X"E0",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"71",X"FF",X"FF",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"DF",X"FE",X"FE",X"FC",X"F0",X"F0", + X"E0",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"20",X"F0",X"F8",X"F8",X"F0",X"F8",X"BC",X"FE",X"FE",X"EE",X"DE",X"8C",X"C0",X"00",X"70", + X"00",X"20",X"F0",X"F8",X"F8",X"F0",X"F8",X"BC",X"FE",X"F8",X"EE",X"DE",X"8C",X"C0",X"00",X"70", + X"00",X"20",X"F0",X"F8",X"F8",X"F0",X"F8",X"BC",X"FE",X"FE",X"EE",X"DE",X"8C",X"C0",X"00",X"70", + X"00",X"3C",X"FC",X"FC",X"F8",X"FB",X"EF",X"FF",X"FE",X"F0",X"80",X"DC",X"38",X"20",X"F8",X"C0", + X"00",X"FC",X"FC",X"FB",X"EF",X"FF",X"FE",X"70",X"80",X"DE",X"3C",X"F8",X"C0",X"00",X"00",X"00", + X"B0",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"C0",X"E0",X"F8",X"F8",X"DC",X"FC",X"FC",X"F8",X"F8",X"FC",X"1C",X"CE",X"CF",X"DB",X"92",X"90", + X"C0",X"E0",X"F8",X"F8",X"DC",X"FD",X"FF",X"F7",X"FE",X"FE",X"1C",X"C8",X"C8",X"D8",X"90",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"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"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"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"EE", + X"00",X"00",X"00",X"00",X"C0",X"E0",X"F0",X"F0",X"68",X"FA",X"FF",X"FF",X"FF",X"F0",X"88",X"80", + X"EE",X"9C",X"10",X"00",X"90",X"E8",X"E0",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"08",X"F8",X"FC",X"FC",X"F8",X"F0",X"FE",X"BE",X"FE",X"F8",X"F0",X"E0",X"F0",X"80",X"DC", + X"00",X"08",X"78",X"FC",X"FC",X"FC",X"FC",X"DF",X"FF",X"FC",X"F8",X"F0",X"F8",X"40",X"EE",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"F0",X"70",X"B8",X"FC",X"4C",X"06",X"06",X"06",X"06",X"06",X"06",X"0C",X"1C",X"38",X"F0",X"C0", + X"38",X"DD",X"EA",X"C0",X"40",X"60",X"A4",X"A0",X"F0",X"F0",X"72",X"B0",X"B8",X"D8",X"D8",X"F0", + X"B0",X"F0",X"F8",X"FC",X"8C",X"06",X"06",X"06",X"06",X"06",X"06",X"0C",X"1C",X"38",X"F0",X"C0", + X"6B",X"77",X"D6",X"60",X"69",X"E0",X"F0",X"70",X"B0",X"B8",X"D8",X"D8",X"F8",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"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE",X"7E",X"7E",X"3E",X"1E",X"06",X"00",X"00",X"00",X"00", + X"7E",X"7E",X"7E",X"7E",X"FE",X"FE",X"FE",X"FC",X"FC",X"F8",X"F0",X"C0",X"00",X"00",X"00",X"00", + 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"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"52",X"52",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"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"7E",X"7E",X"7E",X"7E",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"7E",X"7E",X"7E",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"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"00",X"00",X"00",X"00",X"C0",X"F0",X"F8",X"FC",X"FC",X"FE",X"FE",X"FE",X"7E",X"7E",X"7E",X"7E", + 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"FC",X"FC",X"FC",X"FC", + X"00",X"00",X"00",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"00",X"00",X"00",X"00",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"00",X"00",X"00",X"00",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"00",X"00",X"40",X"40",X"4E",X"0E",X"0E", + 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"10",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"FE",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"10",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"FE",X"FE",X"FE", + X"00",X"00",X"00",X"7E",X"7E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"F0",X"F0",X"F0", + X"00",X"00",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"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"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE",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"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"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"C0",X"F0",X"F8",X"FC",X"FC",X"FE",X"FE",X"FE",X"7E",X"7E",X"7E",X"7E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"47",X"F1",X"52",X"54",X"65",X"42",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"9E",X"42",X"4C",X"50",X"52",X"8C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"5E",X"4A",X"4A",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"8C",X"50",X"50",X"5C",X"44",X"9C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"8C",X"52",X"52",X"4C",X"52",X"8C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"54",X"54",X"54",X"54",X"26",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"54",X"54",X"74",X"14",X"66",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F3",X"14",X"64",X"83",X"94",X"67",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"C8",X"E8",X"FC",X"FC",X"FF",X"7C",X"BC",X"60",X"E0",X"E0",X"20",X"80",X"97",X"77",X"E4",X"E0", + X"C8",X"E8",X"FC",X"FC",X"FF",X"7D",X"BF",X"63",X"E0",X"E0",X"20",X"80",X"90",X"70",X"E0",X"E0", + X"0E",X"7C",X"D0",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"C0",X"E0",X"F0",X"F0",X"F8",X"9A",X"8B",X"0B",X"13",X"F0",X"88",X"80", + 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"FF",X"FF",X"00", + X"86",X"86",X"86",X"86",X"86",X"06",X"06",X"06",X"0E",X"0C",X"1C",X"38",X"F8",X"E0",X"80",X"00", + 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"86",X"86",X"86",X"86", + X"00",X"80",X"80",X"C0",X"E0",X"F0",X"F8",X"FC",X"DE",X"BE",X"1A",X"50",X"78",X"78",X"70",X"30", + X"00",X"80",X"80",X"C0",X"EC",X"FE",X"FF",X"FF",X"CD",X"A8",X"3C",X"BC",X"D8",X"D8",X"C0",X"00", + X"F0",X"E0",X"C0",X"F0",X"FC",X"F0",X"F0",X"B3",X"3F",X"7F",X"67",X"4E",X"4E",X"04",X"00",X"00", + X"E0",X"E0",X"C0",X"80",X"F0",X"F8",X"FC",X"FB",X"B7",X"7F",X"67",X"4E",X"4E",X"04",X"00",X"00", + X"C0",X"C0",X"80",X"F0",X"F8",X"FC",X"FB",X"B7",X"7F",X"67",X"4E",X"4E",X"04",X"00",X"00",X"00", + X"00",X"78",X"F0",X"C0",X"F0",X"F8",X"FC",X"FB",X"B7",X"7F",X"67",X"4E",X"4E",X"04",X"00",X"00", + X"78",X"F0",X"C0",X"F0",X"F8",X"FC",X"FB",X"B7",X"7F",X"67",X"4E",X"4E",X"04",X"00",X"00",X"00", + X"00",X"00",X"E0",X"C0",X"00",X"E0",X"E0",X"30",X"00",X"CC",X"9C",X"FC",X"FC",X"1C",X"18",X"80", + X"C0",X"80",X"00",X"00",X"00",X"E0",X"E0",X"30",X"00",X"CC",X"9C",X"FC",X"FC",X"1C",X"18",X"80", + X"F0",X"E0",X"00",X"00",X"F0",X"F0",X"18",X"80",X"E6",X"CE",X"FE",X"FE",X"8E",X"8C",X"40",X"00", + X"78",X"70",X"E0",X"00",X"00",X"0E",X"7C",X"78",X"80",X"CC",X"9C",X"FC",X"AC",X"AC",X"88",X"C0", + X"C0",X"80",X"00",X"08",X"0E",X"0E",X"06",X"82",X"00",X"00",X"D8",X"F8",X"F8",X"38",X"30",X"00", + X"EE",X"FE",X"EC",X"F8",X"F8",X"F8",X"FB",X"FF",X"FE",X"FC",X"E0",X"C0",X"80",X"00",X"00",X"00", + X"E0",X"F0",X"E8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"80",X"C0",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"80",X"80",X"C0",X"F0",X"E8",X"E8",X"E8",X"F8",X"F0",X"20",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"80",X"C0",X"E0",X"F8",X"F0",X"F4",X"D4",X"9A",X"3E",X"9E",X"0C",X"00",X"00",X"00", + X"C0",X"E0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F8",X"FC",X"F0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"E0",X"F0",X"F8",X"F8",X"FC",X"FC",X"F8",X"F0",X"E0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"F0",X"FC",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"00",X"00",X"20",X"E0",X"F0",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F0",X"E0", + X"00",X"00",X"00",X"20",X"E0",X"F0",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F0",X"E0",X"00",X"00", + X"00",X"20",X"E0",X"F0",X"F8",X"F8",X"F8",X"F8",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"20",X"C0",X"00",X"40",X"40",X"40",X"20",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"08",X"10",X"20",X"C0",X"00",X"40",X"40",X"40",X"A0",X"50",X"20",X"00",X"00",X"00", + X"00",X"0A",X"12",X"26",X"46",X"8C",X"04",X"40",X"40",X"30",X"10",X"00",X"00",X"00",X"00",X"00", + X"20",X"20",X"40",X"70",X"00",X"40",X"10",X"10",X"10",X"08",X"00",X"30",X"20",X"00",X"00",X"00", + X"00",X"08",X"08",X"5C",X"00",X"00",X"00",X"04",X"02",X"00",X"00",X"00",X"00",X"0C",X"00",X"00", + X"04",X"1C",X"88",X"02",X"00",X"00",X"60",X"22",X"04",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"7F",X"01",X"03",X"07",X"0F",X"1F",X"3F",X"FF", + X"00",X"00",X"00",X"00",X"01",X"02",X"04",X"18",X"F0",X"11",X"31",X"73",X"F2",X"F4",X"F8",X"E0", + X"00",X"00",X"00",X"00",X"03",X"0D",X"33",X"C3",X"07",X"0F",X"0F",X"1F",X"3C",X"30",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"06",X"08",X"F0",X"01",X"07",X"1F",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"FC",X"06",X"03",X"01",X"FF",X"FF",X"FE",X"FC", + X"00",X"00",X"00",X"00",X"00",X"01",X"06",X"18",X"E0",X"01",X"07",X"1F",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"0E",X"0E",X"EE",X"EE",X"EE",X"EE",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"EE",X"EE",X"EE",X"EE",X"0E",X"0E", + X"00",X"00",X"00",X"00",X"00",X"0E",X"EE",X"EE",X"EE",X"EE",X"EE",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"02",X"02",X"66",X"77",X"FF",X"FF",X"FF",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"22",X"66",X"76",X"7F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"22",X"66",X"76",X"7F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"90",X"E0",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"04",X"48",X"F8",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"01",X"02",X"8E",X"FC",X"14",X"4E",X"EC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"87",X"8F",X"F9",X"F2",X"E6",X"CF",X"11",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"FF",X"00",X"00",X"3C",X"3C",X"3C",X"7E",X"FF", + X"00",X"00",X"00",X"00",X"01",X"02",X"04",X"19",X"E3",X"03",X"03",X"C3",X"C6",X"C4",X"F8",X"E0", + X"00",X"00",X"00",X"00",X"03",X"0C",X"30",X"C0",X"0C",X"3C",X"3E",X"3F",X"3C",X"70",X"C0",X"00", + X"00",X"E0",X"F0",X"C8",X"80",X"80",X"80",X"C4",X"60",X"70",X"30",X"32",X"60",X"C0",X"80",X"00", + X"00",X"60",X"F0",X"98",X"0C",X"6C",X"6C",X"6C",X"4C",X"9C",X"38",X"F8",X"F0",X"E0",X"00",X"00", + X"00",X"E0",X"F0",X"38",X"98",X"CC",X"EC",X"2C",X"8C",X"EC",X"FC",X"78",X"70",X"60",X"80",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"70",X"F0",X"98",X"58",X"58",X"38",X"F0",X"E0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"C0",X"E0",X"30",X"B0",X"30",X"B0",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"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"B0",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"C0",X"60",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"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"80",X"00",X"20",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"08",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"08",X"80",X"00",X"00",X"00", + X"00",X"80",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"20",X"20",X"20",X"20",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"40",X"40",X"40",X"40",X"48",X"08",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"E0",X"10",X"E8",X"68",X"A8",X"A8",X"A8",X"A8",X"E8",X"10",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"0C",X"0C",X"00",X"0A",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"2A",X"2A",X"12",X"C4",X"F8",X"E0",X"DC",X"C6",X"8E",X"D4",X"C8",X"D0",X"C0",X"00",X"00",X"00", + X"20",X"29",X"12",X"C2",X"F8",X"E0",X"D8",X"C4",X"8E",X"CE",X"CA",X"C0",X"C0",X"00",X"00",X"00", + X"94",X"54",X"54",X"14",X"C0",X"F8",X"E0",X"DC",X"CE",X"8B",X"C9",X"C5",X"C0",X"C0",X"00",X"00", + X"29",X"29",X"72",X"66",X"78",X"60",X"F8",X"CC",X"C6",X"8F",X"DF",X"7B",X"E3",X"C6",X"5C",X"38", + X"52",X"52",X"64",X"70",X"60",X"6E",X"F7",X"CF",X"CB",X"8A",X"C2",X"46",X"C4",X"C0",X"40",X"20", + X"48",X"24",X"64",X"60",X"78",X"60",X"FC",X"C6",X"CF",X"9F",X"DB",X"56",X"C6",X"CC",X"40",X"20", + X"E0",X"04",X"EA",X"EA",X"CF",X"E7",X"FB",X"EE",X"E0",X"D8",X"24",X"12",X"09",X"00",X"00",X"00", + X"E0",X"04",X"EA",X"EA",X"CF",X"E7",X"FB",X"EE",X"E0",X"D0",X"20",X"28",X"48",X"08",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"E0",X"C0",X"9C",X"BE",X"E0",X"E0",X"E0",X"F0",X"F1",X"FF",X"1F",X"3F",X"3E",X"5E",X"1C",X"18", + X"0E",X"1C",X"08",X"04",X"6C",X"FC",X"FC",X"FC",X"F8",X"F8",X"78",X"30",X"30",X"20",X"40",X"00", + X"1E",X"38",X"1E",X"1C",X"1C",X"9C",X"F8",X"F0",X"E0",X"E0",X"E0",X"80",X"00",X"00",X"00",X"00", + X"3B",X"36",X"3E",X"7E",X"FF",X"FE",X"FE",X"FE",X"FC",X"F8",X"E0",X"60",X"00",X"00",X"00",X"00", + X"FF",X"EF",X"EF",X"EF",X"E0",X"0F",X"E0",X"20",X"20",X"20",X"20",X"E1",X"EF",X"2F",X"21",X"F0", + X"5F",X"5F",X"5F",X"2F",X"17",X"08",X"07",X"00",X"00",X"80",X"E0",X"FF",X"3F",X"00",X"00",X"00", + X"2F",X"2F",X"2F",X"E0",X"DE",X"0E",X"46",X"52",X"5A",X"1A",X"82",X"1A",X"5A",X"52",X"46",X"0E", + X"00",X"00",X"80",X"E0",X"F0",X"F8",X"FC",X"7C",X"BC",X"5E",X"5E",X"5E",X"5E",X"5E",X"DE",X"00", + X"5E",X"5F",X"5F",X"2F",X"17",X"0B",X"04",X"03",X"00",X"80",X"E0",X"FF",X"3F",X"00",X"00",X"00", + X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"DE",X"00",X"2F",X"2F",X"2F",X"E0", + X"00",X"2F",X"2F",X"2F",X"E0",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E", + X"00",X"60",X"80",X"7F",X"FF",X"80",X"FF",X"00",X"00",X"00",X"00",X"00",X"0D",X"1E",X"1F",X"FF", + X"FF",X"EF",X"EF",X"EF",X"E0",X"0F",X"E0",X"20",X"20",X"20",X"20",X"E1",X"EF",X"2F",X"21",X"F0", + X"FF",X"EF",X"EF",X"EF",X"60",X"8F",X"60",X"20",X"20",X"20",X"20",X"61",X"EF",X"AF",X"21",X"70", + X"EF",X"EF",X"EF",X"E0",X"0F",X"E0",X"A0",X"20",X"20",X"20",X"20",X"E1",X"EF",X"EF",X"2F",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"10",X"24",X"68",X"70",X"64",X"6C",X"ED",X"D9",X"FB",X"BB",X"FE",X"DE",X"DE",X"CC",X"48",X"20", + X"40",X"20",X"A0",X"A0",X"80",X"80",X"80",X"00",X"00",X"80",X"C0",X"C0",X"C0",X"80",X"80",X"80", + X"50",X"48",X"08",X"F0",X"F0",X"E0",X"EC",X"C6",X"83",X"47",X"6D",X"6A",X"4A",X"44",X"0C",X"00", + X"40",X"20",X"A0",X"A0",X"80",X"80",X"80",X"00",X"00",X"80",X"C0",X"C0",X"C0",X"80",X"80",X"80", + X"00",X"80",X"40",X"40",X"E0",X"B0",X"B0",X"E0",X"80",X"00",X"40",X"30",X"D8",X"E0",X"F8",X"70", + X"00",X"80",X"40",X"40",X"E0",X"B0",X"B0",X"E0",X"90",X"1C",X"5E",X"1E",X"8E",X"04",X"00",X"00", + X"00",X"80",X"40",X"40",X"E0",X"B8",X"B2",X"E6",X"9E",X"1C",X"40",X"00",X"80",X"00",X"00",X"00", + X"C0",X"20",X"E2",X"D6",X"3C",X"68",X"80",X"10",X"40",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"03",X"4F",X"1E",X"90",X"E0",X"B0",X"B0",X"E0",X"20",X"40",X"80",X"00",X"00",X"00",X"00",X"00", + X"03",X"4F",X"1E",X"90",X"E0",X"B0",X"B0",X"E0",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"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"A0",X"80",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"18",X"18",X"18",X"F0",X"F0",X"A0",X"80",X"80",X"00", + X"00",X"00",X"00",X"FE",X"AE",X"5C",X"FC",X"18",X"18",X"18",X"F0",X"F0",X"A0",X"80",X"80",X"00", + X"FC",X"06",X"FA",X"AE",X"5E",X"FC",X"FC",X"18",X"18",X"18",X"F0",X"F0",X"A0",X"80",X"80",X"00", + X"FC",X"06",X"FA",X"FE",X"AE",X"5C",X"FC",X"18",X"18",X"18",X"F0",X"F0",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"40",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"00", + X"FC",X"06",X"03",X"FF",X"FF",X"FF",X"FE",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"FE", + 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"00",X"10",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"10",X"00", + X"00",X"30",X"30",X"30",X"30",X"32",X"32",X"32",X"32",X"32",X"32",X"30",X"30",X"30",X"30",X"00", + X"40",X"60",X"60",X"64",X"64",X"66",X"66",X"66",X"66",X"66",X"66",X"64",X"64",X"60",X"60",X"40", + X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",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"20",X"20",X"20",X"20",X"00",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"80",X"40",X"40",X"40",X"40",X"48",X"08",X"10",X"00",X"80",X"80",X"80", + X"00",X"00",X"E0",X"10",X"E8",X"68",X"A8",X"A8",X"A8",X"A8",X"E8",X"10",X"E0",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"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"80",X"80",X"80", + X"00",X"00",X"00",X"E0",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"E0",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"80",X"80",X"80",X"C0",X"F8",X"C0",X"80",X"80",X"80",X"80",X"80",X"00",X"00", + X"80",X"80",X"80",X"E0",X"F0",X"B8",X"D8",X"FF",X"D8",X"B8",X"F0",X"E0",X"80",X"80",X"80",X"80", + X"80",X"80",X"F0",X"F8",X"9C",X"CC",X"EC",X"FF",X"EC",X"CC",X"9C",X"F8",X"F0",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"E0",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"80",X"10",X"00",X"C0",X"E0",X"E4",X"E0",X"C0",X"00",X"00",X"10",X"80",X"00",X"00", + X"80",X"00",X"04",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",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"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"E0",X"C0",X"C0",X"C0",X"C0",X"E0",X"00", + X"00",X"00",X"00",X"40",X"60",X"F0",X"E0",X"E0",X"E0",X"C0",X"C0",X"80",X"80",X"C0",X"E0",X"00", + X"80",X"80",X"80",X"80",X"90",X"B0",X"B8",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0",X"B8",X"B8",X"B0", + X"80",X"80",X"90",X"90",X"90",X"90",X"FC",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0",X"B8",X"B8",X"B0", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"A0",X"A0",X"A0",X"B0",X"B0",X"B0",X"B8",X"B8",X"B0", + X"00",X"80",X"80",X"C0",X"EC",X"FE",X"FF",X"FF",X"CD",X"A8",X"3C",X"BC",X"D8",X"D8",X"C0",X"00", + X"C0",X"E0",X"E0",X"F0",X"F0",X"F0",X"F0",X"E0",X"E0",X"F0",X"F0",X"78",X"F8",X"80",X"60",X"00", + X"20",X"70",X"70",X"39",X"3E",X"FC",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FC",X"78",X"00",X"00", + X"00",X"00",X"84",X"8E",X"CE",X"CC",X"FC",X"FE",X"FF",X"FE",X"FC",X"FC",X"FC",X"FC",X"F8",X"F8", + X"C0",X"E0",X"E0",X"E0",X"C0",X"10",X"F8",X"F8",X"E4",X"FE",X"FE",X"FC",X"FC",X"FC",X"F0",X"EC", + X"00",X"20",X"66",X"F7",X"F3",X"FF",X"CF",X"DE",X"8C",X"C0",X"E0",X"F0",X"60",X"00",X"00",X"00", + X"70",X"54",X"72",X"7E",X"C7",X"E3",X"EA",X"E6",X"F0",X"EC",X"12",X"09",X"04",X"00",X"00",X"00", + X"60",X"F0",X"B0",X"EC",X"6E",X"96",X"DC",X"EC",X"E2",X"F3",X"E0",X"E4",X"56",X"5C",X"0E",X"00", + X"04",X"0E",X"5F",X"57",X"14",X"C4",X"E2",X"E0",X"E8",X"FC",X"F6",X"DE",X"EC",X"B0",X"F0",X"60", + X"00",X"00",X"00",X"10",X"92",X"A4",X"10",X"C0",X"CE",X"F3",X"E7",X"CF",X"EA",X"EA",X"A4",X"E8", + X"80",X"00",X"00",X"C0",X"00",X"10",X"94",X"C0",X"D8",X"C0",X"F8",X"CC",X"1C",X"28",X"18",X"60", + X"08",X"1C",X"66",X"1E",X"04",X"98",X"C0",X"D8",X"E0",X"D4",X"90",X"00",X"C0",X"00",X"00",X"80", + X"00",X"40",X"00",X"90",X"E6",X"BF",X"BF",X"E6",X"20",X"40",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"D0",X"E4",X"B8",X"70",X"D4",X"B8",X"E8",X"5C",X"3C",X"D4",X"34",X"2C",X"18",X"00", + X"00",X"0C",X"1E",X"18",X"D2",X"3C",X"5C",X"E8",X"B8",X"D4",X"70",X"B8",X"E4",X"D0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"C0",X"20",X"10",X"F1",X"5D",X"5B",X"7E",X"CC",X"80",X"A0",X"80", + X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"40",X"20",X"A0",X"C0",X"C0",X"F0",X"B8",X"98",X"50", + X"30",X"F8",X"98",X"E8",X"C0",X"C0",X"A0",X"20",X"40",X"40",X"80",X"00",X"00",X"00",X"00",X"00", + X"98",X"90",X"30",X"60",X"60",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"34",X"28",X"60",X"50",X"E0",X"A0",X"E0",X"E0",X"C0",X"C0",X"C0",X"C0",X"80",X"80",X"00",X"00", + X"CC",X"98",X"90",X"A0",X"20",X"40",X"40",X"C0",X"40",X"40",X"00",X"A4",X"F8",X"FC",X"78",X"30", + X"CC",X"98",X"30",X"60",X"E0",X"40",X"C0",X"80",X"00",X"04",X"00",X"81",X"07",X"1E",X"0C",X"00", + X"70",X"C0",X"82",X"00",X"00",X"00",X"18",X"30",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"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"8C",X"52",X"22",X"32",X"2C",X"20",X"10",X"08",X"05",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"01",X"6D",X"AF",X"AB",X"A9",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"F0",X"B0",X"80",X"80",X"F0",X"30",X"F0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"D8",X"D8",X"58",X"58",X"58",X"58",X"D8",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"FC",X"26",X"26",X"E6",X"26",X"26",X"26",X"26",X"FE",X"06",X"00",X"00",X"00", + X"00",X"00",X"00",X"FC",X"42",X"42",X"72",X"66",X"5E",X"52",X"42",X"FE",X"06",X"00",X"00",X"00", + X"00",X"00",X"00",X"1B",X"9B",X"9B",X"9F",X"8F",X"87",X"8F",X"9B",X"13",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",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"00",X"00",X"00",X"00",X"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"01",X"01",X"00",X"83",X"C3",X"CF",X"D3",X"D3",X"D3",X"D3",X"8F",X"00",X"01",X"01",X"FE", + X"00",X"00",X"00",X"FE",X"01",X"01",X"00",X"83",X"CF",X"D3",X"D3",X"8F",X"00",X"01",X"01",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"01",X"01",X"CF",X"D3",X"DF",X"01",X"01",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"00",X"00",X"00",X"00",X"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"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"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7p.vhd b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7p.vhd new file mode 100644 index 00000000..646c43f5 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7p.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity obj_7p 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 obj_7p 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"1F",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"07",X"07",X"00",X"00",X"03",X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"07",X"1F",X"3F",X"1F", + X"0C",X"18",X"1C",X"18",X"00",X"00",X"00",X"40",X"E0",X"C0",X"00",X"00",X"07",X"1F",X"3F",X"1F", + X"30",X"60",X"60",X"60",X"00",X"00",X"00",X"20",X"60",X"40",X"00",X"00",X"07",X"1F",X"3F",X"1F", + X"78",X"38",X"00",X"00",X"00",X"40",X"E0",X"C0",X"80",X"00",X"00",X"00",X"07",X"1F",X"3F",X"1F", + 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"10",X"1C",X"08",X"18",X"38",X"38",X"30",X"00",X"00",X"00",X"03",X"0F",X"1F",X"0F",X"0F", + X"00",X"00",X"20",X"30",X"18",X"08",X"00",X"00",X"00",X"00",X"00",X"03",X"0F",X"1F",X"0F",X"0F", + X"00",X"00",X"3C",X"00",X"00",X"40",X"E0",X"C0",X"00",X"1F",X"7F",X"3B",X"1E",X"00",X"00",X"00", + X"7C",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"00",X"00",X"00",X"40",X"70",X"38",X"10",X"40",X"E0",X"C0",X"00",X"00",X"1F",X"7F",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"0F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"0F",X"0F",X"0F",X"0E",X"04",X"00",X"00",X"00", + X"7D",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"20",X"E0",X"F0",X"00",X"00",X"00",X"00",X"00",X"1F",X"7F",X"FF",X"7F", + X"00",X"00",X"00",X"00",X"20",X"E0",X"F0",X"00",X"00",X"00",X"00",X"00",X"1F",X"7F",X"FF",X"7F", + X"00",X"00",X"00",X"00",X"20",X"E0",X"F0",X"00",X"00",X"00",X"00",X"00",X"1F",X"7F",X"FF",X"7F", + X"78",X"00",X"00",X"00",X"00",X"C0",X"E0",X"00",X"00",X"0F",X"3F",X"1F",X"1F",X"0F",X"00",X"00", + X"78",X"00",X"00",X"C0",X"C0",X"00",X"00",X"1F",X"7F",X"3F",X"1E",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",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"30",X"70",X"E0",X"E0",X"C0",X"00",X"01",X"03",X"03",X"07",X"07",X"07",X"EF",X"ED",X"2C",X"07", + X"30",X"70",X"E0",X"E0",X"C0",X"80",X"C1",X"C3",X"03",X"07",X"07",X"07",X"0F",X"0D",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"EE",X"EE",X"11",X"11",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"11",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"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"00",X"06",X"47",X"E0",X"C0",X"C0",X"40",X"00",X"00",X"40",X"C0",X"C0",X"C1",X"0B",X"1F", + X"0F",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"00",X"00",X"40",X"E0",X"EF",X"7F",X"3F",X"1F", + X"00",X"00",X"02",X"0E",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"0F",X"1F",X"0F",X"0F", + X"00",X"00",X"3F",X"40",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"40",X"3F", + X"08",X"09",X"06",X"04",X"03",X"00",X"00",X"00",X"00",X"40",X"40",X"20",X"20",X"10",X"08",X"06", + X"5B",X"BF",X"1B",X"11",X"41",X"01",X"01",X"02",X"12",X"03",X"02",X"02",X"06",X"06",X"1A",X"0A", + X"0A",X"09",X"09",X"06",X"01",X"00",X"00",X"00",X"00",X"40",X"40",X"20",X"20",X"10",X"08",X"06", + X"35",X"7F",X"23",X"11",X"01",X"24",X"85",X"0A",X"0C",X"0C",X"0C",X"19",X"19",X"09",X"09",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"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"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"BE",X"BE",X"3E",X"3E",X"1E", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FF",X"FF",X"FF",X"FF",X"FC",X"FC",X"BE",X"BE",X"3E",X"3E",X"1E", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE",X"FE",X"FC",X"FC",X"BE",X"BE",X"3E",X"3E",X"1E", + X"1E",X"7E",X"FE",X"FE",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"BE",X"BE",X"3E",X"3E",X"1E", + X"1E",X"7E",X"FE",X"FE",X"FC",X"FE",X"FE",X"FE",X"FE",X"FC",X"FC",X"BE",X"BE",X"3E",X"3E",X"1E", + X"3E",X"7E",X"FE",X"FE",X"FC",X"BE",X"BE",X"3E",X"3E",X"FC",X"FC",X"BE",X"BE",X"3E",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"01",X"01",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE",X"FE",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"BE",X"BE",X"BE",X"BE",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"BF",X"BF",X"BF",X"BF",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"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"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"2F",X"4F",X"17",X"22",X"14",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"C0",X"C0",X"04",X"03",X"07",X"17",X"1F",X"3F",X"3F",X"7F",X"FF",X"DD",X"5F",X"3F", + X"20",X"60",X"C0",X"C0",X"04",X"83",X"C7",X"EF",X"7F",X"7F",X"3F",X"1F",X"0F",X"1D",X"1F",X"3F", + X"2F",X"0F",X"1F",X"0F",X"17",X"07",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"02",X"03",X"60",X"40",X"40",X"00",X"04",X"0E",X"4E",X"FE",X"FE",X"FF",X"0B",X"1F", + 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"FF",X"FF",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"FE",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"00", + X"08",X"10",X"20",X"20",X"00",X"80",X"40",X"00",X"70",X"7F",X"F3",X"E7",X"4F",X"0E",X"06",X"00", + X"08",X"10",X"20",X"20",X"00",X"00",X"40",X"80",X"30",X"3F",X"33",X"73",X"71",X"21",X"00",X"00", + X"E0",X"7F",X"61",X"C0",X"00",X"80",X"00",X"40",X"40",X"20",X"10",X"00",X"00",X"00",X"00",X"00", + X"70",X"7D",X"7F",X"61",X"C0",X"00",X"80",X"00",X"40",X"40",X"20",X"10",X"00",X"00",X"00",X"00", + X"FB",X"7F",X"61",X"C0",X"00",X"80",X"00",X"40",X"40",X"20",X"10",X"00",X"00",X"00",X"00",X"00", + X"E1",X"F9",X"7F",X"61",X"C0",X"00",X"80",X"00",X"40",X"40",X"20",X"10",X"00",X"00",X"00",X"00", + X"F9",X"FF",X"61",X"C0",X"00",X"80",X"00",X"40",X"40",X"20",X"10",X"00",X"00",X"00",X"00",X"00", + X"1E",X"1C",X"41",X"21",X"00",X"03",X"07",X"0E",X"0D",X"03",X"03",X"03",X"03",X"01",X"01",X"00", + X"01",X"0D",X"0E",X"23",X"40",X"03",X"07",X"0E",X"0D",X"03",X"03",X"03",X"03",X"01",X"01",X"00", + X"0E",X"1C",X"00",X"10",X"21",X"03",X"07",X"06",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"F4",X"72",X"30",X"00",X"00",X"00",X"CB",X"CB",X"7B",X"37",X"03",X"03",X"03",X"01",X"01",X"00", + X"03",X"03",X"02",X"00",X"00",X"00",X"06",X"1D",X"3D",X"7B",X"F7",X"E7",X"67",X"26",X"02",X"01", + X"06",X"08",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"3D",X"0F",X"07",X"04",X"7E",X"37",X"0F", + X"06",X"08",X"10",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"10",X"20",X"20",X"00",X"00",X"00",X"00",X"70",X"1F",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"10",X"20",X"20",X"00",X"00",X"40",X"00",X"70",X"7F",X"37",X"00",X"00",X"00",X"00",X"00", + X"08",X"10",X"20",X"20",X"00",X"80",X"40",X"00",X"70",X"7F",X"73",X"27",X"01",X"00",X"00",X"00", + X"00",X"00",X"08",X"08",X"08",X"08",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"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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"06",X"03",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"08",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"00",X"06",X"08",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00", + X"00",X"00",X"06",X"08",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00", + X"3F",X"7F",X"67",X"31",X"19",X"1C",X"0E",X"0C",X"09",X"03",X"01",X"01",X"00",X"00",X"00",X"00", + X"1F",X"4E",X"64",X"31",X"19",X"1C",X"1C",X"0C",X"08",X"00",X"01",X"01",X"01",X"01",X"00",X"00", + X"1F",X"0E",X"04",X"21",X"11",X"10",X"0C",X"0C",X"00",X"09",X"0A",X"02",X"01",X"01",X"00",X"00", + X"0C",X"04",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"00",X"21",X"10",X"00",X"00",X"00",X"00", + X"10",X"01",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"08",X"40",X"00",X"01",X"00",X"00", + X"4C",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"C0",X"C0",X"E0",X"F0",X"F0",X"F8",X"3C",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"08",X"8C",X"8E",X"4F",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"80",X"C0",X"E0",X"F0",X"E8",X"DC",X"BE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"70",X"1F",X"87",X"E0",X"78",X"1F",X"07",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"78",X"1F",X"87",X"E0",X"78",X"1F",X"07",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"00",X"60",X"6F",X"0F",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"0E",X"0E",X"10",X"11",X"E1",X"E0",X"0E",X"0E", + X"00",X"00",X"00",X"E0",X"EE",X"0E",X"10",X"10",X"01",X"E1",X"EE",X"0E",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"E1",X"E1",X"10",X"10",X"0E",X"0E",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"FF",X"FF",X"BB",X"BB",X"B7",X"7F",X"DD",X"EF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"FF",X"FF",X"BB",X"BB",X"B7",X"7F",X"DD",X"EF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7F",X"7F",X"7B",X"77",X"FF",X"FF",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"02",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"10",X"09",X"09",X"0F",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"61",X"12",X"1E",X"0B",X"79",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"C0",X"C0",X"C1",X"C3",X"F3",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"38",X"B8",X"FC",X"7C",X"3C",X"1F",X"07",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"81",X"C3",X"C3",X"C3",X"FF",X"FF",X"00", + X"00",X"03",X"0E",X"18",X"12",X"36",X"2A",X"2B",X"29",X"28",X"28",X"14",X"1B",X"0C",X"03",X"00", + X"00",X"00",X"00",X"01",X"02",X"02",X"22",X"36",X"3D",X"11",X"13",X"08",X"04",X"03",X"00",X"00", + X"00",X"03",X"0C",X"0B",X"16",X"14",X"14",X"13",X"0C",X"03",X"00",X"00",X"20",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"0E",X"0A",X"15",X"16",X"15",X"15",X"0B",X"08",X"07",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"0A",X"0E",X"05",X"02",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"04",X"05",X"05",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"02",X"05",X"04",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"00",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"01",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"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"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"00",X"00",X"10",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"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"01",X"03",X"03",X"06",X"06",X"06",X"06",X"06",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"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"08",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"02",X"02",X"02",X"00",X"00",X"02",X"01",X"00",X"00",X"00",X"00", + X"7F",X"E0",X"1F",X"30",X"3F",X"1F",X"1F",X"0F",X"07",X"07",X"03",X"01",X"00",X"00",X"00",X"00", + X"54",X"54",X"50",X"43",X"77",X"07",X"17",X"27",X"72",X"50",X"52",X"42",X"20",X"00",X"00",X"00", + X"A4",X"A4",X"90",X"43",X"77",X"07",X"37",X"67",X"E2",X"A0",X"82",X"C2",X"00",X"00",X"00",X"00", + X"04",X"A8",X"A8",X"50",X"43",X"37",X"07",X"37",X"27",X"72",X"68",X"62",X"32",X"18",X"00",X"00", + X"A8",X"A8",X"92",X"42",X"72",X"26",X"57",X"E7",X"F7",X"D2",X"D0",X"40",X"71",X"03",X"04",X"08", + X"54",X"54",X"22",X"32",X"02",X"06",X"37",X"67",X"C7",X"E2",X"F0",X"D0",X"D1",X"E3",X"74",X"38", + X"24",X"48",X"42",X"42",X"32",X"06",X"77",X"C7",X"E7",X"F2",X"D0",X"D0",X"61",X"33",X"04",X"08", + X"60",X"6A",X"C0",X"F0",X"E3",X"C7",X"57",X"67",X"0F",X"77",X"48",X"90",X"20",X"00",X"00",X"00", + X"60",X"6A",X"C0",X"F0",X"E3",X"C7",X"57",X"67",X"0F",X"17",X"28",X"28",X"24",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"F1",X"FF",X"63",X"C0",X"00",X"00",X"00",X"40",X"40",X"20",X"10",X"00",X"00",X"00",X"00",X"00", + X"CF",X"7F",X"3F",X"63",X"01",X"03",X"23",X"27",X"15",X"17",X"06",X"04",X"00",X"00",X"00",X"00", + X"38",X"1D",X"3F",X"07",X"06",X"07",X"27",X"7F",X"7F",X"7F",X"5B",X"31",X"31",X"10",X"00",X"00", + X"38",X"1F",X"1F",X"08",X"0B",X"4F",X"CF",X"FF",X"FF",X"BE",X"EE",X"C6",X"46",X"44",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",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"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"1F",X"1F",X"0F",X"07",X"03",X"01",X"00",X"00", + X"7F",X"7F",X"7F",X"7F",X"3B",X"30",X"33",X"27",X"20",X"26",X"20",X"26",X"2B",X"24",X"33",X"38", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FC",X"3F", + X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"1F",X"1F",X"0F",X"07",X"03",X"01",X"00",X"00", + X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3C",X"3F",X"7F",X"7F",X"7F",X"7F", + X"3F",X"7F",X"7F",X"7F",X"7F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F", + X"00",X"00",X"01",X"03",X"07",X"0E",X"1F",X"1E",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3C", + X"03",X"00",X"00",X"00",X"F8",X"87",X"38",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"E0",X"00",X"00",X"00",X"0F",X"F8",X"07",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FC",X"00",X"00",X"00",X"01",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"10",X"88",X"62",X"32",X"0A",X"3E",X"2F",X"77",X"77",X"FA",X"D8",X"CE",X"CD",X"67",X"64",X"38", + X"04",X"08",X"08",X"0B",X"03",X"02",X"01",X"01",X"01",X"03",X"07",X"06",X"06",X"06",X"06",X"02", + X"05",X"09",X"08",X"03",X"03",X"03",X"1B",X"33",X"63",X"F1",X"FB",X"DB",X"CB",X"6B",X"63",X"30", + X"04",X"08",X"08",X"0B",X"03",X"02",X"01",X"01",X"01",X"03",X"07",X"06",X"06",X"06",X"06",X"02", + X"00",X"03",X"17",X"1F",X"00",X"05",X"05",X"01",X"0C",X"0E",X"0A",X"1E",X"34",X"0E",X"3E",X"1C", + X"00",X"0B",X"17",X"0F",X"00",X"05",X"05",X"01",X"1C",X"7E",X"FA",X"F6",X"E0",X"40",X"00",X"00", + X"00",X"03",X"17",X"1F",X"00",X"25",X"85",X"C1",X"FC",X"7E",X"0A",X"06",X"00",X"00",X"00",X"00", + X"07",X"2F",X"B0",X"C8",X"66",X"23",X"0C",X"1E",X"0A",X"06",X"00",X"00",X"00",X"00",X"00",X"00", + X"46",X"EA",X"FE",X"1C",X"01",X"05",X"05",X"00",X"1F",X"17",X"0B",X"00",X"00",X"00",X"00",X"00", + X"46",X"EA",X"FE",X"1C",X"01",X"05",X"05",X"00",X"1F",X"27",X"03",X"00",X"00",X"00",X"00",X"00", + X"3F",X"7F",X"3F",X"3F",X"1A",X"1D",X"0F",X"0E",X"0E",X"0E",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"7F",X"3F",X"3A",X"1D",X"1F",X"00",X"02",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"7F",X"3F",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"00", + X"00",X"1F",X"00",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"00", + X"00",X"1F",X"00",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"00", + X"3F",X"7F",X"3F",X"3F",X"1A",X"1D",X"0F",X"0E",X"0E",X"0E",X"05",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"02",X"07",X"0A",X"0A",X"0F",X"07",X"02",X"0A",X"07",X"02",X"00",X"00", + X"00",X"FF",X"FF",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"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"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"00", + X"00",X"00",X"00",X"20",X"20",X"60",X"60",X"60",X"60",X"60",X"60",X"20",X"20",X"00",X"00",X"00", + X"00",X"00",X"10",X"30",X"30",X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"30",X"10",X"00",X"00", + X"00",X"08",X"18",X"38",X"38",X"78",X"78",X"78",X"78",X"78",X"78",X"38",X"38",X"18",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"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"01",X"03",X"03",X"06",X"06",X"06",X"06",X"06",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"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"08",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"02",X"02",X"02",X"00",X"00",X"02",X"01",X"00",X"00",X"00", + X"00",X"00",X"03",X"04",X"0B",X"0A",X"0A",X"0A",X"0A",X"0A",X"0B",X"04",X"03",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"00",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"04",X"09",X"0A",X"00",X"0A",X"09",X"04",X"03",X"00",X"00",X"00",X"00", + X"00",X"00",X"07",X"08",X"13",X"16",X"14",X"00",X"14",X"16",X"13",X"08",X"07",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"05",X"07",X"02",X"07",X"05",X"03",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"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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"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"19",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"04",X"04",X"04",X"04",X"05",X"0B",X"00", + X"00",X"00",X"00",X"03",X"04",X"09",X"09",X"09",X"09",X"04",X"04",X"02",X"02",X"05",X"09",X"00", + X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"00", + X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"00", + X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"00", + X"08",X"10",X"20",X"20",X"00",X"00",X"40",X"80",X"70",X"3F",X"33",X"73",X"71",X"21",X"00",X"00", + X"36",X"08",X"20",X"20",X"30",X"70",X"78",X"24",X"1E",X"3F",X"38",X"13",X"07",X"07",X"05",X"03", + X"00",X"00",X"00",X"06",X"0F",X"07",X"03",X"31",X"7A",X"B2",X"FE",X"FE",X"DF",X"5E",X"3C",X"18", + X"00",X"03",X"5B",X"FB",X"D5",X"DC",X"F4",X"F3",X"FE",X"FC",X"7C",X"34",X"00",X"00",X"00",X"00", + X"0F",X"19",X"1F",X"1F",X"1E",X"0F",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"18",X"20",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"44",X"9C",X"0E",X"0E",X"04", + X"30",X"65",X"D0",X"D0",X"F3",X"E7",X"5B",X"33",X"03",X"39",X"2C",X"48",X"90",X"00",X"00",X"00", + X"3C",X"70",X"6C",X"78",X"20",X"1F",X"07",X"1B",X"23",X"29",X"09",X"00",X"03",X"00",X"00",X"01", + X"01",X"00",X"00",X"03",X"00",X"08",X"2B",X"27",X"1B",X"03",X"1B",X"21",X"7C",X"30",X"1E",X"1C", + X"00",X"00",X"00",X"10",X"92",X"4A",X"34",X"0F",X"67",X"D7",X"E7",X"E7",X"B1",X"41",X"2A",X"00", + X"00",X"61",X"F2",X"EA",X"A4",X"25",X"0F",X"0F",X"0F",X"27",X"17",X"01",X"04",X"02",X"02",X"00", + X"00",X"02",X"04",X"00",X"10",X"27",X"27",X"0F",X"0F",X"6F",X"C3",X"A1",X"EA",X"FA",X"39",X"10", + X"06",X"0A",X"0E",X"1C",X"41",X"E5",X"E5",X"C0",X"1F",X"17",X"0B",X"00",X"00",X"00",X"00",X"00", + X"0E",X"1F",X"19",X"16",X"00",X"08",X"16",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"01",X"03",X"03",X"07",X"16",X"08",X"00",X"0E",X"1D",X"19",X"0A", + X"00",X"00",X"00",X"00",X"00",X"05",X"0B",X"0F",X"40",X"D2",X"E2",X"78",X"3E",X"07",X"05",X"03", + X"00",X"30",X"79",X"1A",X"4B",X"73",X"25",X"08",X"62",X"D4",X"F1",X"62",X"18",X"34",X"3C",X"18", + X"18",X"3C",X"34",X"18",X"62",X"F1",X"D4",X"62",X"08",X"25",X"33",X"2B",X"2E",X"35",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"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"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"18",X"18",X"18",X"18",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"06",X"66",X"76",X"5E",X"4E",X"46",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"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"00",X"00", + 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"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"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"0D",X"0D",X"0D",X"0D",X"0D",X"0D",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"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"00",X"7F",X"7F",X"00",X"D9",X"FB",X"AA",X"AA",X"AA",X"AA",X"AA",X"A9",X"00",X"7F",X"7F",X"00", + X"00",X"00",X"00",X"00",X"7F",X"7F",X"00",X"D9",X"FA",X"AA",X"AA",X"A9",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"7F",X"7F",X"FB",X"AA",X"AB",X"7F",X"7F",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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_MiST/Nintendo Mario Bros/rtl/rom/obj_7s.vhd b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7s.vhd new file mode 100644 index 00000000..958c2e11 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7s.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity obj_7s 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 obj_7s 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"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"80",X"00",X"F0",X"E0",X"00",X"00",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"E0",X"F0",X"F8",X"FC", + X"00",X"00",X"00",X"1C",X"1C",X"1C",X"04",X"00",X"00",X"03",X"03",X"03",X"E0",X"F0",X"F8",X"FC", + X"00",X"00",X"10",X"38",X"1C",X"14",X"00",X"00",X"04",X"0E",X"0E",X"04",X"E0",X"F0",X"F8",X"FC", + X"1E",X"1C",X"00",X"00",X"00",X"02",X"07",X"03",X"00",X"00",X"00",X"00",X"E0",X"F0",X"F8",X"FC", + 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"F0",X"E0",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"03",X"00",X"F0",X"F8",X"FC",X"FE",X"9C", + X"3C",X"38",X"00",X"00",X"18",X"18",X"1C",X"10",X"00",X"00",X"00",X"F0",X"F8",X"FC",X"FE",X"BC", + X"00",X"00",X"0F",X"00",X"00",X"03",X"03",X"00",X"00",X"70",X"FC",X"FE",X"FC",X"00",X"00",X"00", + X"E0",X"00",X"00",X"20",X"70",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"06",X"06",X"06",X"02",X"02",X"00",X"00",X"80",X"C0",X"E0",X"F0", + X"10",X"38",X"70",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"01",X"07",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"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"08",X"1C",X"0E",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"0E",X"1E",X"8C",X"C0",X"E0",X"F0", + X"08",X"1C",X"0E",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"0E",X"1E",X"8C",X"C0",X"E0",X"F0", + X"08",X"1C",X"0E",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"0E",X"1E",X"8C",X"C0",X"E0",X"F0", + X"1E",X"00",X"00",X"00",X"00",X"03",X"03",X"00",X"00",X"F0",X"F8",X"FC",X"38",X"20",X"00",X"00", + X"1E",X"00",X"00",X"03",X"07",X"00",X"00",X"70",X"FC",X"FE",X"3C",X"00",X"00",X"00",X"00",X"00", + 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"00",X"00", + X"0C",X"0E",X"07",X"07",X"03",X"00",X"C0",X"E0",X"F0",X"F0",X"F0",X"F0",X"FB",X"DB",X"9A",X"E0", + X"0C",X"0E",X"07",X"07",X"03",X"01",X"C3",X"E3",X"F0",X"F0",X"F0",X"F0",X"F8",X"D8",X"98",X"E0", + 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"10",X"10",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"10",X"10",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"EE",X"10",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"02",X"03",X"03",X"03",X"F0",X"88",X"BC", + X"FE",X"9C",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"06",X"03",X"03",X"01",X"00",X"0E",X"0E",X"06",X"00",X"00",X"E0",X"F0",X"F8",X"FC", + X"00",X"04",X"06",X"03",X"03",X"01",X"00",X"07",X"03",X"00",X"00",X"F0",X"F8",X"FC",X"FE",X"9C", + X"00",X"00",X"FC",X"02",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"02",X"FC", + X"50",X"90",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"EC",X"FE",X"6A",X"40",X"80",X"80",X"44",X"40",X"20",X"20",X"A2",X"40",X"40",X"68",X"68",X"50", + X"70",X"30",X"20",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"7A",X"FF",X"D2",X"80",X"C9",X"40",X"40",X"90",X"D0",X"D8",X"68",X"28",X"28",X"10",X"10",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"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"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"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"BE",X"BE",X"3E",X"3E",X"1E", + X"7E",X"7E",X"7E",X"7E",X"7E",X"FE",X"FE",X"FE",X"FE",X"7E",X"7E",X"FA",X"F2",X"F0",X"F0",X"F0", + 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"F0",X"FC",X"FE",X"FE",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"FA",X"F2",X"F0",X"F0",X"F0", + 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"F8",X"FC",X"FE",X"FE",X"7E",X"F0",X"FC",X"FE",X"FE",X"7E",X"7E",X"FA",X"F2",X"F0",X"F0",X"F0", + 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"52",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"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE",X"FE",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"FE",X"FE",X"FE",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"F7",X"F7",X"F7",X"F7",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"F4",X"E2",X"F0",X"48",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"04",X"06",X"03",X"03",X"40",X"80",X"C0",X"D0",X"F0",X"F8",X"F8",X"FC",X"FF",X"77",X"F4",X"F8", + X"04",X"06",X"03",X"03",X"40",X"81",X"C3",X"D7",X"FE",X"FE",X"FC",X"F8",X"F0",X"70",X"F0",X"F8", + X"FE",X"FC",X"D0",X"E0",X"F0",X"E8",X"40",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"00",X"00",X"00",X"90",X"62",X"77",X"F7",X"EF",X"F0",X"FA",X"FC", + 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"FF",X"FF",X"00", + X"36",X"36",X"36",X"36",X"36",X"36",X"76",X"66",X"EE",X"CC",X"9C",X"38",X"F8",X"E0",X"80",X"00", + X"36",X"36",X"36",X"36",X"36",X"36",X"36",X"36",X"36",X"36",X"36",X"36",X"36",X"36",X"36",X"36", + X"00",X"00",X"00",X"00",X"20",X"30",X"38",X"7C",X"DE",X"BE",X"1A",X"50",X"70",X"70",X"50",X"30", + X"00",X"00",X"00",X"00",X"2C",X"3E",X"3F",X"7F",X"CD",X"A8",X"38",X"A8",X"D8",X"D8",X"C0",X"00", + X"F0",X"E0",X"C0",X"F0",X"7C",X"70",X"70",X"33",X"3F",X"7F",X"65",X"46",X"46",X"04",X"00",X"00", + X"E0",X"E0",X"DC",X"F8",X"F0",X"78",X"7C",X"7B",X"37",X"7F",X"65",X"46",X"46",X"04",X"00",X"00", + X"F0",X"E0",X"C0",X"F0",X"78",X"7C",X"7B",X"37",X"7F",X"65",X"46",X"46",X"04",X"00",X"00",X"00", + X"C0",X"F8",X"F0",X"C0",X"F0",X"78",X"7C",X"7B",X"37",X"7F",X"65",X"46",X"46",X"04",X"00",X"00", + X"F8",X"F0",X"C0",X"F0",X"78",X"7C",X"7B",X"37",X"7F",X"65",X"46",X"46",X"04",X"00",X"00",X"00", + X"00",X"00",X"E0",X"C0",X"00",X"E0",X"E0",X"30",X"00",X"CC",X"9C",X"FC",X"F4",X"0C",X"08",X"80", + X"C0",X"80",X"00",X"00",X"00",X"E0",X"E0",X"30",X"00",X"CC",X"9C",X"FC",X"F4",X"0C",X"08",X"80", + X"F0",X"E0",X"00",X"00",X"F0",X"F0",X"18",X"80",X"E6",X"CE",X"FE",X"FA",X"86",X"84",X"40",X"00", + X"78",X"70",X"E0",X"00",X"00",X"0E",X"7C",X"78",X"80",X"CC",X"9C",X"F4",X"8C",X"8C",X"88",X"C0", + X"C0",X"80",X"00",X"08",X"0E",X"0E",X"06",X"82",X"00",X"00",X"D8",X"38",X"F8",X"18",X"10",X"00", + X"2E",X"1E",X"0C",X"08",X"08",X"08",X"0B",X"1F",X"3E",X"FC",X"E0",X"C0",X"80",X"00",X"00",X"00", + X"20",X"10",X"08",X"08",X"08",X"08",X"08",X"18",X"30",X"E0",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"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"30",X"28",X"28",X"68",X"F8",X"F0",X"20",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"20",X"38",X"30",X"70",X"D0",X"9A",X"3E",X"9E",X"0C",X"00",X"00",X"00", + X"20",X"10",X"08",X"08",X"00",X"00",X"00",X"00",X"1C",X"F0",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"04",X"04",X"08",X"10",X"E0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"C0",X"20",X"00",X"04",X"04",X"04",X"08",X"08",X"10",X"20",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"10",X"08",X"08",X"08",X"08",X"08",X"18",X"30",X"E0", + X"00",X"00",X"00",X"20",X"20",X"10",X"08",X"08",X"08",X"08",X"08",X"18",X"30",X"E0",X"00",X"00", + X"00",X"20",X"20",X"10",X"08",X"08",X"08",X"08",X"08",X"18",X"30",X"E0",X"00",X"00",X"00",X"00", + X"FC",X"FE",X"FE",X"FE",X"DE",X"1C",X"3C",X"38",X"38",X"38",X"90",X"D0",X"A0",X"80",X"80",X"00", + X"7C",X"7E",X"F6",X"E6",X"CE",X"1C",X"2C",X"B8",X"38",X"38",X"10",X"80",X"80",X"80",X"80",X"00", + X"7C",X"F0",X"E4",X"C8",X"88",X"10",X"28",X"30",X"38",X"08",X"80",X"E0",X"A0",X"80",X"80",X"00", + X"18",X"14",X"08",X"00",X"00",X"00",X"08",X"04",X"04",X"00",X"00",X"88",X"10",X"00",X"00",X"00", + X"06",X"03",X"00",X"00",X"00",X"10",X"02",X"01",X"01",X"10",X"20",X"00",X"86",X"80",X"80",X"00", + X"04",X"0C",X"80",X"02",X"00",X"00",X"60",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"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"F0",X"E8",X"DC",X"BE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"0F",X"0F",X"0E",X"8C",X"C8",X"E0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"F8",X"FE",X"FC",X"F0",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"0E",X"F8",X"E1",X"07",X"1E",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"F8",X"FC",X"00",X"06",X"F6",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"1E",X"F8",X"E1",X"07",X"1E",X"F8",X"E0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"0E",X"E1",X"E1",X"10",X"10",X"0E",X"0E",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"0E",X"0E",X"10",X"10",X"E0",X"E0",X"0E",X"0E", + X"00",X"00",X"00",X"0E",X"EE",X"E1",X"11",X"10",X"00",X"0E",X"EE",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"FE",X"FE",X"BA",X"BB",X"77",X"FF",X"FF",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"FF",X"FF",X"BB",X"BB",X"B7",X"FF",X"DD",X"EF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"FF",X"FF",X"BB",X"BB",X"B7",X"FF",X"DD",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"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"E8",X"B0",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"06",X"0C",X"18",X"30",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"00",X"00",X"00",X"00",X"81",X"C3",X"C3",X"C3",X"FF",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1C",X"1D",X"3F",X"3E",X"3C",X"F8",X"E0",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"83",X"C3",X"CF",X"FC",X"F0",X"C0",X"00",X"00", + X"00",X"E0",X"70",X"C8",X"80",X"80",X"80",X"44",X"A0",X"B0",X"D0",X"D2",X"A0",X"40",X"80",X"00", + X"00",X"60",X"90",X"68",X"F4",X"94",X"94",X"94",X"B4",X"6C",X"C8",X"18",X"30",X"E0",X"00",X"00", + X"00",X"E0",X"10",X"C8",X"68",X"34",X"14",X"D4",X"74",X"94",X"C4",X"48",X"50",X"60",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"40",X"40",X"40",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"70",X"90",X"68",X"A8",X"A8",X"C8",X"30",X"E0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"C0",X"20",X"D0",X"50",X"D0",X"50",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"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"60",X"90",X"50",X"20",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"40",X"A0",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"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"00",X"00",X"80",X"00",X"20",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"08",X"00",X"00",X"00",X"04",X"00",X"00",X"00",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"80",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"C0",X"E0",X"60",X"B0",X"B0",X"B0",X"B0",X"B0",X"F0",X"E0",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"20",X"10",X"10",X"10",X"10",X"10",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"00",X"00",X"00",X"00", + X"FC",X"3C",X"E0",X"0A",X"E0",X"FE",X"7E",X"FC",X"F8",X"F0",X"80",X"00",X"00",X"00",X"00",X"00", + X"2A",X"2A",X"12",X"C4",X"FC",X"C0",X"9C",X"C6",X"8E",X"16",X"8C",X"98",X"00",X"00",X"00",X"00", + X"20",X"29",X"12",X"C2",X"FC",X"C0",X"98",X"C4",X"8E",X"0E",X"8A",X"82",X"04",X"00",X"00",X"00", + X"94",X"54",X"54",X"14",X"C4",X"F8",X"C0",X"9C",X"CE",X"8B",X"09",X"85",X"80",X"00",X"00",X"00", + X"29",X"29",X"92",X"86",X"BC",X"E0",X"D8",X"8C",X"C6",X"8F",X"1F",X"3B",X"23",X"87",X"5F",X"3C", + X"52",X"52",X"84",X"98",X"A0",X"EE",X"D7",X"8F",X"CB",X"8B",X"03",X"07",X"06",X"80",X"40",X"20", + X"48",X"24",X"84",X"84",X"B8",X"E0",X"DC",X"86",X"CF",X"9F",X"1B",X"17",X"07",X"8E",X"4C",X"20", + X"0C",X"A6",X"0B",X"0B",X"CF",X"E7",X"DA",X"CC",X"C0",X"9C",X"24",X"12",X"09",X"00",X"00",X"00", + X"0C",X"A6",X"0B",X"0B",X"CF",X"E7",X"DA",X"CC",X"C0",X"90",X"28",X"28",X"48",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"E0",X"C0",X"9C",X"BE",X"60",X"60",X"60",X"70",X"71",X"7F",X"1F",X"1F",X"16",X"1E",X"1C",X"18", + X"0E",X"FC",X"F8",X"FC",X"F8",X"F8",X"F0",X"F8",X"F8",X"F8",X"78",X"30",X"30",X"20",X"40",X"00", + X"1E",X"F8",X"FE",X"F0",X"70",X"B0",X"E0",X"C8",X"D0",X"D0",X"C0",X"80",X"00",X"00",X"00",X"00", + X"3B",X"FE",X"FE",X"E2",X"41",X"C0",X"C0",X"80",X"00",X"04",X"18",X"00",X"00",X"00",X"00",X"00", + X"F0",X"10",X"10",X"10",X"1F",X"F0",X"1F",X"DF",X"DF",X"DF",X"DF",X"FF",X"FF",X"DF",X"DF",X"FF", + X"A0",X"A0",X"A0",X"D0",X"E8",X"F7",X"F8",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"00", + X"D0",X"D0",X"D0",X"FF",X"20",X"00",X"20",X"20",X"20",X"20",X"80",X"20",X"20",X"20",X"20",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"A0",X"A0",X"A0",X"A0",X"A0",X"20",X"FE", + X"A0",X"A0",X"A0",X"D0",X"E8",X"F4",X"FB",X"FC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"00", + X"A0",X"A0",X"A0",X"A0",X"A0",X"A0",X"A0",X"A0",X"A0",X"A0",X"20",X"FE",X"D0",X"D0",X"D0",X"FF", + X"FE",X"D3",X"D3",X"D3",X"FF",X"A0",X"A0",X"A0",X"A0",X"A0",X"A0",X"A0",X"A0",X"A0",X"A0",X"A0", + X"00",X"7F",X"FF",X"80",X"00",X"7F",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"F3",X"E1",X"E0",X"00", + X"F0",X"10",X"10",X"10",X"1F",X"F0",X"1F",X"DF",X"DF",X"DF",X"DF",X"FF",X"FF",X"DF",X"DF",X"FF", + X"70",X"10",X"10",X"10",X"9F",X"70",X"9F",X"DF",X"DF",X"DF",X"DF",X"FF",X"FF",X"DF",X"DF",X"FF", + X"10",X"10",X"10",X"1F",X"F0",X"1F",X"5F",X"DF",X"DF",X"DF",X"DF",X"DF",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"10",X"24",X"88",X"98",X"A4",X"EC",X"ED",X"D9",X"FB",X"BB",X"3F",X"9F",X"1F",X"8E",X"4C",X"20", + X"40",X"20",X"A0",X"E0",X"C0",X"C0",X"C0",X"C0",X"80",X"80",X"C0",X"C0",X"C0",X"C0",X"C0",X"80", + X"50",X"48",X"08",X"F0",X"F0",X"E0",X"FC",X"E6",X"E3",X"47",X"6D",X"6B",X"6B",X"67",X"6E",X"00", + X"40",X"20",X"A0",X"E0",X"C0",X"C0",X"C0",X"C0",X"80",X"80",X"C0",X"C0",X"C0",X"C0",X"C0",X"80", + X"00",X"80",X"D0",X"F0",X"00",X"40",X"40",X"00",X"60",X"E0",X"A0",X"F0",X"58",X"E0",X"F8",X"70", + X"00",X"80",X"D0",X"F0",X"00",X"40",X"40",X"00",X"70",X"FC",X"BE",X"DE",X"0E",X"04",X"00",X"00", + X"00",X"A0",X"D0",X"E0",X"00",X"48",X"42",X"06",X"7E",X"FC",X"A0",X"C0",X"00",X"00",X"00",X"00", + X"C0",X"E8",X"1A",X"26",X"CC",X"88",X"60",X"F0",X"A0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"C3",X"AF",X"FE",X"70",X"00",X"40",X"40",X"00",X"F0",X"D0",X"A0",X"00",X"00",X"00",X"00",X"00", + X"C3",X"AF",X"FE",X"70",X"00",X"40",X"40",X"00",X"F0",X"C8",X"80",X"00",X"00",X"00",X"00",X"00", + X"FC",X"FE",X"FE",X"FE",X"AE",X"5C",X"FC",X"B8",X"B8",X"B8",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"FE",X"FE",X"AE",X"5E",X"FC",X"00",X"A0",X"A0",X"A0",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"FE",X"FE",X"00",X"00",X"00",X"00",X"A0",X"A0",X"A0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"F8",X"04",X"00",X"00",X"00",X"00",X"A0",X"A0",X"A0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"F8",X"04",X"00",X"00",X"00",X"00",X"A0",X"A0",X"A0",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"FE",X"FE",X"FE",X"AE",X"5C",X"FC",X"B8",X"B8",X"B8",X"B0",X"D0",X"80",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"C0",X"A0",X"80",X"C0",X"E0",X"A0",X"A0",X"C0",X"80",X"00",X"00", + X"00",X"F8",X"FC",X"06",X"06",X"00",X"FC",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"FE",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"FE",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"FF",X"00", + X"00",X"10",X"18",X"1C",X"1C",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"1C",X"1C",X"18",X"10",X"00", + X"00",X"30",X"38",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"38",X"30",X"00", + X"40",X"70",X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"70",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"80",X"80", + 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"80",X"80",X"80",X"80", + X"00",X"00",X"C0",X"E0",X"60",X"B0",X"B0",X"B0",X"B0",X"B0",X"F0",X"E0",X"C0",X"80",X"80",X"80", + X"00",X"00",X"00",X"20",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"20",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"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"80",X"80",X"80", + X"00",X"00",X"E0",X"10",X"68",X"A8",X"A8",X"A8",X"A8",X"A8",X"E8",X"10",X"E0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"40",X"20",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"60",X"10",X"48",X"28",X"00",X"28",X"48",X"10",X"60",X"00",X"00",X"00",X"00", + X"00",X"00",X"70",X"08",X"64",X"34",X"14",X"00",X"14",X"34",X"64",X"08",X"70",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"60",X"D0",X"70",X"20",X"70",X"D0",X"60",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"C0",X"60",X"20",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"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"C8",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"A0",X"A0",X"A0",X"20",X"10",X"00", + X"00",X"00",X"00",X"80",X"00",X"00",X"10",X"10",X"90",X"A0",X"A0",X"C0",X"C0",X"A0",X"90",X"00", + X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"20",X"20",X"20",X"20",X"28",X"28",X"20",X"20",X"24", + X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"20",X"20",X"20",X"20",X"28",X"28",X"20",X"20",X"24", + X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"20",X"30",X"30",X"20",X"28",X"28",X"20",X"20",X"24", + X"00",X"00",X"00",X"00",X"2C",X"3E",X"3F",X"7F",X"CF",X"AF",X"3B",X"AB",X"DF",X"DA",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"F0",X"F0",X"78",X"F8",X"F8",X"98",X"F0", + X"20",X"70",X"70",X"39",X"22",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"84",X"8E",X"CE",X"CC",X"FC",X"0E",X"03",X"02",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"A0",X"E0",X"E0",X"C0",X"10",X"F8",X"78",X"24",X"1E",X"0E",X"0C",X"04",X"04",X"00",X"0C", + X"18",X"3C",X"7A",X"FB",X"7F",X"7F",X"4D",X"5E",X"8C",X"C0",X"E0",X"F0",X"60",X"00",X"00",X"00", + X"06",X"56",X"03",X"0F",X"C7",X"E3",X"EA",X"E6",X"F0",X"EE",X"12",X"09",X"04",X"00",X"00",X"00", + X"00",X"40",X"20",X"20",X"08",X"84",X"C4",X"E0",X"E2",X"F3",X"E1",X"E5",X"57",X"5F",X"8E",X"00", + X"04",X"8E",X"5F",X"57",X"15",X"C5",X"E3",X"E2",X"E0",X"E4",X"E4",X"88",X"00",X"20",X"40",X"00", + X"00",X"00",X"00",X"10",X"92",X"A4",X"18",X"C0",X"CE",X"F3",X"E7",X"CF",X"0B",X"0B",X"A6",X"0C", + X"80",X"00",X"00",X"C0",X"00",X"10",X"94",X"C4",X"D8",X"C0",X"F8",X"CC",X"1C",X"2C",X"1C",X"78", + X"38",X"3C",X"66",X"1E",X"04",X"98",X"C0",X"D8",X"E4",X"D4",X"90",X"00",X"C0",X"00",X"00",X"80", + X"C0",X"A0",X"E0",X"70",X"06",X"4F",X"4F",X"06",X"F0",X"D0",X"A0",X"00",X"00",X"00",X"00",X"00", + X"18",X"BC",X"2C",X"18",X"46",X"8F",X"2B",X"46",X"10",X"A4",X"CC",X"D4",X"F4",X"AC",X"18",X"00", + X"00",X"0C",X"9E",X"58",X"D2",X"CC",X"A4",X"10",X"46",X"2B",X"8F",X"46",X"18",X"2C",X"3C",X"18", + X"00",X"00",X"00",X"00",X"00",X"D0",X"E8",X"F8",X"01",X"A5",X"A3",X"8E",X"3C",X"70",X"50",X"60", + X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"68",X"18",X"00",X"70",X"B8",X"98",X"50", + X"30",X"F8",X"98",X"68",X"00",X"10",X"68",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"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"D3",X"D3",X"D3",X"D3",X"CE",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"01",X"01",X"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"01",X"01",X"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"1B",X"9B",X"9B",X"9F",X"8F",X"87",X"8F",X"9B",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"00",X"00",X"00",X"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"83",X"C3",X"CF",X"D3",X"D3",X"D3",X"D3",X"8F",X"00",X"FE",X"FE",X"00", + X"00",X"00",X"00",X"00",X"FE",X"FE",X"00",X"83",X"CF",X"D3",X"D3",X"8F",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"FE",X"FE",X"CF",X"D3",X"DF",X"FE",X"FE",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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_MiST/Nintendo Mario Bros/rtl/rom/obj_7t.vhd b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7t.vhd new file mode 100644 index 00000000..9d89ae50 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7t.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity obj_7t 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 obj_7t 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"07",X"07",X"00",X"00",X"00",X"00",X"0C",X"1E",X"1C",X"1F",X"0F",X"06",X"00",X"00",X"00",X"00", + X"0C",X"18",X"1C",X"18",X"00",X"00",X"00",X"04",X"0E",X"3E",X"7C",X"3D",X"00",X"00",X"00",X"00", + X"30",X"60",X"60",X"60",X"00",X"00",X"01",X"03",X"17",X"37",X"37",X"0A",X"00",X"00",X"00",X"00", + X"78",X"38",X"00",X"00",X"00",X"00",X"00",X"24",X"7E",X"7E",X"3C",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"10",X"1C",X"08",X"08",X"00",X"00",X"0D",X"1F",X"07",X"07",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"20",X"30",X"18",X"08",X"03",X"07",X"07",X"07",X"02",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"3C",X"00",X"00",X"00",X"1E",X"3E",X"78",X"00",X"00",X"00",X"01",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"40",X"70",X"38",X"10",X"04",X"0E",X"3E",X"7C",X"39",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"00",X"00",X"08",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0E", + 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"04",X"EE",X"FE",X"FE",X"7D",X"33",X"00",X"03",X"02",X"00", + X"00",X"02",X"08",X"00",X"00",X"00",X"04",X"EE",X"FE",X"FE",X"7D",X"33",X"00",X"03",X"02",X"00", + X"10",X"80",X"20",X"00",X"00",X"00",X"04",X"EE",X"EE",X"FE",X"7D",X"33",X"00",X"03",X"02",X"00", + X"78",X"00",X"00",X"00",X"00",X"18",X"1D",X"FE",X"7D",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"78",X"00",X"00",X"00",X"3D",X"FC",X"39",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",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"10",X"10",X"20",X"20",X"C2",X"01",X"02",X"09",X"09",X"18",X"18",X"38",X"10",X"03",X"03",X"00", + X"10",X"10",X"20",X"20",X"C2",X"01",X"02",X"29",X"79",X"78",X"38",X"18",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"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"47",X"E0",X"C0",X"C0",X"40",X"04",X"0E",X"0E",X"3E",X"3E",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"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"1F",X"3E",X"1C",X"10",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0E",X"0E",X"0F",X"0F",X"07",X"06",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"3F",X"7F",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"7F",X"3F", + X"00",X"00",X"18",X"38",X"3C",X"7F",X"7F",X"7F",X"7F",X"3F",X"3F",X"1F",X"1F",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"10",X"38",X"3E",X"7F",X"7F",X"7F",X"7F",X"3F",X"3F",X"1F",X"1F",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"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"00",X"00",X"00",X"00", + X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE",X"7E",X"7E",X"3E",X"1E",X"06",X"00",X"00",X"00",X"00", + X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE",X"7E",X"7E",X"3E",X"1E",X"06",X"00",X"00",X"00",X"00", + X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE",X"7E",X"7E",X"3E",X"1E",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"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + 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"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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE",X"7E",X"3E",X"7E",X"FE",X"FE",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"FE",X"FE",X"FE",X"7E",X"7E",X"3E",X"1E",X"06",X"00",X"00",X"00",X"00", + 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"FC",X"FC",X"FC",X"FC", + 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"FC",X"FC",X"FC",X"FC", + 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"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"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"7C",X"3E",X"0E",X"00",X"00",X"00", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FF",X"FF",X"FC",X"FC",X"FC",X"7C",X"3E",X"0E",X"00",X"00",X"00", + X"FC",X"FC",X"FC",X"FC",X"FC",X"7E",X"FE",X"FC",X"FC",X"FC",X"7C",X"3E",X"0E",X"00",X"00",X"00", + X"1E",X"7E",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"7C",X"3E",X"0E",X"00",X"00",X"00", + X"1E",X"7E",X"FC",X"FC",X"FC",X"7E",X"FE",X"FC",X"FC",X"FC",X"7C",X"3E",X"0E",X"00",X"00",X"00", + X"3E",X"7E",X"FC",X"FC",X"7C",X"3E",X"0E",X"00",X"00",X"FC",X"7C",X"3E",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"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE",X"FE",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"0E",X"0E",X"0E",X"0E",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"0E",X"0E",X"0E",X"0E",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"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",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"00",X"00",X"00",X"00",X"06",X"1E",X"3E",X"7E",X"7E",X"FE",X"FE",X"FE",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"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"03",X"07",X"1F",X"1F",X"3B",X"3F",X"3F",X"1F",X"1C",X"3F",X"38",X"73",X"F3",X"DB",X"49",X"07", + X"03",X"07",X"1F",X"1F",X"3B",X"BF",X"FF",X"EF",X"7C",X"7F",X"38",X"13",X"03",X"1B",X"09",X"07", + 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"1F",X"3F",X"3F",X"3F",X"1F",X"1F",X"4F",X"FF",X"FF",X"FF",X"03",X"03", + X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"FF",X"FF",X"00",X"FF",X"FF",X"00",X"FF",X"FF",X"00", + X"0D",X"0D",X"1D",X"39",X"FB",X"E3",X"0F",X"FE",X"F8",X"03",X"FF",X"FE",X"00",X"FF",X"FF",X"00", + X"0D",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D", + X"00",X"09",X"06",X"09",X"10",X"29",X"06",X"29",X"70",X"1F",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"09",X"06",X"09",X"10",X"29",X"06",X"29",X"30",X"1F",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"3F",X"61",X"D2",X"0C",X"52",X"21",X"12",X"0C",X"12",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"1C",X"3F",X"61",X"D2",X"0C",X"52",X"21",X"12",X"0C",X"12",X"00",X"00",X"00",X"00",X"00", + X"18",X"3F",X"61",X"D2",X"0C",X"52",X"21",X"12",X"0C",X"12",X"00",X"00",X"00",X"00",X"00",X"00", + X"E1",X"C1",X"3F",X"61",X"D2",X"0C",X"52",X"21",X"12",X"0C",X"12",X"00",X"00",X"00",X"00",X"00", + X"C1",X"BF",X"61",X"D2",X"0C",X"52",X"21",X"12",X"0C",X"12",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"1C",X"1E",X"1F",X"0C",X"08",X"01",X"02",X"04",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"1C",X"1F",X"0C",X"08",X"01",X"02",X"04",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0E",X"0F",X"0E",X"04",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"0F",X"3F",X"0F",X"0F",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"01",X"07",X"07",X"0F",X"09",X"02",X"02",X"04",X"00",X"00",X"00",X"01",X"01",X"00", + X"00",X"01",X"0A",X"04",X"04",X"04",X"0A",X"01",X"00",X"01",X"F0",X"F8",X"F8",X"00",X"08",X"00", + X"00",X"01",X"0A",X"04",X"04",X"04",X"0A",X"01",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"09",X"06",X"09",X"10",X"29",X"06",X"09",X"70",X"1F",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"09",X"06",X"09",X"10",X"29",X"06",X"09",X"70",X"1F",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"09",X"06",X"09",X"10",X"29",X"06",X"09",X"70",X"1F",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"08",X"09",X"0A",X"0D",X"08",X"0D",X"06",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"01",X"02",X"02",X"09",X"0E",X"06",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"05",X"02",X"02",X"01",X"06",X"06",X"03",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"0A",X"04",X"04",X"04",X"0A",X"01",X"00",X"01", + X"00",X"00",X"00",X"00",X"00",X"01",X"0A",X"04",X"04",X"04",X"0A",X"01",X"00",X"01",X"00",X"00", + X"00",X"00",X"00",X"01",X"0A",X"04",X"04",X"04",X"0A",X"01",X"00",X"01",X"00",X"00",X"00",X"00", + X"00",X"1F",X"10",X"0A",X"04",X"02",X"01",X"01",X"02",X"04",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"20",X"11",X"0A",X"04",X"02",X"03",X"01",X"02",X"04",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"41",X"23",X"16",X"0C",X"0E",X"13",X"03",X"0F",X"16",X"05",X"01",X"02",X"00",X"00",X"00", + X"00",X"08",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"00",X"21",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"00", + X"00",X"08",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"FF",X"FF",X"FF",X"FF",X"3F",X"0F",X"33",X"1C",X"0E",X"08",X"00",X"00",X"C0",X"F0",X"FC",X"FF", + X"FF",X"FF",X"FF",X"FF",X"7F",X"BF",X"DF",X"07",X"00",X"03",X"01",X"00",X"80",X"C0",X"E0",X"F8", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"3E",X"1C",X"08",X"10",X"20",X"40",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"1F",X"0F",X"80",X"60",X"18",X"07",X"00",X"80",X"E0",X"F8", + X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"1F",X"07",X"80",X"60",X"18",X"07",X"00",X"80",X"E0",X"F8", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"C0",X"80",X"00",X"7F",X"00",X"00",X"80",X"C0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"1F",X"11",X"11",X"01",X"00",X"10",X"11",X"F1",X"F1", + X"FF",X"FF",X"FF",X"1F",X"11",X"11",X"01",X"01",X"10",X"10",X"11",X"F1",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"10",X"10",X"01",X"01",X"11",X"11",X"1F",X"1F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"DF",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"DF",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"80",X"80",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"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"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"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"07",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"3F",X"4F",X"33",X"3C",X"0E",X"00",X"00",X"00",X"C0",X"F0",X"FC",X"FF", + X"FF",X"FF",X"FF",X"FF",X"7F",X"BF",X"DF",X"67",X"00",X"07",X"03",X"00",X"80",X"C0",X"E0",X"F8", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"7E",X"3C",X"00",X"00",X"00",X"00",X"00", + X"03",X"0C",X"11",X"27",X"2D",X"49",X"51",X"50",X"50",X"50",X"50",X"28",X"24",X"13",X"0C",X"07", + X"00",X"20",X"21",X"62",X"65",X"75",X"5D",X"49",X"42",X"6E",X"2C",X"37",X"1B",X"0C",X"07",X"00", + X"03",X"0C",X"13",X"14",X"28",X"28",X"28",X"2C",X"13",X"0C",X"07",X"80",X"00",X"01",X"0F",X"03", + X"00",X"00",X"03",X"0C",X"11",X"15",X"2A",X"29",X"28",X"28",X"14",X"17",X"08",X"07",X"00",X"00", + X"00",X"00",X"08",X"00",X"11",X"1B",X"1E",X"15",X"11",X"0A",X"0D",X"06",X"03",X"00",X"00",X"00", + X"00",X"00",X"03",X"04",X"0B",X"0A",X"0A",X"0B",X"04",X"03",X"00",X"00",X"04",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"02",X"05",X"02",X"03",X"02",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"08",X"0D",X"06",X"05",X"02",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"02",X"05",X"05",X"02",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"00",X"00",X"00",X"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"08",X"00",X"00",X"04",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"40",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"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"0E",X"0E",X"0F",X"07",X"03",X"00",X"00",X"00",X"00", + X"00",X"03",X"07",X"07",X"0F",X"0F",X"07",X"07",X"07",X"03",X"03",X"01",X"00",X"00",X"00",X"00", + X"00",X"01",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"00",X"3F",X"30",X"00",X"00",X"00",X"00",X"05",X"03",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"07",X"0C",X"08",X"08",X"02",X"00",X"00",X"00",X"02",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"07",X"0C",X"08",X"08",X"02",X"00",X"00",X"00",X"02",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"07",X"2C",X"08",X"08",X"02",X"00",X"00",X"00",X"02",X"02",X"00",X"00",X"00", + X"00",X"00",X"42",X"02",X"0A",X"0A",X"08",X"02",X"00",X"00",X"00",X"00",X"01",X"03",X"04",X"08", + X"00",X"00",X"02",X"02",X"0A",X"0A",X"08",X"02",X"00",X"00",X"00",X"00",X"01",X"03",X"04",X"08", + X"00",X"00",X"02",X"22",X"0A",X"0A",X"08",X"02",X"00",X"00",X"00",X"00",X"01",X"03",X"04",X"08", + X"00",X"0A",X"01",X"01",X"04",X"08",X"08",X"0B",X"04",X"00",X"02",X"02",X"00",X"00",X"00",X"00", + X"00",X"0A",X"01",X"01",X"04",X"08",X"08",X"0B",X"04",X"00",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"3C",X"63",X"D4",X"09",X"49",X"36",X"09",X"09",X"16",X"09",X"00",X"00",X"00",X"00",X"00", + X"00",X"18",X"3E",X"6B",X"08",X"14",X"08",X"08",X"02",X"00",X"01",X"03",X"03",X"03",X"03",X"01", + X"00",X"01",X"3B",X"07",X"06",X"02",X"00",X"00",X"00",X"00",X"24",X"0E",X"0E",X"0E",X"0E",X"04", + X"00",X"03",X"17",X"0F",X"04",X"00",X"00",X"00",X"00",X"40",X"10",X"38",X"38",X"38",X"38",X"10", + X"FF",X"FF",X"FF",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"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"04",X"0F",X"0C",X"18",X"1F",X"19",X"1F",X"19",X"14",X"1B",X"0C",X"07", + X"00",X"00",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"03",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"03",X"3F",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"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"00",X"03", + X"FF",X"FF",X"07",X"00",X"F8",X"FF",X"C7",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"FF",X"FF",X"F0",X"00",X"0F",X"FF",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0", + X"FF",X"FF",X"FE",X"00",X"01",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",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"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"02",X"00",X"00",X"00",X"02",X"01",X"03",X"04",X"08", + X"00",X"00",X"03",X"04",X"04",X"05",X"06",X"06",X"02",X"00",X"00",X"01",X"01",X"01",X"00",X"00", + X"00",X"00",X"03",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"03",X"04",X"04",X"05",X"06",X"06",X"02",X"00",X"00",X"01",X"01",X"01",X"00",X"00", + X"00",X"F3",X"74",X"1C",X"0F",X"50",X"70",X"3C",X"03",X"01",X"01",X"19",X"3F",X"3E",X"3E",X"1C", + X"78",X"3B",X"14",X"0C",X"4F",X"70",X"30",X"1C",X"13",X"71",X"F1",X"F1",X"EB",X"70",X"00",X"00", + X"00",X"F3",X"74",X"1C",X"0F",X"70",X"F0",X"FC",X"F3",X"71",X"01",X"01",X"0B",X"30",X"00",X"00", + X"E7",X"68",X"BF",X"D7",X"79",X"3C",X"33",X"31",X"41",X"01",X"0B",X"30",X"00",X"00",X"00",X"00", + X"41",X"E1",X"F1",X"73",X"3C",X"10",X"10",X"0F",X"18",X"14",X"0B",X"18",X"18",X"10",X"00",X"00", + X"41",X"E1",X"F1",X"73",X"3C",X"10",X"10",X"0F",X"18",X"64",X"E3",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"02",X"02",X"02",X"05",X"01",X"00",X"00",X"00",X"00", + X"00",X"1F",X"00",X"00",X"00",X"00",X"0F",X"0E",X"0E",X"0E",X"05",X"01",X"00",X"00",X"00",X"00", + X"00",X"1F",X"00",X"3F",X"1A",X"1D",X"0F",X"0E",X"0E",X"0E",X"05",X"01",X"00",X"00",X"00",X"00", + X"3F",X"7F",X"3F",X"3A",X"1D",X"1F",X"0F",X"0E",X"0E",X"0E",X"07",X"03",X"03",X"03",X"01",X"01", + X"00",X"1F",X"00",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"00", + X"00",X"1F",X"00",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"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"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"1F",X"3F",X"3F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"3F",X"3F",X"1F",X"0F",X"03", + X"03",X"0F",X"1F",X"3F",X"3F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"3F",X"1F",X"0F",X"03", + X"03",X"0F",X"1F",X"3F",X"3F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"3F",X"3F",X"1F",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"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"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"0E",X"0E",X"0F",X"07",X"03",X"00",X"00",X"00", + X"00",X"00",X"03",X"07",X"07",X"0F",X"0F",X"07",X"07",X"07",X"03",X"03",X"01",X"00",X"00",X"00", + X"00",X"00",X"01",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"03",X"04",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"00",X"00",X"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"0B",X"16",X"14",X"00",X"14",X"16",X"0B",X"04",X"03",X"00",X"00",X"00", + X"07",X"0F",X"18",X"37",X"6C",X"68",X"68",X"00",X"68",X"68",X"6C",X"37",X"18",X"0F",X"07",X"00", + X"00",X"07",X"0F",X"1F",X"3C",X"38",X"38",X"39",X"38",X"38",X"3C",X"1F",X"0F",X"07",X"00",X"00", + X"00",X"00",X"00",X"07",X"0F",X"0E",X"0C",X"0D",X"0C",X"0E",X"0F",X"07",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"00",X"00",X"00",X"00",X"00", + X"00",X"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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"02",X"02",X"02",X"00",X"04",X"00", + X"00",X"00",X"00",X"00",X"03",X"06",X"06",X"04",X"04",X"00",X"02",X"01",X"01",X"02",X"06",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"02",X"04",X"04",X"04",X"0C",X"0C",X"0C",X"0C",X"14", + X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"02",X"04",X"04",X"04",X"0C",X"0C",X"0C",X"0C",X"14", + X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"02",X"04",X"04",X"04",X"0C",X"0C",X"0C",X"0C",X"14", + X"00",X"09",X"06",X"09",X"10",X"09",X"06",X"09",X"70",X"1F",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"25",X"22",X"12",X"15",X"08",X"05",X"02",X"01",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"01",X"02",X"42",X"02",X"02",X"21",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"28",X"20",X"00",X"03",X"06",X"04",X"06",X"05",X"00",X"00",X"00",X"00", + X"00",X"06",X"00",X"00",X"00",X"00",X"07",X"04",X"00",X"03",X"04",X"04",X"02",X"01",X"02",X"00", + X"00",X"00",X"00",X"10",X"0D",X"12",X"22",X"25",X"18",X"25",X"02",X"04",X"18",X"00",X"00",X"00", + X"00",X"05",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"00",X"01",X"01",X"00",X"00",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"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"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"00",X"06",X"07",X"03",X"00",X"00",X"00",X"0A",X"00", + X"00",X"00",X"00",X"00",X"03",X"00",X"02",X"03",X"03",X"21",X"10",X"00",X"04",X"02",X"02",X"00", + X"00",X"02",X"04",X"00",X"15",X"20",X"20",X"01",X"02",X"02",X"02",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"73",X"7C",X"F0",X"F0",X"CF",X"18",X"14",X"0B",X"18",X"18",X"10",X"00",X"00", + X"0E",X"1F",X"1F",X"1F",X"02",X"0A",X"35",X"74",X"02",X"02",X"01",X"00",X"00",X"01",X"01",X"01", + X"01",X"01",X"01",X"00",X"00",X"01",X"02",X"02",X"74",X"35",X"0A",X"02",X"0F",X"1F",X"1F",X"0E", + X"00",X"00",X"08",X"0C",X"0C",X"05",X"0A",X"0C",X"67",X"F8",X"F8",X"7E",X"39",X"00",X"00",X"00", + X"00",X"31",X"79",X"7A",X"7B",X"7C",X"32",X"11",X"11",X"08",X"08",X"1C",X"26",X"03",X"00",X"00", + X"00",X"00",X"03",X"26",X"1C",X"08",X"08",X"11",X"11",X"32",X"3C",X"3B",X"3E",X"3D",X"19",X"00", + X"0D",X"06",X"0E",X"06",X"06",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3B",X"3D",X"1D",X"1D",X"1F",X"0F",X"0E",X"0F",X"07",X"06",X"07",X"05",X"01",X"01",X"00",X"00", + X"0D",X"06",X"06",X"02",X"02",X"03",X"01",X"01",X"03",X"03",X"03",X"0A",X"00",X"01",X"11",X"0E", + X"3D",X"0D",X"06",X"06",X"03",X"03",X"02",X"00",X"00",X"00",X"00",X"40",X"20",X"32",X"00",X"00", + X"07",X"00",X"00",X"00",X"00",X"02",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"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"1C",X"00",X"00",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"10",X"10",X"17",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1C",X"10",X"00",X"00", + X"10",X"10",X"10",X"17",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1C",X"10",X"00",X"00", + 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"00",X"00", + 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"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"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"1E",X"3E",X"7E",X"7E",X"FE",X"FE",X"FE",X"FC",X"FC",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"00",X"00",X"00", + X"80",X"00",X"00",X"FF",X"26",X"04",X"55",X"55",X"55",X"55",X"55",X"56",X"FF",X"00",X"00",X"80", + X"FF",X"FF",X"FF",X"80",X"00",X"00",X"FF",X"26",X"05",X"55",X"55",X"56",X"FF",X"00",X"00",X"80", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"80",X"00",X"00",X"04",X"55",X"54",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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_MiST/Nintendo Mario Bros/rtl/rom/obj_7u.vhd b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7u.vhd new file mode 100644 index 00000000..dfaaad9f --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/obj_7u.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity obj_7u 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 obj_7u 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"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"80",X"00",X"F0",X"E0",X"00",X"00",X"00",X"40",X"30",X"70",X"60",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"1C",X"1C",X"1C",X"04",X"90",X"6C",X"EC",X"DC",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"38",X"1C",X"14",X"C0",X"F0",X"F8",X"B0",X"40",X"80",X"00",X"00",X"00",X"00", + X"1E",X"1C",X"00",X"00",X"00",X"00",X"00",X"94",X"66",X"EC",X"E0",X"C0",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"F0",X"E0",X"00",X"00",X"00",X"00",X"26",X"9C",X"B8",X"B0",X"60",X"00",X"00",X"00",X"00",X"40", + X"3C",X"38",X"00",X"00",X"00",X"E0",X"E0",X"C0",X"B8",X"30",X"60",X"00",X"00",X"00",X"00",X"60", + X"00",X"00",X"0F",X"00",X"00",X"00",X"8C",X"77",X"E6",X"00",X"00",X"00",X"C0",X"00",X"00",X"00", + X"1C",X"1C",X"1C",X"18",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"06",X"06",X"86",X"52",X"E2",X"C0",X"90",X"38",X"38",X"1C",X"0C", + X"10",X"38",X"70",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"70",X"F8",X"F8",X"E8",X"70",X"78",X"38",X"98",X"80",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"00",X"00",X"00",X"00", + X"08",X"1C",X"0E",X"02",X"02",X"00",X"00",X"44",X"36",X"6E",X"C0",X"00",X"00",X"00",X"00",X"00", + X"88",X"1C",X"0E",X"02",X"02",X"00",X"00",X"44",X"36",X"68",X"C0",X"00",X"00",X"00",X"00",X"00", + X"08",X"1C",X"0E",X"02",X"02",X"00",X"00",X"44",X"06",X"6E",X"C0",X"00",X"00",X"00",X"00",X"00", + X"1E",X"00",X"00",X"00",X"00",X"00",X"54",X"EF",X"DE",X"00",X"00",X"00",X"80",X"C0",X"00",X"00", + X"1E",X"00",X"00",X"00",X"10",X"EF",X"CE",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"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"04",X"04",X"23",X"C0",X"20",X"C8",X"C8",X"0C",X"0C",X"0E",X"04",X"60",X"60",X"00", + X"08",X"08",X"04",X"04",X"23",X"C0",X"20",X"C4",X"CE",X"0E",X"0C",X"08",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"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"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"60",X"74",X"F4",X"EC",X"00",X"00",X"00", + X"00",X"60",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"00",X"00", + X"00",X"04",X"06",X"03",X"03",X"01",X"00",X"00",X"40",X"38",X"68",X"D0",X"00",X"00",X"00",X"00", + X"00",X"04",X"06",X"03",X"03",X"01",X"00",X"20",X"9C",X"34",X"68",X"00",X"00",X"00",X"00",X"40", + X"00",X"00",X"FC",X"FE",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"FE",X"FC", + X"00",X"00",X"18",X"1C",X"BC",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FC",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"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"18",X"1C",X"7C",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FC",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"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"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"FC",X"FC",X"FE",X"FE",X"FE",X"7E",X"7E",X"3E",X"1E",X"06",X"00",X"00",X"00",X"00", + X"7E",X"7E",X"7E",X"7E",X"FE",X"FE",X"FE",X"FC",X"FC",X"F8",X"F0",X"C0",X"00",X"00",X"00",X"00", + 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"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"52",X"52",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"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"7E",X"7E",X"7E",X"7E",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"7E",X"7E",X"7E",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"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"00",X"00",X"00",X"00",X"C0",X"F0",X"F8",X"FC",X"FC",X"FE",X"FE",X"FE",X"7E",X"7E",X"7E",X"7E", + 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"FC",X"FC",X"FC",X"FC", + X"00",X"00",X"00",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"00",X"00",X"00",X"00",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"00",X"00",X"00",X"00",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"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"7C",X"3E",X"0E",X"00",X"00",X"00", + X"7E",X"7E",X"7E",X"7E",X"7E",X"FE",X"FE",X"7E",X"7E",X"7E",X"7C",X"FC",X"EC",X"0C",X"08",X"00", + 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"00",X"00",X"00", + X"F0",X"FC",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7C",X"FC",X"EC",X"0C",X"08",X"00", + 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"00",X"00",X"00", + X"F8",X"FC",X"7E",X"00",X"00",X"F0",X"FC",X"7E",X"7E",X"7E",X"7C",X"FC",X"EC",X"0C",X"08",X"00", + 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"52",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"FE",X"FE",X"FE",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"F0",X"F0",X"F0",X"F0",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"F7",X"F7",X"F7",X"F7",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"C0",X"F0",X"F8",X"FC",X"FC",X"FE",X"FE",X"FE",X"7E",X"7E",X"7E",X"7E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"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"C0",X"E0",X"F8",X"F8",X"BC",X"FC",X"FC",X"F0",X"70",X"F8",X"38",X"9C",X"9F",X"B7",X"24",X"E0", + X"C0",X"E0",X"F8",X"F8",X"BC",X"FD",X"FF",X"F7",X"7E",X"FE",X"3C",X"98",X"90",X"B0",X"20",X"E0", + X"0E",X"1C",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"C0",X"E0",X"F0",X"F0",X"68",X"FA",X"FF",X"FF",X"FF",X"F0",X"F8",X"C0", + X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"FF",X"FF",X"00",X"FF",X"FF",X"00",X"FF",X"FF",X"00", + X"B6",X"B6",X"B6",X"B6",X"B6",X"36",X"76",X"66",X"EE",X"CC",X"9C",X"38",X"F8",X"E0",X"80",X"00", + X"B6",X"B6",X"B6",X"B6",X"B6",X"B6",X"B6",X"B6",X"B6",X"B6",X"B6",X"B6",X"B6",X"B6",X"B6",X"B6", + X"00",X"00",X"00",X"00",X"A0",X"60",X"20",X"60",X"C0",X"80",X"04",X"0E",X"0E",X"0E",X"2E",X"04", + X"00",X"00",X"00",X"00",X"A0",X"60",X"20",X"60",X"C2",X"87",X"07",X"17",X"07",X"02",X"00",X"00", + X"00",X"00",X"80",X"C0",X"40",X"C0",X"40",X"00",X"00",X"00",X"1A",X"38",X"38",X"38",X"38",X"10", + X"00",X"00",X"1C",X"F8",X"C0",X"40",X"C0",X"40",X"00",X"00",X"1A",X"38",X"38",X"38",X"38",X"10", + X"30",X"20",X"C0",X"C0",X"40",X"C0",X"40",X"00",X"00",X"1A",X"38",X"38",X"38",X"38",X"10",X"00", + X"C0",X"80",X"00",X"80",X"C0",X"40",X"C0",X"40",X"00",X"00",X"1A",X"38",X"38",X"38",X"38",X"10", + X"80",X"00",X"80",X"C0",X"40",X"C0",X"40",X"00",X"00",X"1A",X"38",X"38",X"38",X"38",X"10",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"08",X"F0",X"F0",X"70", + X"00",X"00",X"80",X"C0",X"C0",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"08",X"F0",X"F0",X"70", + X"00",X"00",X"E0",X"C0",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"04",X"78",X"78",X"38",X"00", + X"00",X"00",X"00",X"C0",X"00",X"80",X"80",X"80",X"00",X"00",X"00",X"08",X"70",X"70",X"70",X"30", + X"00",X"00",X"E0",X"F0",X"F0",X"F0",X"C0",X"00",X"00",X"01",X"02",X"C0",X"00",X"E0",X"E0",X"E0", + X"A0",X"10",X"A8",X"48",X"48",X"48",X"A8",X"18",X"B0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00", + X"A0",X"10",X"A8",X"48",X"48",X"48",X"A8",X"18",X"B0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"A0",X"60",X"20",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"A0",X"70",X"30",X"70",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"A0",X"64",X"2E",X"6E",X"CE",X"84",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"20",X"C0",X"20",X"10",X"28",X"C0",X"20",X"1C",X"F0",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"20",X"5C",X"84",X"48",X"50",X"E0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"20",X"C4",X"34",X"24",X"48",X"88",X"50",X"60",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"20",X"A0",X"10",X"A8",X"48",X"48",X"48",X"A8",X"18",X"B0",X"E0", + X"00",X"00",X"00",X"20",X"A0",X"10",X"A8",X"48",X"48",X"48",X"A8",X"18",X"B0",X"E0",X"00",X"00", + X"00",X"20",X"A0",X"10",X"A8",X"48",X"48",X"48",X"A8",X"18",X"B0",X"E0",X"00",X"00",X"00",X"00", + X"00",X"F8",X"04",X"00",X"00",X"20",X"C0",X"80",X"80",X"80",X"40",X"20",X"00",X"00",X"00",X"00", + X"00",X"80",X"00",X"08",X"10",X"20",X"D0",X"00",X"80",X"80",X"40",X"20",X"00",X"00",X"00",X"00", + X"80",X"04",X"08",X"10",X"30",X"60",X"D0",X"88",X"80",X"C0",X"60",X"10",X"00",X"00",X"00",X"00", + X"00",X"08",X"30",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"04",X"06",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"10",X"08",X"00",X"00",X"00",X"00",X"20",X"04",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"3E",X"1C",X"08",X"10",X"20",X"40",X"00", + X"FF",X"FF",X"FF",X"FF",X"FE",X"FD",X"FB",X"E0",X"00",X"E0",X"C0",X"80",X"01",X"03",X"07",X"1F", + X"FF",X"FF",X"FF",X"FF",X"FC",X"F2",X"CC",X"3C",X"18",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"FE",X"F8",X"F0",X"01",X"06",X"18",X"E0",X"00",X"01",X"07",X"1F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"03",X"01",X"00",X"FE",X"00",X"00",X"01",X"03", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"F8",X"E0",X"01",X"06",X"18",X"E0",X"00",X"01",X"07",X"1F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F1",X"F1",X"10",X"10",X"01",X"01",X"11",X"11",X"1F",X"1F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"1F",X"11",X"11",X"01",X"01",X"11",X"11",X"F1",X"F1", + X"FF",X"FF",X"FF",X"F1",X"11",X"10",X"00",X"01",X"11",X"11",X"11",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"01",X"01",X"01",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"DF",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"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"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"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"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"F0",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"7E",X"3C",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FE",X"FD",X"FB",X"E6",X"00",X"E0",X"C0",X"00",X"01",X"03",X"07",X"1F", + X"FF",X"FF",X"FF",X"FF",X"FC",X"F2",X"CC",X"3C",X"70",X"00",X"00",X"00",X"03",X"0F",X"3F",X"FF", + X"E0",X"10",X"88",X"34",X"6C",X"42",X"60",X"B0",X"50",X"48",X"28",X"28",X"50",X"B0",X"60",X"80", + X"F0",X"98",X"6C",X"94",X"0A",X"0A",X"0A",X"0A",X"0A",X"12",X"34",X"E4",X"C8",X"10",X"E0",X"00", + X"F0",X"18",X"E8",X"34",X"14",X"0A",X"0A",X"0A",X"8A",X"6A",X"3A",X"B4",X"AC",X"98",X"70",X"C0", + X"00",X"00",X"80",X"E0",X"90",X"00",X"80",X"40",X"A0",X"A0",X"A0",X"A0",X"40",X"80",X"00",X"00", + X"00",X"00",X"00",X"F0",X"88",X"68",X"94",X"14",X"14",X"34",X"C8",X"10",X"E0",X"00",X"00",X"00", + X"00",X"00",X"E0",X"30",X"D0",X"28",X"28",X"28",X"A8",X"58",X"90",X"50",X"E0",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"A0",X"00",X"00",X"80",X"40",X"40",X"40",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"60",X"90",X"60",X"A0",X"D0",X"20",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"40",X"A0",X"50",X"50",X"90",X"50",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"10",X"00",X"00",X"08",X"00",X"00",X"10",X"80",X"00",X"00",X"00",X"00", + X"80",X"02",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"80",X"00", + X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"40",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"20",X"40",X"00",X"00",X"00",X"00", + X"00",X"20",X"10",X"90",X"48",X"48",X"48",X"48",X"48",X"00",X"10",X"20",X"00",X"00",X"00",X"00", + X"00",X"E0",X"D0",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8",X"D0",X"E0",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"E0",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"C0",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00", + X"0C",X"0C",X"00",X"E0",X"1F",X"00",X"A0",X"70",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"C4",X"20",X"00",X"00",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"C0",X"24",X"00",X"00",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"C0",X"28",X"00",X"00",X"80",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00", + X"00",X"00",X"80",X"80",X"80",X"80",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"20", + X"00",X"00",X"80",X"80",X"80",X"80",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"20", + X"00",X"00",X"80",X"88",X"80",X"80",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"20", + X"00",X"A0",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"00",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"A0",X"00",X"00",X"00",X"00",X"00",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"00",X"00",X"00",X"00",X"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"44",X"40",X"C0",X"42",X"02",X"00",X"60",X"E0",X"E8",X"E0",X"E0",X"40", + X"00",X"E0",X"F0",X"FC",X"D8",X"48",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"C0",X"80",X"80", + X"00",X"C0",X"EE",X"F0",X"70",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"C8",X"FC",X"E2",X"D5",X"48",X"C8",X"B4",X"48",X"40",X"20",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"F0",X"10",X"1F",X"FF",X"F0",X"30",X"30",X"30",X"30",X"10",X"10",X"30",X"30",X"F0", + X"67",X"63",X"61",X"30",X"18",X"0F",X"07",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"00",X"E6",X"F6",X"FE",X"EE",X"E6",X"E6",X"7E",X"E6",X"E6",X"EE",X"FE",X"F6", + X"00",X"00",X"80",X"E0",X"70",X"38",X"1C",X"8C",X"CC",X"66",X"66",X"66",X"66",X"66",X"E6",X"FE", + X"66",X"67",X"63",X"31",X"18",X"0C",X"07",X"03",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"66",X"66",X"66",X"E6",X"FE",X"33",X"33",X"33",X"00", + X"FE",X"30",X"30",X"30",X"00",X"66",X"66",X"66",X"66",X"66",X"66",X"66",X"66",X"66",X"66",X"66", + X"00",X"00",X"00",X"60",X"C0",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"0C",X"12",X"07",X"E7", + X"FF",X"FF",X"F0",X"10",X"1F",X"FF",X"F0",X"30",X"30",X"30",X"30",X"10",X"10",X"30",X"30",X"F0", + X"FF",X"FF",X"70",X"10",X"9F",X"FF",X"70",X"30",X"30",X"30",X"30",X"10",X"10",X"30",X"30",X"70", + X"FF",X"F0",X"10",X"1F",X"FF",X"F0",X"B0",X"30",X"30",X"30",X"30",X"30",X"10",X"10",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"00",X"00",X"00", + X"00",X"00",X"80",X"80",X"80",X"80",X"00",X"80",X"00",X"00",X"00",X"80",X"00",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"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"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"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"5C",X"70",X"E0",X"14",X"1C",X"78",X"80",X"00",X"00",X"30",X"F8",X"F8",X"F8",X"70", + X"00",X"9E",X"5C",X"70",X"E4",X"1C",X"18",X"70",X"90",X"1C",X"1E",X"1E",X"AE",X"1C",X"00",X"00", + X"3C",X"B8",X"50",X"60",X"E0",X"1C",X"1E",X"7E",X"9E",X"1C",X"00",X"00",X"A0",X"18",X"00",X"00", + X"CE",X"2C",X"FA",X"D6",X"3C",X"78",X"98",X"18",X"04",X"00",X"A0",X"18",X"00",X"00",X"00",X"00", + X"03",X"0F",X"1E",X"9C",X"78",X"10",X"10",X"E0",X"30",X"50",X"A0",X"30",X"30",X"10",X"00",X"00", + X"03",X"0F",X"1E",X"9C",X"78",X"10",X"10",X"E0",X"30",X"4C",X"8E",X"00",X"00",X"00",X"00",X"00", + X"00",X"F8",X"04",X"00",X"00",X"00",X"00",X"A0",X"A0",X"A0",X"B0",X"D0",X"80",X"80",X"80",X"00", + X"00",X"F8",X"04",X"00",X"00",X"00",X"FC",X"B8",X"B8",X"B8",X"B0",X"D0",X"80",X"80",X"80",X"00", + X"00",X"F8",X"04",X"FE",X"AE",X"5C",X"FC",X"B8",X"B8",X"B8",X"B0",X"D0",X"80",X"80",X"80",X"00", + X"FC",X"FE",X"FE",X"AE",X"5E",X"FC",X"FC",X"B8",X"B8",X"B8",X"B0",X"D0",X"80",X"80",X"80",X"00", + X"00",X"F8",X"04",X"00",X"00",X"00",X"00",X"A0",X"A0",X"A0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"F8",X"04",X"00",X"00",X"00",X"00",X"A0",X"A0",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"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"E0",X"E0",X"E0",X"E0",X"E0",X"E0",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"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",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"80",X"80", + X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"80",X"80",X"80",X"80",X"80", + X"00",X"00",X"40",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"20",X"40",X"80",X"80",X"80", + X"00",X"00",X"20",X"10",X"90",X"48",X"48",X"48",X"48",X"48",X"08",X"10",X"20",X"80",X"80",X"80", + X"00",X"00",X"E0",X"D0",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8",X"D0",X"E0",X"80",X"80",X"80", + X"00",X"00",X"C0",X"E0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"E0",X"C0",X"80",X"80",X"80", + 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"80",X"80",X"80",X"80", + X"00",X"00",X"00",X"C0",X"80",X"40",X"40",X"40",X"40",X"40",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"60",X"10",X"68",X"34",X"14",X"00",X"14",X"34",X"68",X"10",X"60",X"00",X"00",X"00", + X"70",X"78",X"0C",X"76",X"1B",X"0B",X"0B",X"00",X"0B",X"0B",X"1B",X"76",X"0C",X"78",X"70",X"00", + X"00",X"F0",X"F8",X"FC",X"1E",X"0E",X"8E",X"CE",X"8E",X"0E",X"1E",X"FC",X"F8",X"F0",X"00",X"00", + X"00",X"00",X"00",X"E0",X"F8",X"38",X"98",X"D8",X"98",X"38",X"F8",X"F0",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"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"30",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"40",X"40",X"40",X"C0",X"E0",X"00", + X"00",X"00",X"00",X"00",X"C0",X"E0",X"E0",X"E0",X"60",X"40",X"40",X"00",X"00",X"40",X"60",X"00", + X"00",X"00",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"50",X"50",X"50",X"50",X"58",X"58",X"10", + X"00",X"00",X"40",X"40",X"40",X"40",X"00",X"40",X"40",X"40",X"40",X"50",X"50",X"58",X"58",X"10", + X"00",X"00",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"50",X"50",X"50",X"58",X"58",X"10", + X"00",X"00",X"00",X"00",X"A0",X"60",X"20",X"60",X"C0",X"80",X"04",X"14",X"00",X"00",X"00",X"00", + X"00",X"40",X"80",X"40",X"20",X"20",X"C0",X"00",X"20",X"E0",X"00",X"00",X"00",X"00",X"60",X"00", + X"00",X"00",X"00",X"18",X"20",X"40",X"A4",X"18",X"A4",X"44",X"48",X"B0",X"08",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"0E",X"90",X"60",X"90",X"08",X"90",X"60",X"90",X"08", + X"00",X"40",X"00",X"00",X"00",X"00",X"80",X"40",X"A0",X"10",X"A8",X"48",X"44",X"B4",X"40",X"00", + X"00",X"00",X"04",X"84",X"40",X"40",X"42",X"40",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"50",X"80",X"80",X"20",X"10",X"10",X"D0",X"20",X"00",X"40",X"40",X"00",X"00",X"00",X"00", + X"00",X"40",X"20",X"20",X"98",X"64",X"24",X"90",X"50",X"40",X"40",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"60",X"D0",X"D0",X"D0",X"84",X"04",X"28",X"00",X"20",X"40",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"20",X"E0",X"C0",X"80",X"00",X"00",X"00",X"A0",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"20",X"A0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"60",X"E0",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"9C",X"7E",X"1F",X"1F",X"E6",X"30",X"50",X"A0",X"30",X"30",X"10",X"00",X"00", + X"00",X"80",X"C0",X"64",X"38",X"10",X"10",X"88",X"88",X"4C",X"3C",X"DC",X"FC",X"BC",X"98",X"00", + X"00",X"8C",X"9E",X"5E",X"DE",X"3C",X"4C",X"88",X"88",X"10",X"10",X"38",X"64",X"C0",X"00",X"00", + X"00",X"00",X"08",X"18",X"18",X"D0",X"28",X"18",X"F3",X"0F",X"0F",X"3E",X"CC",X"80",X"80",X"80", + X"80",X"80",X"80",X"00",X"00",X"80",X"40",X"40",X"2E",X"AC",X"58",X"40",X"F0",X"F8",X"F8",X"70", + X"30",X"F8",X"F8",X"F8",X"40",X"50",X"AC",X"2E",X"40",X"40",X"80",X"00",X"00",X"80",X"80",X"80", + X"E0",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"C8",X"D0",X"B0",X"A0",X"40",X"40",X"C0",X"C0",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00", + X"F0",X"E0",X"E0",X"C0",X"C0",X"80",X"80",X"80",X"C0",X"C0",X"C0",X"50",X"00",X"80",X"40",X"20", + X"F8",X"F0",X"E0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"04",X"00",X"00",X"06",X"0C",X"00",X"00", + X"80",X"00",X"02",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"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"07",X"07",X"07",X"7F",X"E7",X"E7",X"E7",X"E7",X"7F",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"FD",X"FF",X"FF",X"FF",X"CF",X"FF",X"FF",X"FF",X"FF",X"07",X"01",X"00",X"00", + X"01",X"01",X"01",X"FD",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"07",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"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"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"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",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"01",X"00",X"00",X"FF",X"7C",X"3C",X"30",X"2C",X"2C",X"2C",X"2C",X"70",X"FF",X"00",X"00",X"01", + X"FF",X"FF",X"FF",X"01",X"00",X"00",X"FF",X"7C",X"30",X"2C",X"2C",X"70",X"FF",X"00",X"00",X"01", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"01",X"00",X"00",X"30",X"2C",X"20",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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_MiST/Nintendo Mario Bros/rtl/rom/snd_rom.vhd b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/snd_rom.vhd new file mode 100644 index 00000000..86fc3197 --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/rom/snd_rom.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity snd_rom 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 snd_rom is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"34",X"00",X"86",X"15",X"E5",X"14",X"51",X"34",X"46",X"B9",X"08",X"BA",X"04",X"BB",X"00",X"23", + X"AA",X"AF",X"AE",X"B8",X"40",X"B0",X"02",X"94",X"10",X"94",X"10",X"FA",X"97",X"A7",X"F7",X"AA", + X"94",X"10",X"94",X"10",X"FA",X"97",X"F7",X"AA",X"E9",X"17",X"86",X"2A",X"B9",X"0E",X"BA",X"30", + X"B8",X"22",X"27",X"A0",X"18",X"A0",X"B8",X"40",X"A0",X"F4",X"00",X"F4",X"00",X"F4",X"69",X"F4", + X"0D",X"F4",X"0D",X"F4",X"69",X"F4",X"1A",X"F4",X"1A",X"F4",X"69",X"E9",X"39",X"05",X"34",X"13", + X"24",X"93",X"BA",X"30",X"B8",X"22",X"B0",X"00",X"18",X"B0",X"00",X"BB",X"00",X"B8",X"40",X"B0", + X"01",X"34",X"55",X"14",X"6F",X"80",X"92",X"63",X"14",X"6F",X"80",X"92",X"52",X"04",X"68",X"34", + X"55",X"B8",X"23",X"F0",X"03",X"1C",X"A0",X"F6",X"A5",X"83",X"B9",X"0C",X"BA",X"10",X"27",X"B8", + X"22",X"A0",X"18",X"A0",X"AB",X"85",X"95",X"A5",X"F4",X"00",X"14",X"A8",X"E9",X"88",X"F4",X"00", + X"14",X"A8",X"80",X"B2",X"8E",X"1A",X"F4",X"00",X"14",X"A8",X"80",X"B2",X"7A",X"B8",X"23",X"F0", + X"03",X"08",X"A0",X"E6",X"95",X"34",X"13",X"B3",X"80",X"F2",X"A5",X"D2",X"A5",X"09",X"53",X"0F", + X"96",X"A5",X"36",X"A5",X"56",X"A5",X"83",X"BA",X"0A",X"B8",X"22",X"B0",X"01",X"18",X"B0",X"00", + X"85",X"95",X"A5",X"F4",X"64",X"F6",X"A5",X"B8",X"23",X"F0",X"03",X"14",X"F6",X"A5",X"F4",X"00", + X"80",X"F2",X"A5",X"F4",X"00",X"80",X"F2",X"A5",X"F4",X"00",X"80",X"F2",X"A5",X"14",X"C3",X"F6", + X"A5",X"C6",X"B9",X"60",X"BA",X"FF",X"BB",X"00",X"27",X"AE",X"AF",X"B8",X"40",X"B0",X"02",X"85", + X"94",X"10",X"C9",X"F9",X"C6",X"A5",X"53",X"0F",X"96",X"F0",X"FA",X"97",X"67",X"AA",X"04",X"F0", + X"F6",X"55",X"27",X"B8",X"20",X"A0",X"B8",X"21",X"A0",X"B8",X"24",X"A0",X"D5",X"AE",X"AF",X"C5", + X"34",X"13",X"E9",X"34",X"45",X"36",X"6B",X"56",X"C5",X"09",X"12",X"37",X"32",X"F2",X"52",X"39", + X"72",X"3B",X"80",X"F2",X"43",X"D2",X"41",X"B2",X"3F",X"92",X"3D",X"53",X"0F",X"03",X"F9",X"C6", + X"35",X"94",X"10",X"24",X"13",X"44",X"3D",X"44",X"2A",X"44",X"00",X"24",X"8D",X"04",X"52",X"04", + X"7A",X"04",X"B7",X"04",X"E2",X"05",X"C5",X"27",X"AE",X"AF",X"85",X"A5",X"B8",X"40",X"A0",X"B8", + X"22",X"A0",X"18",X"A0",X"83",X"85",X"95",X"A5",X"B5",X"F4",X"0D",X"F4",X"0D",X"83",X"85",X"95", + X"A5",X"B5",X"F4",X"0D",X"36",X"6B",X"F4",X"0D",X"36",X"6B",X"83",X"B9",X"02",X"BA",X"60",X"B8", + X"22",X"B0",X"00",X"18",X"B0",X"00",X"B8",X"40",X"B0",X"01",X"34",X"55",X"E9",X"7A",X"BA",X"80", + X"34",X"5E",X"B8",X"23",X"F0",X"03",X"0D",X"A0",X"E6",X"80",X"34",X"13",X"E9",X"B9",X"04",X"BA", + X"40",X"B8",X"22",X"B0",X"00",X"18",X"B0",X"00",X"B8",X"40",X"B0",X"01",X"34",X"B6",X"B9",X"04", + X"B8",X"23",X"B0",X"00",X"BB",X"00",X"F4",X"58",X"34",X"B6",X"B9",X"40",X"B8",X"23",X"B0",X"00", + X"BB",X"00",X"F4",X"58",X"34",X"B6",X"F4",X"64",X"34",X"5E",X"B8",X"23",X"F0",X"03",X"10",X"A0", + X"F6",X"13",X"E9",X"B6",X"83",X"B9",X"06",X"BA",X"20",X"B8",X"22",X"B0",X"00",X"18",X"B0",X"00", + X"85",X"95",X"A5",X"F4",X"00",X"E9",X"D3",X"F4",X"69",X"B8",X"23",X"F0",X"03",X"08",X"A0",X"F6", + X"13",X"F4",X"00",X"F4",X"00",X"E6",X"D7",X"C6",X"D7",X"17",X"C6",X"D7",X"F9",X"E3",X"96",X"D7", + X"24",X"D5",X"B9",X"10",X"BA",X"40",X"BB",X"00",X"F4",X"69",X"F4",X"00",X"E9",X"F8",X"24",X"13", + X"B9",X"30",X"BA",X"20",X"BB",X"40",X"B8",X"38",X"B0",X"04",X"F4",X"58",X"F4",X"1A",X"B8",X"38", + X"F0",X"07",X"A0",X"C6",X"19",X"E9",X"0A",X"24",X"13",X"B0",X"04",X"F4",X"5D",X"F4",X"1A",X"B8", + X"38",X"F0",X"07",X"A0",X"C6",X"06",X"E9",X"1B",X"24",X"13",X"B9",X"10",X"BA",X"30",X"B8",X"22", + X"B0",X"E8",X"18",X"B0",X"E0",X"F4",X"58",X"F4",X"0D",X"E9",X"35",X"24",X"13",X"B8",X"30",X"B0", + X"45",X"18",X"B0",X"0C",X"B8",X"40",X"B0",X"04",X"A5",X"27",X"62",X"44",X"68",X"80",X"F2",X"54", + X"53",X"0F",X"96",X"56",X"24",X"13",X"94",X"10",X"E5",X"B8",X"23",X"F0",X"03",X"08",X"E6",X"65", + X"27",X"AE",X"AF",X"44",X"66",X"A0",X"E9",X"4D",X"D4",X"9F",X"F8",X"C6",X"3D",X"44",X"4D",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"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"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"40",X"44",X"48",X"4C",X"50",X"54",X"58",X"5C",X"60",X"64",X"68",X"6C",X"70",X"74",X"78",X"7C", + X"60",X"03",X"06",X"09",X"0C",X"0F",X"12",X"15",X"18",X"1B",X"1E",X"21",X"24",X"27",X"2A",X"2D", + X"30",X"33",X"36",X"39",X"3C",X"3F",X"42",X"45",X"48",X"4B",X"4E",X"51",X"54",X"57",X"5A",X"5D", + X"40",X"02",X"04",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"28",X"2A",X"2C",X"2E",X"30",X"32",X"34",X"36",X"38",X"3A",X"3C",X"3E", + X"30",X"01",X"03",X"04",X"06",X"07",X"09",X"0A",X"0C",X"0D",X"0F",X"10",X"12",X"13",X"15",X"16", + X"18",X"19",X"1B",X"1C",X"1E",X"1F",X"21",X"22",X"24",X"25",X"27",X"28",X"2A",X"2B",X"2D",X"2E", + X"20",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"18",X"00",X"01",X"02",X"03",X"03",X"04",X"05",X"06",X"06",X"07",X"08",X"09",X"09",X"0A",X"0B", + X"0C",X"0C",X"0D",X"0E",X"0F",X"0F",X"10",X"11",X"12",X"12",X"13",X"14",X"15",X"15",X"16",X"17", + X"10",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"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"0C",X"00",X"00",X"01",X"01",X"01",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"06",X"07",X"07",X"07",X"08",X"08",X"09",X"09",X"09",X"0A",X"0A",X"0A",X"0B",X"0B", + X"00",X"E0",X"01",X"80",X"20",X"40",X"C0",X"00",X"04",X"10",X"09",X"12",X"13",X"60",X"05",X"A0", + X"D5",X"B8",X"20",X"80",X"53",X"0F",X"20",X"37",X"17",X"60",X"96",X"55",X"B8",X"21",X"F0",X"C6", + X"3C",X"F2",X"E2",X"D2",X"E4",X"B2",X"E6",X"52",X"D2",X"E9",X"3C",X"FF",X"96",X"31",X"FE",X"C6", + X"91",X"FA",X"03",X"F8",X"A9",X"F6",X"39",X"B9",X"01",X"27",X"AE",X"AF",X"B8",X"40",X"F0",X"12", + X"48",X"32",X"4B",X"52",X"4E",X"F5",X"24",X"6F",X"F5",X"44",X"00",X"F5",X"44",X"7E",X"F5",X"24", + X"00",X"B8",X"21",X"B0",X"00",X"B8",X"21",X"F0",X"03",X"FC",X"C6",X"D2",X"B8",X"20",X"F0",X"A3", + X"92",X"E8",X"72",X"EA",X"F2",X"DC",X"D2",X"DE",X"B2",X"E0",X"52",X"AA",X"B8",X"21",X"F0",X"F2", + X"E2",X"D2",X"E4",X"B2",X"E6",X"52",X"D2",X"12",X"29",X"B0",X"00",X"B8",X"20",X"F0",X"A3",X"52", + X"AC",X"C6",X"EC",X"B8",X"21",X"A0",X"E7",X"43",X"F0",X"A8",X"B9",X"30",X"B1",X"03",X"19",X"B1", + X"0B",X"B8",X"30",X"D4",X"36",X"B8",X"20",X"F9",X"C6",X"51",X"B9",X"08",X"B8",X"24",X"B0",X"00", + X"FA",X"03",X"F8",X"F6",X"3C",X"FA",X"07",X"A9",X"84",X"3C",X"12",X"6C",X"B8",X"21",X"A0",X"12", + X"BA",X"B9",X"32",X"B1",X"14",X"19",X"B1",X"0B",X"84",X"C1",X"B9",X"32",X"B1",X"27",X"19",X"B1", + X"0B",X"B8",X"32",X"D4",X"36",X"B8",X"20",X"F9",X"C6",X"51",X"B8",X"24",X"B0",X"00",X"FA",X"A9", + X"84",X"3C",X"B8",X"24",X"F0",X"03",X"10",X"A0",X"E9",X"3C",X"84",X"C1",X"A4",X"00",X"A4",X"2B", + X"A4",X"4B",X"A4",X"0F",X"A4",X"38",X"A4",X"56",X"C4",X"5F",X"C4",X"B7",X"27",X"AE",X"AF",X"84", + 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"D2",X"6D",X"B8",X"21",X"A0",X"B2",X"9D",X"B9",X"18",X"BA",X"20",X"B8",X"24",X"B0",X"20",X"D2", + X"80",X"B2",X"A5",X"F4",X"3F",X"6A",X"AA",X"F6",X"F2",X"F9",X"12",X"E5",X"FA",X"03",X"80",X"E6", + X"E5",X"B8",X"24",X"F0",X"03",X"20",X"A0",X"A4",X"E5",X"84",X"3C",X"B8",X"21",X"A0",X"B2",X"B9", + X"B9",X"18",X"BA",X"40",X"B8",X"24",X"B0",X"00",X"B2",X"C1",X"F4",X"58",X"F6",X"F2",X"F9",X"03", + X"F2",X"F6",X"58",X"B8",X"24",X"F0",X"03",X"10",X"A0",X"A4",X"58",X"B8",X"21",X"A0",X"B9",X"28", + X"BA",X"60",X"B8",X"24",X"B0",X"00",X"F4",X"69",X"F9",X"53",X"03",X"C6",X"69",X"12",X"64",X"F4", + X"31",X"6A",X"A4",X"E6",X"F4",X"37",X"6A",X"A4",X"E6",X"F4",X"69",X"A4",X"E5",X"37",X"B2",X"74", + X"C5",X"F5",X"04",X"05",X"B8",X"21",X"B0",X"C0",X"B9",X"28",X"BA",X"30",X"B8",X"24",X"B0",X"00", + X"F9",X"03",X"E0",X"96",X"89",X"BA",X"48",X"A4",X"96",X"F6",X"E5",X"F9",X"53",X"03",X"96",X"96", + X"B8",X"24",X"F0",X"03",X"20",X"A0",X"F9",X"12",X"E5",X"F4",X"69",X"A4",X"E5",X"B9",X"80",X"BA", + X"E0",X"B8",X"24",X"B0",X"00",X"F9",X"12",X"AC",X"F4",X"69",X"E6",X"F2",X"F9",X"03",X"F0",X"F6", + X"E5",X"B8",X"24",X"F0",X"03",X"10",X"A0",X"A4",X"E5",X"B9",X"B0",X"BA",X"80",X"B8",X"24",X"B0", + X"00",X"F9",X"47",X"53",X"0F",X"03",X"FA",X"E6",X"D0",X"C6",X"E1",X"A8",X"E8",X"E1",X"A4",X"D0", + X"F4",X"64",X"F6",X"F2",X"F9",X"03",X"F0",X"F6",X"58",X"B8",X"24",X"F0",X"03",X"10",X"A0",X"A4", + X"58",X"F4",X"69",X"A4",X"58",X"FA",X"47",X"E7",X"AE",X"53",X"1F",X"AF",X"FE",X"53",X"E0",X"AE", + X"E9",X"29",X"B8",X"21",X"B0",X"00",X"84",X"EC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"2D",X"24",X"2F",X"D3",X"32",X"AB",X"35",X"AF",X"38",X"E0",X"00",X"00",X"3C",X"42",X"3F",X"D7", + X"43",X"A3",X"47",X"A9",X"4B",X"EB",X"50",X"6F",X"55",X"38",X"F0",X"96",X"20",X"18",X"10",X"C8", + X"18",X"F0",X"37",X"17",X"03",X"0B",X"C6",X"2A",X"C4",X"30",X"C8",X"F0",X"10",X"F5",X"64",X"00", + X"C8",X"F0",X"10",X"F5",X"84",X"5A",X"D4",X"1A",X"A9",X"F2",X"41",X"C6",X"5E",X"AA",X"D4",X"1A", + X"A9",X"F9",X"53",X"0F",X"E7",X"A8",X"A3",X"AF",X"F8",X"17",X"A3",X"AE",X"F9",X"53",X"30",X"47", + X"A8",X"FF",X"97",X"67",X"AF",X"FE",X"67",X"AE",X"18",X"F8",X"03",X"FB",X"96",X"51",X"83",X"F4", + X"70",X"D4",X"9F",X"D4",X"AA",X"27",X"62",X"F5",X"34",X"00",X"E5",X"80",X"53",X"0F",X"03",X"F6", + X"96",X"74",X"84",X"10",X"B8",X"23",X"F0",X"03",X"08",X"E6",X"80",X"27",X"AE",X"AF",X"C4",X"81", + X"A0",X"E9",X"88",X"D4",X"9F",X"F8",X"C6",X"DC",X"D5",X"B8",X"24",X"F0",X"03",X"08",X"E6",X"95", + X"27",X"AE",X"AF",X"C4",X"96",X"A0",X"E9",X"67",X"D4",X"AA",X"F8",X"C6",X"DC",X"C4",X"67",X"B8", + X"23",X"B0",X"00",X"C5",X"B8",X"30",X"D4",X"36",X"C4",X"B3",X"B8",X"24",X"B0",X"00",X"D5",X"B8", + X"32",X"D4",X"36",X"FA",X"29",X"A8",X"83",X"F4",X"70",X"85",X"A5",X"D4",X"A3",X"B8",X"23",X"B0", + X"20",X"D4",X"AE",X"B8",X"24",X"B0",X"20",X"27",X"62",X"F5",X"34",X"00",X"E5",X"E9",X"D4",X"D4", + X"9F",X"F8",X"C6",X"DC",X"D5",X"E9",X"C9",X"D4",X"AA",X"F8",X"96",X"C9",X"27",X"D5",X"AE",X"AF", + X"C5",X"AE",X"AF",X"24",X"13",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FA",X"47",X"E7",X"AE",X"53",X"1F",X"AF",X"FE",X"53",X"E0",X"AE",X"84",X"10",X"FA",X"77",X"77", + X"AE",X"53",X"3F",X"AF",X"FE",X"53",X"C0",X"AE",X"84",X"10",X"FA",X"77",X"AE",X"53",X"7F",X"AF", + X"FE",X"53",X"80",X"AE",X"84",X"10",X"FE",X"6F",X"E6",X"2B",X"1F",X"6F",X"E6",X"2F",X"1F",X"AE", + X"83",X"FA",X"97",X"67",X"C6",X"56",X"83",X"FA",X"77",X"77",X"53",X"3F",X"C6",X"56",X"83",X"FA", + X"47",X"E7",X"53",X"1F",X"C6",X"56",X"83",X"FA",X"47",X"53",X"0F",X"C6",X"56",X"83",X"FA",X"47", + X"77",X"53",X"07",X"C6",X"56",X"83",X"17",X"83",X"F4",X"47",X"6A",X"AA",X"83",X"F4",X"47",X"37", + X"17",X"6A",X"AA",X"83",X"F4",X"4E",X"6A",X"AA",X"83",X"F4",X"4E",X"37",X"17",X"6A",X"AA",X"83", + X"53",X"07",X"E7",X"E7",X"43",X"F0",X"A8",X"B9",X"30",X"A3",X"A1",X"18",X"19",X"F8",X"A3",X"A1", + X"18",X"19",X"F8",X"A3",X"A1",X"18",X"19",X"F8",X"A3",X"A1",X"83",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"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"0B",X"35",X"0B",X"43",X"0B",X"60",X"0B",X"78",X"0B",X"9E",X"0B",X"EB",X"0B",X"F7",X"0B", + X"9A",X"DF",X"E5",X"34",X"01",X"15",X"B9",X"08",X"BA",X"18",X"B8",X"23",X"B0",X"00",X"18",X"B0", + X"00",X"14",X"2A",X"B9",X"80",X"BA",X"18",X"B8",X"23",X"B0",X"00",X"18",X"B0",X"00",X"14",X"2A", + X"D5",X"BE",X"00",X"BF",X"00",X"C5",X"05",X"E5",X"34",X"13",X"FA",X"47",X"E7",X"AE",X"53",X"1F", + X"AF",X"FE",X"53",X"E0",X"AE",X"D5",X"AE",X"C5",X"FF",X"D5",X"AF",X"E5",X"F4",X"26",X"F4",X"26", + X"F5",X"C5",X"14",X"5E",X"E5",X"F4",X"4E",X"F5",X"37",X"17",X"6A",X"AA",X"E6",X"20",X"B8",X"23", + X"F0",X"03",X"10",X"A0",X"18",X"F0",X"03",X"10",X"A0",X"F6",X"20",X"E9",X"2A",X"83",X"C5",X"16", + X"61",X"FC",X"6E",X"AC",X"FD",X"7F",X"AD",X"E6",X"70",X"B8",X"23",X"F0",X"53",X"E0",X"AB",X"FD", + X"77",X"77",X"53",X"3F",X"B2",X"79",X"27",X"04",X"7B",X"FB",X"E3",X"A8",X"D5",X"FC",X"6E",X"AC", + X"FD",X"7F",X"AD",X"E6",X"8C",X"B8",X"24",X"F0",X"53",X"E0",X"AB",X"FD",X"77",X"77",X"53",X"3F", + X"B2",X"95",X"27",X"04",X"97",X"FB",X"E3",X"C5",X"68",X"90",X"16",X"9E",X"04",X"61",X"83",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"15",X"C5",X"16",X"04",X"FC",X"6E",X"AC",X"FD",X"7F",X"AD",X"F6",X"13",X"8A",X"20",X"00",X"9A", + X"DF",X"24",X"1A",X"B8",X"23",X"F0",X"53",X"E0",X"AB",X"FD",X"77",X"77",X"53",X"3F",X"96",X"28", + X"8A",X"20",X"A3",X"9A",X"DF",X"27",X"24",X"34",X"B2",X"2E",X"00",X"00",X"24",X"32",X"37",X"17", + X"53",X"1F",X"6B",X"E3",X"A8",X"D5",X"FC",X"6E",X"AC",X"FD",X"7F",X"AD",X"F6",X"45",X"8A",X"20", + X"00",X"9A",X"DF",X"24",X"4C",X"B8",X"24",X"F0",X"53",X"E0",X"AB",X"FD",X"77",X"77",X"53",X"3F", + X"96",X"5A",X"8A",X"20",X"A3",X"9A",X"DF",X"27",X"24",X"66",X"B2",X"60",X"00",X"00",X"24",X"64", + X"37",X"17",X"53",X"1F",X"6B",X"E3",X"C5",X"68",X"90",X"16",X"6D",X"24",X"04",X"05",X"83",X"15", + X"C5",X"16",X"73",X"FC",X"6E",X"AC",X"FD",X"7F",X"AD",X"E6",X"D8",X"B6",X"DA",X"B8",X"22",X"F0", + X"18",X"60",X"A0",X"53",X"E0",X"AB",X"FD",X"77",X"77",X"53",X"3F",X"96",X"95",X"8A",X"20",X"A3", + X"9A",X"DF",X"27",X"24",X"A1",X"B2",X"9B",X"00",X"00",X"24",X"9F",X"37",X"17",X"53",X"1F",X"6B", + X"E3",X"A8",X"D5",X"FC",X"6E",X"AC",X"FD",X"7F",X"AD",X"F6",X"AD",X"24",X"B4",X"B8",X"24",X"F0", + X"53",X"E0",X"AB",X"FD",X"77",X"77",X"53",X"3F",X"96",X"C2",X"8A",X"20",X"A3",X"9A",X"DF",X"27", + X"24",X"CE",X"B2",X"C8",X"00",X"00",X"24",X"CC",X"37",X"17",X"53",X"1F",X"6B",X"E3",X"C5",X"68", + X"90",X"16",X"D5",X"24",X"73",X"05",X"E5",X"83",X"24",X"87",X"B5",X"76",X"E6",X"FE",X"97",X"F7", + X"AE",X"FF",X"F7",X"AF",X"24",X"7D",X"FF",X"97",X"67",X"AF",X"FE",X"67",X"AE",X"24",X"7D",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"15",X"C5",X"16",X"04",X"FC",X"6E",X"AC",X"FD",X"7F",X"AD",X"E6",X"66",X"B6",X"68",X"B8",X"23", + X"F0",X"53",X"E0",X"AB",X"FD",X"77",X"77",X"53",X"3F",X"96",X"23",X"8A",X"20",X"A3",X"9A",X"DF", + X"27",X"44",X"2F",X"B2",X"29",X"00",X"00",X"44",X"2D",X"37",X"17",X"53",X"1F",X"6B",X"E3",X"A8", + X"D5",X"FC",X"6E",X"AC",X"FD",X"7F",X"AD",X"F6",X"3B",X"44",X"42",X"B8",X"24",X"F0",X"53",X"E0", + X"AB",X"FD",X"77",X"77",X"53",X"3F",X"96",X"50",X"8A",X"20",X"A3",X"9A",X"DF",X"27",X"44",X"5C", + X"B2",X"56",X"00",X"00",X"44",X"5A",X"37",X"17",X"53",X"1F",X"6B",X"E3",X"C5",X"68",X"90",X"16", + X"63",X"44",X"04",X"05",X"E5",X"83",X"44",X"15",X"76",X"74",X"FE",X"97",X"F7",X"AE",X"FF",X"F7", + X"AF",X"85",X"44",X"0E",X"FF",X"97",X"67",X"AF",X"FE",X"67",X"AE",X"A5",X"44",X"0E",X"C5",X"16", + X"81",X"FF",X"96",X"85",X"1F",X"FE",X"6C",X"AC",X"FF",X"5A",X"7D",X"AD",X"B6",X"90",X"E6",X"A7", + X"FF",X"77",X"AF",X"FE",X"67",X"AE",X"FF",X"F6",X"A1",X"12",X"A3",X"53",X"7F",X"AF",X"FD",X"44", + X"A7",X"12",X"9B",X"43",X"80",X"AF",X"FD",X"77",X"77",X"53",X"3F",X"96",X"B3",X"A3",X"A3",X"A3", + X"27",X"44",X"BF",X"B2",X"B9",X"00",X"00",X"44",X"BD",X"37",X"17",X"53",X"1F",X"6B",X"E3",X"A8", + X"D5",X"FC",X"6E",X"AC",X"FD",X"7F",X"AD",X"F6",X"CB",X"44",X"D2",X"B8",X"24",X"F0",X"53",X"E0", + X"AB",X"FD",X"77",X"77",X"53",X"3F",X"96",X"DE",X"A3",X"A3",X"A3",X"27",X"44",X"EA",X"B2",X"E4", + X"00",X"00",X"44",X"E8",X"37",X"17",X"53",X"1F",X"6B",X"E3",X"C5",X"68",X"90",X"16",X"F1",X"44", + X"85",X"E5",X"83",X"44",X"A7",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"A3",X"E5",X"83",X"0C",X"A0",X"A0",X"A4",X"18",X"A8",X"0C",X"A4",X"06",X"A8",X"A9",X"AA",X"AB", + X"AC",X"0C",X"B0",X"00",X"08",X"BC",X"B7",X"BC",X"B7",X"BC",X"B7",X"BC",X"B7",X"BC",X"B7",X"BC", + X"B7",X"BC",X"B7",X"BC",X"10",X"B7",X"00",X"08",X"BA",X"00",X"0A",X"AC",X"AA",X"14",X"A8",X"A8", + X"A8",X"AC",X"50",X"B0",X"00",X"14",X"86",X"98",X"92",X"8C",X"88",X"0A",X"80",X"82",X"84",X"88", + X"28",X"90",X"00",X"2A",X"B0",X"0E",X"A8",X"2A",X"B0",X"0E",X"A8",X"B0",X"A8",X"B0",X"B4",X"38", + X"B8",X"2A",X"B6",X"0E",X"B2",X"2A",X"B6",X"0E",X"B2",X"B6",X"B2",X"AC",X"B2",X"38",X"A8",X"00", + X"2A",X"90",X"0E",X"88",X"2A",X"90",X"0E",X"88",X"70",X"90",X"2A",X"92",X"0E",X"8C",X"2A",X"92", + X"0E",X"8C",X"1C",X"92",X"8C",X"38",X"88",X"00",X"03",X"AC",X"15",X"B0",X"18",X"AC",X"0C",X"AA", + X"24",X"A8",X"03",X"A9",X"15",X"AA",X"18",X"A8",X"0C",X"A6",X"24",X"A4",X"18",X"A2",X"A6",X"0C", + X"AA",X"24",X"B0",X"03",X"B1",X"2D",X"B2",X"03",X"B3",X"2D",X"B4",X"60",X"B0",X"00",X"18",X"A0", + X"98",X"94",X"90",X"98",X"90",X"8A",X"86",X"92",X"8A",X"86",X"82",X"06",X"98",X"96",X"98",X"96", + X"18",X"98",X"06",X"94",X"92",X"94",X"92",X"18",X"94",X"06",X"90",X"8C",X"90",X"8C",X"90",X"8C", + X"90",X"8C",X"30",X"90",X"00",X"0E",X"AA",X"A8",X"AA",X"AC",X"B0",X"B2",X"B4",X"B2",X"B0",X"AC", + X"AA",X"A8",X"1C",X"AA",X"0E",X"B6",X"B4",X"AC",X"B2",X"54",X"B0",X"00",X"1C",X"96",X"90",X"8A", + X"90",X"88",X"84",X"96",X"90",X"88",X"1C",X"90",X"38",X"90",X"00",X"0A",X"A8",X"AC",X"B2",X"B6", + X"B8",X"B6",X"B2",X"AC",X"28",X"A8",X"00",X"28",X"98",X"92",X"88",X"00",X"10",X"90",X"20",X"90", + X"10",X"88",X"90",X"80",X"80",X"80",X"10",X"90",X"20",X"90",X"10",X"90",X"08",X"98",X"10",X"96", + X"18",X"94",X"10",X"92",X"10",X"90",X"20",X"90",X"10",X"88",X"90",X"80",X"80",X"80",X"10",X"90", + X"20",X"90",X"10",X"90",X"08",X"98",X"10",X"96",X"18",X"94",X"10",X"92",X"10",X"94",X"20",X"94", + X"10",X"8C",X"94",X"84",X"84",X"84",X"10",X"94",X"20",X"94",X"10",X"94",X"08",X"9A",X"10",X"98", + X"18",X"96",X"10",X"94",X"00",X"1C",X"A0",X"0E",X"A4",X"1C",X"9B",X"0E",X"A2",X"1C",X"A0",X"0E", + X"A0",X"A4",X"A2",X"1C",X"99",X"0E",X"A4",X"1C",X"A2",X"00",X"A3",X"E5",X"83",X"A3",X"E5",X"83", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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_MiST/Nintendo Mario Bros/rtl/sdram.sv b/Arcade_MiST/Nintendo Mario Bros/rtl/sdram.sv new file mode 100644 index 00000000..5299b46e --- /dev/null +++ b/Arcade_MiST/Nintendo Mario Bros/rtl/sdram.sv @@ -0,0 +1,329 @@ +// +// sdram.v +// +// sdram controller implementation for the MiST board +// https://github.com/mist-devel/mist-board +// +// Copyright (c) 2013 Till Harbaum +// Copyright (c) 2019 Gyorgy Szombathelyi +// +// 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 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, // two byte masks + 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 + + // cpu/chipset interface + input init_n, // init signal after FPGA config to initialize RAM + input clk, // sdram clock + + input port1_req, + output reg port1_ack, + input port1_we, + input [23:1] port1_a, + input [1:0] port1_ds, + input [15:0] port1_d, + output [15:0] port1_q, + + input [15:1] cpu1_addr, + output reg [15:0] cpu1_q, + + input port2_req, + output reg port2_ack, + input port2_we, + input [23:1] port2_a, + input [1:0] port2_ds, + input [15:0] port2_d, + output [15:0] port2_q, + + input [15:1] snd_addr, + output reg [15:0] snd_q +); + +parameter MHZ = 16'd50; // 80 MHz default clock, set it to proper value to calculate refresh rate + +localparam RASCAS_DELAY = 3'd2; // tRCD=20ns -> 2 cycles@<100MHz +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/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}; + +// 64ms/8192 rows = 7.8us +localparam RFRSH_CYCLES = 16'd78*MHZ/4'd10; + +// --------------------------------------------------------------------- +// ------------------------ cycle state machine ------------------------ +// --------------------------------------------------------------------- + +/* + SDRAM state machine for 2 bank interleaved access + 1 word burst, CL2 +cmd issued registered + 0 RAS0 cas1 + 1 ras0 + 2 CAS0 data1 returned + 3 RAS1 cas0 + 4 ras1 + 5 CAS1 data0 returned +*/ + +localparam STATE_RAS0 = 3'd0; // first state in cycle +localparam STATE_RAS1 = 3'd3; // Second ACTIVE command after RAS0 + tRRD (15ns) +localparam STATE_CAS0 = STATE_RAS0 + RASCAS_DELAY; // CAS phase - 3 +localparam STATE_CAS1 = STATE_RAS1 + RASCAS_DELAY; // CAS phase - 5 +localparam STATE_READ0 = 3'd0; //STATE_CAS0 + CAS_LATENCY + 1'd1; // 7 +localparam STATE_READ1 = 3'd3; +localparam STATE_LAST = 3'd5; + +reg [2:0] t; + +always @(posedge clk) begin + t <= t + 1'd1; + if (t == STATE_LAST) t <= STATE_RAS0; +end + +// --------------------------------------------------------------------- +// --------------------------- startup/reset --------------------------- +// --------------------------------------------------------------------- + +// wait 1ms (32 8Mhz 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; +reg init = 1'b1; +always @(posedge clk, negedge init_n) begin + if(!init_n) begin + reset <= 5'h1f; + init <= 1'b1; + end else begin + if((t == STATE_LAST) && (reset != 0)) reset <= reset - 5'd1; + init <= !(reset == 0); + end +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 +reg [15:0] sd_din; +// drive control signals according to current command +assign SDRAM_nCS = sd_cmd[3]; +assign SDRAM_nRAS = sd_cmd[2]; +assign SDRAM_nCAS = sd_cmd[1]; +assign SDRAM_nWE = sd_cmd[0]; + +reg [24:1] addr_latch[2]; +reg [24:1] addr_latch_next[2]; +reg [15:1] addr_last[2]; +reg [15:1] addr_last2[2]; +reg [15:0] din_latch[2]; +reg [1:0] oe_latch; +reg [1:0] we_latch; +reg [1:0] ds[2]; + +localparam PORT_NONE = 2'd0; +localparam PORT_CPU1 = 2'd1; +localparam PORT_REQ = 2'd2; + +localparam PORT_SND = 2'd1; + +reg [2:0] next_port[2]; +reg [2:0] port[2]; +reg port1_state; +reg port2_state; + +reg refresh; +reg [10:0] refresh_cnt; +wire need_refresh = (refresh_cnt >= RFRSH_CYCLES); + +// PORT1: bank 0,1 +always @(*) begin + if (refresh) begin + next_port[0] = PORT_NONE; + addr_latch_next[0] = addr_latch[0]; + end else if (port1_req ^ port1_state) begin + next_port[0] = PORT_REQ; + addr_latch_next[0] = { 1'b0, port1_a }; + end else if (cpu1_addr != addr_last[PORT_CPU1]) begin + next_port[0] = PORT_CPU1; + addr_latch_next[0] = { 9'd0, cpu1_addr }; + end else begin + next_port[0] = PORT_NONE; + addr_latch_next[0] = addr_latch[0]; + end +end + +// PORT2: bank 2,3 +always @(*) begin + if (port2_req ^ port2_state) begin + next_port[1] = PORT_REQ; + addr_latch_next[1] = { 1'b1, port2_a }; + end else if (snd_addr != addr_last2[PORT_SND]) begin + next_port[1] = PORT_SND; + addr_latch_next[1] = { 1'b1, 8'd0, snd_addr }; + end else begin + next_port[1] = PORT_NONE; + addr_latch_next[1] = addr_latch[1]; + end +end + +always @(posedge clk) begin + + // permanently latch ram data to reduce delays + sd_din <= SDRAM_DQ; + SDRAM_DQ <= 16'bZZZZZZZZZZZZZZZZ; + { SDRAM_DQMH, SDRAM_DQML } <= 2'b11; + sd_cmd <= CMD_NOP; // default: idle + refresh_cnt <= refresh_cnt + 1'd1; + + if(init) begin + // initialization takes place at the end of the reset phase + if(t == STATE_RAS0) begin + + if(reset == 15) begin + sd_cmd <= CMD_PRECHARGE; + SDRAM_A[10] <= 1'b1; // precharge all banks + end + + if(reset == 10 || reset == 8) begin + sd_cmd <= CMD_AUTO_REFRESH; + end + + if(reset == 2) begin + sd_cmd <= CMD_LOAD_MODE; + SDRAM_A <= MODE; + SDRAM_BA <= 2'b00; + end + end + end else begin + // RAS phase + // bank 0,1 + if(t == STATE_RAS0) begin + addr_latch[0] <= addr_latch_next[0]; + port[0] <= next_port[0]; + { oe_latch[0], we_latch[0] } <= 2'b00; + + if (next_port[0] != PORT_NONE) begin + sd_cmd <= CMD_ACTIVE; + SDRAM_A <= addr_latch_next[0][22:10]; + SDRAM_BA <= addr_latch_next[0][24:23]; + addr_last[next_port[0]] <= addr_latch_next[0][15:1]; + if (next_port[0] == PORT_REQ) begin + { oe_latch[0], we_latch[0] } <= { ~port1_we, port1_we }; + ds[0] <= port1_ds; + din_latch[0] <= port1_d; + port1_state <= port1_req; + end else begin + { oe_latch[0], we_latch[0] } <= 2'b10; + ds[0] <= 2'b11; + end + end + end + + // bank 2,3 + if(t == STATE_RAS1) begin + refresh <= 1'b0; + addr_latch[1] <= addr_latch_next[1]; + { oe_latch[1], we_latch[1] } <= 2'b00; + port[1] <= next_port[1]; + + if (next_port[1] != PORT_NONE) begin + sd_cmd <= CMD_ACTIVE; + SDRAM_A <= addr_latch_next[1][22:10]; + SDRAM_BA <= addr_latch_next[1][24:23]; + addr_last2[next_port[1]] <= addr_latch_next[1][15:1]; + if (next_port[1] == PORT_REQ) begin + { oe_latch[1], we_latch[1] } <= { ~port2_we, port2_we }; + ds[1] <= port2_ds; + din_latch[1] <= port2_d; + port2_state <= port2_req; + end else begin + { oe_latch[1], we_latch[1] } <= 2'b10; + ds[1] <= 2'b11; + end + end + + if (next_port[1] == PORT_NONE && need_refresh && !we_latch[0] && !oe_latch[0]) begin + refresh <= 1'b1; + refresh_cnt <= 0; + sd_cmd <= CMD_AUTO_REFRESH; + end + end + + // CAS phase + if(t == STATE_CAS0 && (we_latch[0] || oe_latch[0])) begin + sd_cmd <= we_latch[0]?CMD_WRITE:CMD_READ; + { SDRAM_DQMH, SDRAM_DQML } <= ~ds[0]; + if (we_latch[0]) begin + SDRAM_DQ <= din_latch[0]; + port1_ack <= port1_req; + end + SDRAM_A <= { 4'b0010, addr_latch[0][9:1] }; // auto precharge + SDRAM_BA <= addr_latch[0][24:23]; + end + + if(t == STATE_CAS1 && (we_latch[1] || oe_latch[1])) begin + sd_cmd <= we_latch[1]?CMD_WRITE:CMD_READ; + { SDRAM_DQMH, SDRAM_DQML } <= ~ds[1]; + if (we_latch[1]) begin + SDRAM_DQ <= din_latch[1]; + port2_ack <= port2_req; + end + SDRAM_A <= { 4'b0010, addr_latch[1][9:1] }; // auto precharge + SDRAM_BA <= addr_latch[1][24:23]; + end + + // Data returned + if(t == STATE_READ0 && oe_latch[0]) begin + case(port[0]) + PORT_REQ: begin port1_q <= sd_din; port1_ack <= port1_req; end + PORT_CPU1: begin cpu1_q <= sd_din; end + default: ; + endcase; + end + if(t == STATE_READ1 && oe_latch[1]) begin + case(port[1]) + PORT_REQ: begin port2_q <= sd_din; port2_ack <= port2_req; end + PORT_SND: begin snd_q <= sd_din; end + default: ; + endcase; + end + end +end + +endmodule