diff --git a/Cobra_MiST/Cobra_MiST.qpf b/Cobra_MiST/Cobra_MiST.qpf new file mode 100644 index 00000000..9fcda7e3 --- /dev/null +++ b/Cobra_MiST/Cobra_MiST.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 Intel Corporation. All rights reserved. +# Your use of Intel Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Intel Program License +# Subscription Agreement, the Intel Quartus Prime License Agreement, +# the Intel MegaCore Function License Agreement, or other +# applicable license agreement, including, without limitation, +# that your use is for the sole purpose of programming logic +# devices manufactured by Intel and sold by Intel or its +# authorized distributors. Please refer to the applicable +# agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus Prime +# Version 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "Cobra_MiST" diff --git a/Cobra_MiST/Cobra_MiST.qsf b/Cobra_MiST/Cobra_MiST.qsf new file mode 100644 index 00000000..e7d22e6e --- /dev/null +++ b/Cobra_MiST/Cobra_MiST.qsf @@ -0,0 +1,178 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2013 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.0 Build 162 10/23/2013 SJ Web Edition +# Date created = 17:56:28 May 11, 2018 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Cobra_MiST_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name VHDL_FILE rtl/cobra_kbd.vhd +set_global_assignment -name VHDL_FILE rtl/multi74123.vhd +set_global_assignment -name VHDL_FILE rtl/ps2_keyboard.vhd +set_global_assignment -name VHDL_FILE rtl/video_generator.vhd +set_global_assignment -name VERILOG_FILE rtl/osd.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/mist_io.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/hq2x.sv +set_global_assignment -name VHDL_FILE rtl/t80/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/t80/T80a.vhd +set_global_assignment -name VHDL_FILE rtl/t80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/t80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/t80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/t80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/t80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/cobra_top.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/sprom.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Cobra_MiST.sv + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PIN_46 -to UART_TX +set_location_assignment PIN_31 -to UART_RX +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 Cobra_MiST + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name ENABLE_CONFIGURATION_PINS OFF +set_global_assignment -name ENABLE_NCE_PIN OFF +set_global_assignment -name ENABLE_BOOT_SEL_PIN OFF +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# ------------------------ +# start ENTITY(Cobra_MiST) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Cobra_MiST) +# ---------------------- + +# ----------------------- +# start ENTITY(cobra_top) + +# end ENTITY(cobra_top) +# --------------------- +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top +set_global_assignment -name QIP_FILE rtl/inst_ram.qip +set_global_assignment -name QIP_FILE rtl/inst_cg_rom.qip +set_global_assignment -name QIP_FILE rtl/inst_videoram.qip +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Cobra_MiST/README.md b/Cobra_MiST/README.md new file mode 100644 index 00000000..ed02bfa5 --- /dev/null +++ b/Cobra_MiST/README.md @@ -0,0 +1,16 @@ +cobra-fpga +========== + +Cobra computer in FPGA + +Cobra is DIY home computer published around 1985 in Audio-Video magazine. + +Z80 processor clocked at 3.25MHz +16KB RAM + 1KB video RAM +2KB ROM with monitor (no build-in Basic) + +Pin UART_RX is cassette player input. Use simple comparator to convert analogue signal to digital (3.3V level!). + +Command "L" will Start Tape Loading (not tested) + +FPGA Board: Mist FPGA diff --git a/Cobra_MiST/clean.bat b/Cobra_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Cobra_MiST/clean.bat @@ -0,0 +1,37 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +del /s *~ +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +rmdir /s /q hc_output +rmdir /s /q .qsys_edit +rmdir /s /q hps_isw_handoff +rmdir /s /q sys\.qsys_edit +rmdir /s /q sys\vip +cd sys +for /d %%i in (*_sim) do rmdir /s /q "%%~nxi" +cd .. +for /d %%i in (*_sim) do rmdir /s /q "%%~nxi" +del build_id.v +del c5_pin_model_dump.txt +del PLLJ_PLLSPE_INFO.txt +del /s *.qws +del /s *.ppf +del /s *.ddb +del /s *.csv +del /s *.cmp +del /s *.sip +del /s *.spd +del /s *.bsf +del /s *.f +del /s *.sopcinfo +del /s *.xml +del /s new_rtl_netlist +del /s old_rtl_netlist + +pause diff --git a/Cobra_MiST/rtl/Cobra_MiST.sv b/Cobra_MiST/rtl/Cobra_MiST.sv new file mode 100644 index 00000000..94565996 --- /dev/null +++ b/Cobra_MiST/rtl/Cobra_MiST.sv @@ -0,0 +1,115 @@ +module Cobra_MiST +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input UART_RX, + input CLOCK_27 +); + +`include "build_id.v" +localparam CONF_STR = +{ + "Cobra;;", + "O23,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +wire clk50, clk26, clk12p5, clk3p25; + +pll pll +( + .inclk0(CLOCK_27), + .c0(clk50), + .c1(clk26), + .c2(clk12p5), + .c3(clk3p25) +); + +wire [15:0] joystick_0; +wire [15:0] joystick_1; +wire [1:0] buttons, switches; +wire forced_scandoubler; +wire [31:0] status; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire reset = status[0] | status[6] | buttons[1]; +wire hs, vs; +wire r, g, b; + +cobra_top cobra_top ( + .clk(clk50), + .z80_clk(clk3p25), + .clk26mhz(clk26), + .led2(), + .led3(LED), + .z80_rst(reset), + .VGA_HSYNC_OUT(hs), + .VGA_VSYNC_OUT(vs), + .VGA_R_OUT(r), + .VGA_G_OUT(g), + .VGA_B_OUT(b), + .PLAYER_IN(UART_RX),//Tape Input + .PS2_CLK(ps2_kbd_clk), + .PS2_DATA(ps2_kbd_data) + ); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk50 ), + .conf_str (CONF_STR ), + .SPI_SCK (SPI_SCK ), + .CONF_DATA0 (CONF_DATA0 ), + .SPI_SS2 (SPI_SS2 ), + .SPI_DO (SPI_DO ), + .SPI_DI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + +video_mixer #(.LINE_LENGTH(480), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk50), + .ce_pix(clk12p5), + .ce_pix_actual(clk12p5), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r,r}), + .G({g,g,g}), + .B({b,b,b}), + .HSync(hs), + .VSync(vs), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .scandoubler_disable(1),//scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[3:2] == 3, status[3:2] == 2}), + .hq2x(status[3:2]==1), + .ypbpr_full(1), + .ypbpr(ypbpr), + .line_start(0), + .mono(1) +); + +endmodule diff --git a/Cobra_MiST/rtl/build_id.tcl b/Cobra_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Cobra_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Cobra_MiST/rtl/build_id.v b/Cobra_MiST/rtl/build_id.v new file mode 100644 index 00000000..9aede795 --- /dev/null +++ b/Cobra_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "180517" +`define BUILD_TIME "082328" diff --git a/Cobra_MiST/rtl/cobra_kbd.vhd b/Cobra_MiST/rtl/cobra_kbd.vhd new file mode 100644 index 00000000..6071eeb1 --- /dev/null +++ b/Cobra_MiST/rtl/cobra_kbd.vhd @@ -0,0 +1,161 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; + + +entity cobra_kbd is + Port ( + clk : in std_logic; + key_code : in std_logic_vector(7 downto 0); + key_set : in std_logic; + key_clr : in std_logic; + kbd_vector : out std_logic_vector(39 downto 0) + ); +end cobra_kbd; + +architecture Behavioral of cobra_kbd is +signal kbd_vector_next : std_logic_vector(39 downto 0) := (others=>'1'); +signal kbd_vector_reg : std_logic_vector(39 downto 0) := (others=>'1'); +signal key_set_R : std_logic := '0'; +signal key_clr_R : std_logic := '0'; +signal key_set_R_prev : std_logic := '0'; +signal key_clr_R_prev : std_logic := '0'; +signal key_code_R : std_logic_vector(7 downto 0); + +begin + + process (clk) is + begin + if rising_edge(clk) then + kbd_vector_reg <= kbd_vector_next; + key_set_R_prev <= key_set_R; + key_set_R <= key_set; + key_clr_R_prev <= key_clr_R; + key_clr_R <= key_clr; + key_code_R <= key_code; + kbd_vector_reg <= kbd_vector_next; + end if; + end process; + + process (kbd_vector_reg, key_code_R, key_set_R, key_set_R_prev, key_clr_R, key_clr_R_prev) is + variable pos : integer range 0 to 40; + begin + kbd_vector_next <= kbd_vector_reg; + + if (key_set_R_prev = '0' and key_set_R = '1') or (key_clr_R_prev='0' and key_clr_R='1') then + case key_code_R is + --row 0 + when X"12" => --shift left + pos := 0; + when X"59" => --shift right + pos := 0; + when X"1A" => --Z + pos := 1; + when X"22" => --X + pos := 2; + when X"21" => --C + pos := 3; + when X"2A" => --V + pos := 4; + + --row 1 + when X"1C" => --A + pos := 5; + when X"1B" => --S + pos := 6; + when X"23" => --D + pos := 7; + when X"2B" => --F + pos := 8; + when X"34" => --G + pos := 9; + + --row 2 + when X"15" => --Q + pos := 10; + when X"1D" => --W + pos := 11; + when X"24" => --E + pos := 12; + when X"2D" => --R + pos := 13; + when X"2C" => --T + pos := 14; + + --row 3 + when X"16" => --1 + pos := 15; + when X"1E" => --2 + pos := 16; + when X"26" => --3 + pos := 17; + when X"25" => --4 + pos := 18; + when X"2E" => --5 + pos := 19; + + --row 4 + when X"45" => --0 + pos := 20; + when X"46" => --9 + pos := 21; + when X"3E" => --8 + pos := 22; + when X"3D" => --7 + pos := 23; + when X"36" => --6 + pos := 24; + + --row 5 + when X"4D" => --P + pos := 25; + when X"44" => --O + pos := 26; + when X"43" => --I + pos := 27; + when X"3C" => --U + pos := 28; + when X"35" => --Y + pos := 29; + + --row 6 + when X"5A" => --CR + pos := 30; + when X"4B" => --L + pos := 31; + when X"42" => --K + pos := 32; + when X"3B" => --J + pos := 33; + when X"33" => --H + pos := 34; + + --row 7 + when X"29" => --space + pos := 35; + when X"41" => --, + pos := 36; + when X"3A" => --M + pos := 37; + when X"31" => --N + pos := 38; + when X"32" => --B + pos := 39; + + when others => + pos := 40; + end case; + + if pos<40 then + if key_set_R='1' then + kbd_vector_next(pos) <= '0'; + elsif key_clr_R='1' then + kbd_vector_next(pos) <= '1'; + end if; + end if; + end if; + end process; + + kbd_vector <= kbd_vector_reg; + +end Behavioral; + diff --git a/Cobra_MiST/rtl/cobra_top.vhd b/Cobra_MiST/rtl/cobra_top.vhd new file mode 100644 index 00000000..6168e4ae --- /dev/null +++ b/Cobra_MiST/rtl/cobra_top.vhd @@ -0,0 +1,269 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +entity cobra_top is + port ( + -- clock + clk : in std_logic; + z80_clk : in std_logic; + clk26mhz : in std_logic; + led2 : out std_logic; + led3 : out std_logic; + + z80_rst : in std_logic; + + VGA_HSYNC_OUT : out STD_LOGIC; + VGA_VSYNC_OUT : out STD_LOGIC; + VGA_R_OUT : out STD_LOGIC; + VGA_G_OUT : out STD_LOGIC; + VGA_B_OUT : out STD_LOGIC; + + PLAYER_IN : in STD_LOGIC; + + PS2_CLK : in STD_LOGIC; + PS2_DATA : in STD_LOGIC + ); +end cobra_top; + +architecture rtl of cobra_top is + +signal z80_m1 : std_logic; +signal z80_mreq : std_logic; +signal z80_iorq : std_logic; +signal z80_rd : std_logic; +signal z80_wr : std_logic; +signal z80_rfsh : std_logic; +signal z80_halt : std_logic; +signal z80_busack : std_logic; +signal z80_a : std_logic_vector(15 downto 0); +signal z80_d : std_logic_vector(7 downto 0) := (others => '0'); + +signal rom_ce : std_logic; +signal rom_data, rom_sys_data : std_logic_vector(7 downto 0); + +signal sram_data_read : std_logic_vector(7 downto 0); +signal sram_data_write : std_logic_vector(7 downto 0); +signal sram_we : std_logic; +signal sram_a : std_logic_vector(14 downto 0); + +signal clkcnt : std_logic_vector(25 downto 0) := (others => '0'); + +signal port_write_val : std_logic_vector(7 downto 0); + +signal no_rom_remap : std_logic := '0'; + +signal vga_rgb: std_logic_vector(2 downto 0); +signal videoram_gen_addr : std_logic_vector(9 downto 0); +signal videoram_gen_data : std_logic_vector(7 downto 0); +signal video_addr : std_logic_VECTOR(9 downto 0); +signal video_data_in : std_logic_VECTOR(7 downto 0); +signal video_data_out : std_logic_VECTOR(7 downto 0); +signal video_we : std_logic; + +signal kbd_vector : std_logic_vector(39 downto 0); + +signal key_scancode : std_logic_vector(7 downto 0); +signal key_make : std_logic; +signal key_break : std_logic; + +signal inh_in_123 : std_logic; +signal pulse_out_123 : std_logic; + +begin + +cpu : entity work.T80a + generic map( + Mode => 0 ) + port map( + RESET_n => not z80_rst, + CLK_n => z80_clk, + WAIT_n => '1', + INT_n => '1', + NMI_n => '1', + BUSRQ_n => '1', + M1_n => z80_m1, + MREQ_n => z80_mreq, + IORQ_n => z80_iorq, + RD_n => z80_rd, + WR_n => z80_wr, + RFSH_n => z80_rfsh, + HALT_n => z80_halt, + BUSAK_n => z80_busack, + A => z80_a, + D => z80_d + ); + + inst_rom : entity work.sprom + generic map( + init_file => "rtl/roms/cobra.hex", + widthad_a => 11, + width_a => 8) + port map ( + address => z80_a(10 downto 0), + clock => clk, + q => rom_data + ); + +inst_ram : entity work.spram + generic map ( + addr_width_g => 15, + data_width_g => 8 + ) + port map ( + clk_i => z80_clk, + we_i => sram_we, + addr_i => z80_a(14 downto 0), + data_i => sram_data_write, + data_o => sram_data_read + ); + +inst_cobra_kbd : entity work.cobra_kbd + port map ( + clk => clk, + key_code => key_scancode, + key_set => key_make, + key_clr => key_break, + kbd_vector => kbd_vector + ); + +inst_ps2_keyboard : entity work.ps2_keyboard + Port map ( + CLK => clk, + PS2_CLK => PS2_CLK, + PS2_DATA => PS2_DATA, + + KEY_SCANCODE => key_scancode, + KEY_MAKE => key_make, + KEY_BREAK => key_break + ); + + rom_ce <= '0' when (z80_mreq = '0') and (z80_a(15 downto 12) = X"C") else + '0' when (z80_mreq = '0') and (z80_a(15 downto 12) = X"0") and (no_rom_remap = '0') else + '1'; + + sram_we <= '1' when (z80_wr='0') and (z80_a(15 downto 12) <= X"B") and (z80_mreq='0') + else '0'; + + video_we <= '1' when (z80_wr='0') and (z80_a(15 downto 12) = X"F") and (z80_mreq='0') + else '0'; + + process(clk, z80_rst) + begin + if (z80_rst = '1') then + no_rom_remap <= '0'; + elsif rising_edge(clk) then + if z80_rd = '0' then + if z80_mreq = '0' then + if (z80_a(15 downto 12) = X"C") then + z80_d <= rom_data; + elsif (z80_a(15 downto 12) = X"0") and (no_rom_remap = '0') then + z80_d <= rom_data; + elsif (z80_a(15 downto 12) = X"F") then + z80_d <= video_data_out; + else + z80_d <= sram_data_read; + end if; + else -- port read + if (z80_a(15 downto 8) = X"FE") then + z80_d <= inh_in_123&pulse_out_123&'1' & kbd_vector(4 downto 0); + elsif (z80_a(15 downto 8) = X"FD") then + z80_d <= inh_in_123&pulse_out_123&'1' & kbd_vector(9 downto 5); + elsif (z80_a(15 downto 8) = X"FB") then + z80_d <= inh_in_123&pulse_out_123&'1' & kbd_vector(14 downto 10); + elsif (z80_a(15 downto 8) = X"F7") then + z80_d <= inh_in_123&pulse_out_123&'1' & kbd_vector(19 downto 15); + elsif (z80_a(15 downto 8) = X"EF") then + z80_d <= inh_in_123&pulse_out_123&'1' & kbd_vector(24 downto 20); + elsif (z80_a(15 downto 8) = X"DF") then + z80_d <= inh_in_123&pulse_out_123&'1' & kbd_vector(29 downto 25); + elsif (z80_a(15 downto 8) = X"BF") then + z80_d <= inh_in_123&pulse_out_123&'1' & kbd_vector(34 downto 30); + elsif (z80_a(15 downto 8) = X"7F") then + z80_d <= inh_in_123&pulse_out_123&'1' & kbd_vector(39 downto 35); + else + z80_d <= inh_in_123&pulse_out_123&'1' & (kbd_vector(4 downto 0) and kbd_vector(9 downto 5) and kbd_vector(14 downto 10) and kbd_vector(19 downto 15) and + kbd_vector(24 downto 20) and kbd_vector(29 downto 25) and kbd_vector(34 downto 30) and kbd_vector(39 downto 35)); + end if; + end if; + elsif z80_wr = '0' then + if z80_mreq = '0' then + if (z80_a(15 downto 12) <= X"B") then --z80_a(15) = '0' then + sram_data_write <= z80_d; + else --if (z80_a(15 downto 12) = X"F") + video_data_in <= z80_d; + end if; + else --port write + port_write_val <= z80_d; + if (z80_a(7 downto 0) = X"1F") then + no_rom_remap <= '1'; + end if; + end if; + else + z80_d <= "ZZZZZZZZ"; + end if; + end if; + + end process; + + +VGA_R_OUT <= vga_rgb(2); +VGA_G_OUT <= vga_rgb(1); +VGA_B_OUT <= vga_rgb(0); + +video_addr <= z80_a(9 downto 0); + +led2 <= key_make; + +inst_video_generator : entity work.video_generator + port map ( + CLK_IN => clk, + HSYNC_OUT => VGA_HSYNC_OUT, + VSYNC_OUT => VGA_VSYNC_OUT, + RGB_OUT => vga_rgb, + VIDEORAM_ADDR => videoram_gen_addr, + VIDEORAM_DATA => videoram_gen_data + ); + +--inst_videoram : entity work.videoram +-- port map ( +-- clka => clk, +-- wea => video_we, +-- addra => video_addr, +-- dina => video_data_in, +-- douta => video_data_out, +-- clkb => clk, +-- web => (others=>'0'), +-- addrb => videoram_gen_addr, +-- dinb => (others=>'0'), +-- doutb => videoram_gen_data +-- ); + +inst_videoram : entity work.inst_videoram + port map( + clock_a => clk, + wren_a => video_we, + address_a => video_addr, + data_a => video_data_in, + q_a => video_data_out, + clock_b => clk, + wren_b => '0', + address_b => videoram_gen_addr, + q_b => videoram_gen_data, + data_b => "00000000" + ); + + +-- PLAYER INPUT + inh_in_123 <= PLAYER_IN; + led3 <= not pulse_out_123; + + inst_multi74123 : entity work.multi74123 + port map ( + inh_pos => inh_in_123, + q_neg => pulse_out_123, + clk => clk + ); + +end rtl; diff --git a/Cobra_MiST/rtl/dac.vhd b/Cobra_MiST/rtl/dac.vhd new file mode 100644 index 00000000..47b2185e --- /dev/null +++ b/Cobra_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- Refer to Xilinx Application Note XAPP154. +-- +-- This DAC requires an external RC low-pass filter: +-- +-- dac_o 0---XXXXX---+---0 analog audio +-- 3k3 | +-- === 4n7 +-- | +-- GND +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 10 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Cobra_MiST/rtl/dpram.vhd b/Cobra_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..d867b5d2 --- /dev/null +++ b/Cobra_MiST/rtl/dpram.vhd @@ -0,0 +1,59 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + port ( + clk_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) + ); +end entity; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of + std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + variable read_addr_v : unsigned(addr_width_g-1 downto 0); + begin + if rising_edge(clk_a_i) then + read_addr_v := unsigned(addr_a_i); + if we_i = '1' then + ram_q(to_integer(read_addr_v)) <= data_a_i; + end if; + data_a_o <= ram_q(to_integer(read_addr_v)); + end if; + end process mem_a; + + mem_b: process (clk_b_i) + variable read_addr_v : unsigned(addr_width_g-1 downto 0); + begin + if rising_edge(clk_b_i) then + read_addr_v := unsigned(addr_b_i); + data_b_o <= ram_q(to_integer(read_addr_v)); + end if; + end process mem_b; + +end rtl; diff --git a/Cobra_MiST/rtl/hq2x.sv b/Cobra_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Cobra_MiST/rtl/hq2x.sv @@ -0,0 +1,454 @@ +// +// +// Copyright (c) 2012-2013 Ludvig Strigeus +// Copyright (c) 2017 Sorgelig +// +// This program is GPL Licensed. See COPYING for the full license. +// +// +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +// synopsys translate_off +`timescale 1 ps / 1 ps +// synopsys translate_on + +`define BITS_TO_FIT(N) ( \ + N <= 2 ? 0 : \ + N <= 4 ? 1 : \ + N <= 8 ? 2 : \ + N <= 16 ? 3 : \ + N <= 32 ? 4 : \ + N <= 64 ? 5 : \ + N <= 128 ? 6 : \ + N <= 256 ? 7 : \ + N <= 512 ? 8 : \ + N <=1024 ? 9 : 10 ) + +module hq2x_in #(parameter LENGTH, parameter DWIDTH) +( + input clk, + + input [AWIDTH:0] rdaddr, + input rdbuf, + output[DWIDTH:0] q, + + input [AWIDTH:0] wraddr, + input wrbuf, + input [DWIDTH:0] data, + input wren +); + + localparam AWIDTH = `BITS_TO_FIT(LENGTH); + wire [DWIDTH:0] out[2]; + assign q = out[rdbuf]; + + hq2x_buf #(.NUMWORDS(LENGTH), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf0(clk,data,rdaddr,wraddr,wren && (wrbuf == 0),out[0]); + hq2x_buf #(.NUMWORDS(LENGTH), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf1(clk,data,rdaddr,wraddr,wren && (wrbuf == 1),out[1]); +endmodule + + +module hq2x_out #(parameter LENGTH, parameter DWIDTH) +( + input clk, + + input [AWIDTH:0] rdaddr, + input [1:0] rdbuf, + output[DWIDTH:0] q, + + input [AWIDTH:0] wraddr, + input [1:0] wrbuf, + input [DWIDTH:0] data, + input wren +); + + localparam AWIDTH = `BITS_TO_FIT(LENGTH*2); + wire [DWIDTH:0] out[4]; + assign q = out[rdbuf]; + + hq2x_buf #(.NUMWORDS(LENGTH*2), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf0(clk,data,rdaddr,wraddr,wren && (wrbuf == 0),out[0]); + hq2x_buf #(.NUMWORDS(LENGTH*2), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf1(clk,data,rdaddr,wraddr,wren && (wrbuf == 1),out[1]); + hq2x_buf #(.NUMWORDS(LENGTH*2), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf2(clk,data,rdaddr,wraddr,wren && (wrbuf == 2),out[2]); + hq2x_buf #(.NUMWORDS(LENGTH*2), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf3(clk,data,rdaddr,wraddr,wren && (wrbuf == 3),out[3]); +endmodule + + +module hq2x_buf #(parameter NUMWORDS, parameter AWIDTH, parameter DWIDTH) +( + input clock, + input [DWIDTH:0] data, + input [AWIDTH:0] rdaddress, + input [AWIDTH:0] wraddress, + input wren, + output [DWIDTH:0] q +); + + altsyncram altsyncram_component ( + .address_a (wraddress), + .clock0 (clock), + .data_a (data), + .wren_a (wren), + .address_b (rdaddress), + .q_b(q), + .aclr0 (1'b0), + .aclr1 (1'b0), + .addressstall_a (1'b0), + .addressstall_b (1'b0), + .byteena_a (1'b1), + .byteena_b (1'b1), + .clock1 (1'b1), + .clocken0 (1'b1), + .clocken1 (1'b1), + .clocken2 (1'b1), + .clocken3 (1'b1), + .data_b ({(DWIDTH+1){1'b1}}), + .eccstatus (), + .q_a (), + .rden_a (1'b1), + .rden_b (1'b1), + .wren_b (1'b0)); + defparam + altsyncram_component.address_aclr_b = "NONE", + altsyncram_component.address_reg_b = "CLOCK0", + altsyncram_component.clock_enable_input_a = "BYPASS", + altsyncram_component.clock_enable_input_b = "BYPASS", + altsyncram_component.clock_enable_output_b = "BYPASS", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = NUMWORDS, + altsyncram_component.numwords_b = NUMWORDS, + altsyncram_component.operation_mode = "DUAL_PORT", + altsyncram_component.outdata_aclr_b = "NONE", + altsyncram_component.outdata_reg_b = "UNREGISTERED", + altsyncram_component.power_up_uninitialized = "FALSE", + altsyncram_component.read_during_write_mode_mixed_ports = "DONT_CARE", + altsyncram_component.widthad_a = AWIDTH+1, + altsyncram_component.widthad_b = AWIDTH+1, + altsyncram_component.width_a = DWIDTH+1, + altsyncram_component.width_b = DWIDTH+1, + altsyncram_component.width_byteena_a = 1; + +endmodule + +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +module DiffCheck +( + input [17:0] rgb1, + input [17:0] rgb2, + output result +); + + wire [5:0] r = rgb1[5:1] - rgb2[5:1]; + wire [5:0] g = rgb1[11:7] - rgb2[11:7]; + wire [5:0] b = rgb1[17:13] - rgb2[17:13]; + wire [6:0] t = $signed(r) + $signed(b); + wire [6:0] gx = {g[5], g}; + wire [7:0] y = $signed(t) + $signed(gx); + wire [6:0] u = $signed(r) - $signed(b); + wire [7:0] v = $signed({g, 1'b0}) - $signed(t); + + // if y is inside (-24..24) + wire y_inside = (y < 8'h18 || y >= 8'he8); + + // if u is inside (-4, 4) + wire u_inside = (u < 7'h4 || u >= 7'h7c); + + // if v is inside (-6, 6) + wire v_inside = (v < 8'h6 || v >= 8'hfA); + assign result = !(y_inside && u_inside && v_inside); +endmodule + +module InnerBlend +( + input [8:0] Op, + input [5:0] A, + input [5:0] B, + input [5:0] C, + output [5:0] O +); + + function [8:0] mul6x3; + input [5:0] op1; + input [2:0] op2; + begin + mul6x3 = 9'd0; + if(op2[0]) mul6x3 = mul6x3 + op1; + if(op2[1]) mul6x3 = mul6x3 + {op1, 1'b0}; + if(op2[2]) mul6x3 = mul6x3 + {op1, 2'b00}; + end + endfunction + + wire OpOnes = Op[4]; + wire [8:0] Amul = mul6x3(A, Op[7:5]); + wire [8:0] Bmul = mul6x3(B, {Op[3:2], 1'b0}); + wire [8:0] Cmul = mul6x3(C, {Op[1:0], 1'b0}); + wire [8:0] At = Amul; + wire [8:0] Bt = (OpOnes == 0) ? Bmul : {3'b0, B}; + wire [8:0] Ct = (OpOnes == 0) ? Cmul : {3'b0, C}; + wire [9:0] Res = {At, 1'b0} + Bt + Ct; + assign O = Op[8] ? A : Res[9:4]; +endmodule + +module Blend +( + input [5:0] rule, + input disable_hq2x, + input [17:0] E, + input [17:0] A, + input [17:0] B, + input [17:0] D, + input [17:0] F, + input [17:0] H, + output [17:0] Result +); + + reg [1:0] input_ctrl; + reg [8:0] op; + localparam BLEND0 = 9'b1_xxx_x_xx_xx; // 0: A + localparam BLEND1 = 9'b0_110_0_10_00; // 1: (A * 12 + B * 4) >> 4 + localparam BLEND2 = 9'b0_100_0_10_10; // 2: (A * 8 + B * 4 + C * 4) >> 4 + localparam BLEND3 = 9'b0_101_0_10_01; // 3: (A * 10 + B * 4 + C * 2) >> 4 + localparam BLEND4 = 9'b0_110_0_01_01; // 4: (A * 12 + B * 2 + C * 2) >> 4 + localparam BLEND5 = 9'b0_010_0_11_11; // 5: (A * 4 + (B + C) * 6) >> 4 + localparam BLEND6 = 9'b0_111_1_xx_xx; // 6: (A * 14 + B + C) >> 4 + localparam AB = 2'b00; + localparam AD = 2'b01; + localparam DB = 2'b10; + localparam BD = 2'b11; + wire is_diff; + DiffCheck diff_checker(rule[1] ? B : H, rule[0] ? D : F, is_diff); + + always @* begin + case({!is_diff, rule[5:2]}) + 1,17: {op, input_ctrl} = {BLEND1, AB}; + 2,18: {op, input_ctrl} = {BLEND1, DB}; + 3,19: {op, input_ctrl} = {BLEND1, BD}; + 4,20: {op, input_ctrl} = {BLEND2, DB}; + 5,21: {op, input_ctrl} = {BLEND2, AB}; + 6,22: {op, input_ctrl} = {BLEND2, AD}; + + 8: {op, input_ctrl} = {BLEND0, 2'bxx}; + 9: {op, input_ctrl} = {BLEND0, 2'bxx}; + 10: {op, input_ctrl} = {BLEND0, 2'bxx}; + 11: {op, input_ctrl} = {BLEND1, AB}; + 12: {op, input_ctrl} = {BLEND1, AB}; + 13: {op, input_ctrl} = {BLEND1, AB}; + 14: {op, input_ctrl} = {BLEND1, DB}; + 15: {op, input_ctrl} = {BLEND1, BD}; + + 24: {op, input_ctrl} = {BLEND2, DB}; + 25: {op, input_ctrl} = {BLEND5, DB}; + 26: {op, input_ctrl} = {BLEND6, DB}; + 27: {op, input_ctrl} = {BLEND2, DB}; + 28: {op, input_ctrl} = {BLEND4, DB}; + 29: {op, input_ctrl} = {BLEND5, DB}; + 30: {op, input_ctrl} = {BLEND3, BD}; + 31: {op, input_ctrl} = {BLEND3, DB}; + default: {op, input_ctrl} = 11'bx; + endcase + + // Setting op[8] effectively disables HQ2X because blend will always return E. + if (disable_hq2x) op[8] = 1; + end + + // Generate inputs to the inner blender. Valid combinations. + // 00: E A B + // 01: E A D + // 10: E D B + // 11: E B D + wire [17:0] Input1 = E; + wire [17:0] Input2 = !input_ctrl[1] ? A : + !input_ctrl[0] ? D : B; + + wire [17:0] Input3 = !input_ctrl[0] ? B : D; + InnerBlend inner_blend1(op, Input1[5:0], Input2[5:0], Input3[5:0], Result[5:0]); + InnerBlend inner_blend2(op, Input1[11:6], Input2[11:6], Input3[11:6], Result[11:6]); + InnerBlend inner_blend3(op, Input1[17:12], Input2[17:12], Input3[17:12], Result[17:12]); +endmodule + + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +module Hq2x #(parameter LENGTH, parameter HALF_DEPTH) +( + input clk, + input ce_x4, + input [DWIDTH:0] inputpixel, + input mono, + input disable_hq2x, + input reset_frame, + input reset_line, + input [1:0] read_y, + input [AWIDTH+1:0] read_x, + output [DWIDTH:0] outpixel +); + + +localparam AWIDTH = `BITS_TO_FIT(LENGTH); +localparam DWIDTH = HALF_DEPTH ? 8 : 17; + +wire [5:0] hqTable[256] = '{ + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 47, 35, 23, 15, 55, 39, + 19, 19, 26, 58, 19, 19, 26, 58, 23, 15, 35, 35, 23, 15, 7, 35, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 55, 39, 23, 15, 51, 43, + 19, 19, 26, 58, 19, 19, 26, 58, 23, 15, 51, 35, 23, 15, 7, 43, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 61, 35, 35, 23, 61, 51, 35, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 51, 35, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 61, 7, 35, 23, 61, 7, 43, + 19, 19, 26, 11, 19, 19, 26, 58, 23, 15, 51, 35, 23, 61, 7, 43, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 47, 35, 23, 15, 55, 39, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 51, 35, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 55, 39, 23, 15, 51, 43, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 39, 23, 15, 7, 43, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 51, 39, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 7, 35, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 7, 43, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 7, 35, 23, 15, 7, 43 +}; + +reg [17:0] Prev0, Prev1, Prev2, Curr0, Curr1, Next0, Next1, Next2; +reg [17:0] A, B, D, F, G, H; +reg [7:0] pattern, nextpatt; +reg [1:0] i; +reg [7:0] y; + +wire curbuf = y[0]; +reg prevbuf = 0; +wire iobuf = !curbuf; + +wire diff0, diff1; +DiffCheck diffcheck0(Curr1, (i == 0) ? Prev0 : (i == 1) ? Curr0 : (i == 2) ? Prev2 : Next1, diff0); +DiffCheck diffcheck1(Curr1, (i == 0) ? Prev1 : (i == 1) ? Next0 : (i == 2) ? Curr2 : Next2, diff1); + +wire [7:0] new_pattern = {diff1, diff0, pattern[7:2]}; + +wire [17:0] X = (i == 0) ? A : (i == 1) ? Prev1 : (i == 2) ? Next1 : G; +wire [17:0] blend_result; +Blend blender(hqTable[nextpatt], disable_hq2x, Curr0, X, B, D, F, H, blend_result); + +reg Curr2_addr1; +reg [AWIDTH:0] Curr2_addr2; +wire [17:0] Curr2 = HALF_DEPTH ? h2rgb(Curr2tmp) : Curr2tmp; +wire [DWIDTH:0] Curr2tmp; + +reg [AWIDTH:0] wrin_addr2; +reg [DWIDTH:0] wrpix; +reg wrin_en; + +function [17:0] h2rgb; + input [8:0] v; +begin + h2rgb = mono ? {v[5:3],v[2:0], v[5:3],v[2:0], v[5:3],v[2:0]} : {v[8:6],v[8:6],v[5:3],v[5:3],v[2:0],v[2:0]}; +end +endfunction + +function [8:0] rgb2h; + input [17:0] v; +begin + rgb2h = mono ? {3'b000, v[17:15], v[14:12]} : {v[17:15], v[11:9], v[5:3]}; +end +endfunction + +hq2x_in #(.LENGTH(LENGTH), .DWIDTH(DWIDTH)) hq2x_in +( + .clk(clk), + + .rdaddr(Curr2_addr2), + .rdbuf(Curr2_addr1), + .q(Curr2tmp), + + .wraddr(wrin_addr2), + .wrbuf(iobuf), + .data(wrpix), + .wren(wrin_en) +); + +reg [1:0] wrout_addr1; +reg [AWIDTH+1:0] wrout_addr2; +reg wrout_en; +reg [DWIDTH:0] wrdata; + +hq2x_out #(.LENGTH(LENGTH), .DWIDTH(DWIDTH)) hq2x_out +( + .clk(clk), + + .rdaddr(read_x), + .rdbuf(read_y), + .q(outpixel), + + .wraddr(wrout_addr2), + .wrbuf(wrout_addr1), + .data(wrdata), + .wren(wrout_en) +); + +always @(posedge clk) begin + reg [AWIDTH:0] offs; + reg old_reset_line; + reg old_reset_frame; + + wrout_en <= 0; + wrin_en <= 0; + + if(ce_x4) begin + + pattern <= new_pattern; + + if(~&offs) begin + if (i == 0) begin + Curr2_addr1 <= prevbuf; + Curr2_addr2 <= offs; + end + if (i == 1) begin + Prev2 <= Curr2; + Curr2_addr1 <= curbuf; + Curr2_addr2 <= offs; + end + if (i == 2) begin + Next2 <= HALF_DEPTH ? h2rgb(inputpixel) : inputpixel; + wrpix <= inputpixel; + wrin_addr2 <= offs; + wrin_en <= 1; + end + if (i == 3) begin + offs <= offs + 1'd1; + end + + if(HALF_DEPTH) wrdata <= rgb2h(blend_result); + else wrdata <= blend_result; + + wrout_addr1 <= {curbuf, i[1]}; + wrout_addr2 <= {offs, i[1]^i[0]}; + wrout_en <= 1; + end + + if(i==3) begin + nextpatt <= {new_pattern[7:6], new_pattern[3], new_pattern[5], new_pattern[2], new_pattern[4], new_pattern[1:0]}; + {A, G} <= {Prev0, Next0}; + {B, F, H, D} <= {Prev1, Curr2, Next1, Curr0}; + {Prev0, Prev1} <= {Prev1, Prev2}; + {Curr0, Curr1} <= {Curr1, Curr2}; + {Next0, Next1} <= {Next1, Next2}; + end else begin + nextpatt <= {nextpatt[5], nextpatt[3], nextpatt[0], nextpatt[6], nextpatt[1], nextpatt[7], nextpatt[4], nextpatt[2]}; + {B, F, H, D} <= {F, H, D, B}; + end + + i <= i + 1'b1; + if(old_reset_line && ~reset_line) begin + old_reset_frame <= reset_frame; + offs <= 0; + i <= 0; + y <= y + 1'd1; + prevbuf <= curbuf; + if(old_reset_frame & ~reset_frame) begin + y <= 0; + prevbuf <= 0; + end + end + + old_reset_line <= reset_line; + end +end + +endmodule // Hq2x diff --git a/Cobra_MiST/rtl/inst_cg_rom.qip b/Cobra_MiST/rtl/inst_cg_rom.qip new file mode 100644 index 00000000..71bcec75 --- /dev/null +++ b/Cobra_MiST/rtl/inst_cg_rom.qip @@ -0,0 +1,3 @@ +set_global_assignment -name IP_TOOL_NAME "ROM: 1-PORT" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "inst_cg_rom.vhd"] diff --git a/Cobra_MiST/rtl/inst_cg_rom.vhd b/Cobra_MiST/rtl/inst_cg_rom.vhd new file mode 100644 index 00000000..94ce2476 --- /dev/null +++ b/Cobra_MiST/rtl/inst_cg_rom.vhd @@ -0,0 +1,143 @@ +-- megafunction wizard: %ROM: 1-PORT% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altsyncram + +-- ============================================================ +-- File Name: inst_cg_rom.vhd +-- Megafunction Name(s): +-- altsyncram +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.0 Build 162 10/23/2013 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2013 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY inst_cg_rom IS + PORT + ( + address : IN STD_LOGIC_VECTOR (8 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END inst_cg_rom; + + +ARCHITECTURE SYN OF inst_cg_rom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); + +BEGIN + q <= sub_wire0(7 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => "./roms/cobra_char.hex", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 512, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => "CLOCK0", + widthad_a => 9, + width_a => 8, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + q_a => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +-- Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +-- Retrieval info: PRIVATE: AclrByte NUMERIC "0" +-- Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +-- Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: Clken NUMERIC "0" +-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +-- Retrieval info: PRIVATE: MIFfilename STRING "./roms/cobra_char.hex" +-- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "512" +-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +-- Retrieval info: PRIVATE: RegAddr NUMERIC "1" +-- Retrieval info: PRIVATE: RegOutput NUMERIC "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: SingleClock NUMERIC "1" +-- Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" +-- Retrieval info: PRIVATE: WidthAddr NUMERIC "9" +-- Retrieval info: PRIVATE: WidthData NUMERIC "8" +-- Retrieval info: PRIVATE: rden NUMERIC "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: INIT_FILE STRING "./roms/cobra_char.hex" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "512" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "9" +-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +-- Retrieval info: USED_PORT: address 0 0 9 0 INPUT NODEFVAL "address[8..0]" +-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +-- Retrieval info: CONNECT: @address_a 0 0 9 0 address 0 0 9 0 +-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +-- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL inst_cg_rom.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL inst_cg_rom.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL inst_cg_rom.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL inst_cg_rom.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL inst_cg_rom_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf diff --git a/Cobra_MiST/rtl/inst_ram.qip b/Cobra_MiST/rtl/inst_ram.qip new file mode 100644 index 00000000..264fbecc --- /dev/null +++ b/Cobra_MiST/rtl/inst_ram.qip @@ -0,0 +1,3 @@ +set_global_assignment -name IP_TOOL_NAME "RAM: 1-PORT" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "inst_ram.vhd"] diff --git a/Cobra_MiST/rtl/inst_ram.vhd b/Cobra_MiST/rtl/inst_ram.vhd new file mode 100644 index 00000000..3f2b8869 --- /dev/null +++ b/Cobra_MiST/rtl/inst_ram.vhd @@ -0,0 +1,156 @@ +-- megafunction wizard: %RAM: 1-PORT% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altsyncram + +-- ============================================================ +-- File Name: inst_ram.vhd +-- Megafunction Name(s): +-- altsyncram +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.0 Build 162 10/23/2013 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2013 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY inst_ram IS + PORT + ( + address : IN STD_LOGIC_VECTOR (13 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END inst_ram; + + +ARCHITECTURE SYN OF inst_ram IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); + +BEGIN + q <= sub_wire0(7 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 16384, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "CLOCK0", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => 14, + width_a => 8, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + data_a => data, + wren_a => wren, + q_a => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +-- Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +-- Retrieval info: PRIVATE: AclrByte NUMERIC "0" +-- Retrieval info: PRIVATE: AclrData NUMERIC "0" +-- Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +-- Retrieval info: PRIVATE: BlankMemory NUMERIC "1" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: Clken NUMERIC "0" +-- Retrieval info: PRIVATE: DataBusSeparated NUMERIC "1" +-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +-- Retrieval info: PRIVATE: MIFfilename STRING "" +-- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "16384" +-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3" +-- Retrieval info: PRIVATE: RegAddr NUMERIC "1" +-- Retrieval info: PRIVATE: RegData NUMERIC "1" +-- Retrieval info: PRIVATE: RegOutput NUMERIC "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: SingleClock NUMERIC "1" +-- Retrieval info: PRIVATE: UseDQRAM NUMERIC "1" +-- Retrieval info: PRIVATE: WRCONTROL_ACLR_A NUMERIC "0" +-- Retrieval info: PRIVATE: WidthAddr NUMERIC "14" +-- Retrieval info: PRIVATE: WidthData NUMERIC "8" +-- Retrieval info: PRIVATE: rden NUMERIC "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "16384" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "SINGLE_PORT" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +-- Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" +-- Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_PORT_A STRING "NEW_DATA_NO_NBE_READ" +-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "14" +-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +-- Retrieval info: USED_PORT: address 0 0 14 0 INPUT NODEFVAL "address[13..0]" +-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +-- Retrieval info: USED_PORT: data 0 0 8 0 INPUT NODEFVAL "data[7..0]" +-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +-- Retrieval info: USED_PORT: wren 0 0 0 0 INPUT NODEFVAL "wren" +-- Retrieval info: CONNECT: @address_a 0 0 14 0 address 0 0 14 0 +-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +-- Retrieval info: CONNECT: @data_a 0 0 8 0 data 0 0 8 0 +-- Retrieval info: CONNECT: @wren_a 0 0 0 0 wren 0 0 0 0 +-- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL inst_ram.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL inst_ram.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL inst_ram.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL inst_ram.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL inst_ram_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf diff --git a/Cobra_MiST/rtl/inst_videoram.qip b/Cobra_MiST/rtl/inst_videoram.qip new file mode 100644 index 00000000..fda8a12d --- /dev/null +++ b/Cobra_MiST/rtl/inst_videoram.qip @@ -0,0 +1,3 @@ +set_global_assignment -name IP_TOOL_NAME "RAM: 2-PORT" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "inst_videoram.vhd"] diff --git a/Cobra_MiST/rtl/inst_videoram.vhd b/Cobra_MiST/rtl/inst_videoram.vhd new file mode 100644 index 00000000..b7399af8 --- /dev/null +++ b/Cobra_MiST/rtl/inst_videoram.vhd @@ -0,0 +1,226 @@ +-- megafunction wizard: %RAM: 2-PORT% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altsyncram + +-- ============================================================ +-- File Name: inst_videoram.vhd +-- Megafunction Name(s): +-- altsyncram +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.0 Build 162 10/23/2013 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2013 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY inst_videoram IS + PORT + ( + address_a : IN STD_LOGIC_VECTOR (9 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (9 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (7 DOWNTO 0); + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END inst_videoram; + + +ARCHITECTURE SYN OF inst_videoram IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC_VECTOR (7 DOWNTO 0); + +BEGIN + q_a <= sub_wire0(7 DOWNTO 0); + q_b <= sub_wire1(7 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "BYPASS", + clock_enable_input_b => "BYPASS", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone III", + lpm_type => "altsyncram", + numwords_a => 1024, + numwords_b => 1024, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "CLOCK0", + outdata_reg_b => "CLOCK1", + 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 => 10, + widthad_b => 10, + width_a => 8, + width_b => 8, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + clock0 => clock_a, + wren_a => wren_a, + address_b => address_b, + clock1 => clock_b, + data_b => data_b, + wren_b => wren_b, + address_a => address_a, + data_a => data_a, + q_a => sub_wire0, + q_b => sub_wire1 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +-- Retrieval info: PRIVATE: ADDRESSSTALL_B NUMERIC "0" +-- Retrieval info: PRIVATE: BYTEENA_ACLR_A NUMERIC "0" +-- Retrieval info: PRIVATE: BYTEENA_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE_A NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE_B NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +-- Retrieval info: PRIVATE: BlankMemory NUMERIC "1" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_B NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_B NUMERIC "0" +-- Retrieval info: PRIVATE: CLRdata NUMERIC "0" +-- Retrieval info: PRIVATE: CLRq NUMERIC "0" +-- Retrieval info: PRIVATE: CLRrdaddress NUMERIC "0" +-- Retrieval info: PRIVATE: CLRrren NUMERIC "0" +-- Retrieval info: PRIVATE: CLRwraddress NUMERIC "0" +-- Retrieval info: PRIVATE: CLRwren NUMERIC "0" +-- Retrieval info: PRIVATE: Clock NUMERIC "5" +-- Retrieval info: PRIVATE: Clock_A NUMERIC "0" +-- Retrieval info: PRIVATE: Clock_B NUMERIC "0" +-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +-- Retrieval info: PRIVATE: INDATA_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: INDATA_REG_B NUMERIC "1" +-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +-- Retrieval info: PRIVATE: MEMSIZE NUMERIC "8192" +-- Retrieval info: PRIVATE: MEM_IN_BITS NUMERIC "0" +-- Retrieval info: PRIVATE: MIFfilename STRING "" +-- Retrieval info: PRIVATE: OPERATION_MODE NUMERIC "3" +-- Retrieval info: PRIVATE: OUTDATA_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: OUTDATA_REG_B NUMERIC "1" +-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_MIXED_PORTS NUMERIC "2" +-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3" +-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_B NUMERIC "3" +-- Retrieval info: PRIVATE: REGdata NUMERIC "1" +-- Retrieval info: PRIVATE: REGq NUMERIC "1" +-- Retrieval info: PRIVATE: REGrdaddress NUMERIC "0" +-- Retrieval info: PRIVATE: REGrren NUMERIC "0" +-- Retrieval info: PRIVATE: REGwraddress NUMERIC "1" +-- Retrieval info: PRIVATE: REGwren NUMERIC "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_DIFF_CLKEN NUMERIC "0" +-- Retrieval info: PRIVATE: UseDPRAM NUMERIC "1" +-- Retrieval info: PRIVATE: VarWidth NUMERIC "0" +-- Retrieval info: PRIVATE: WIDTH_READ_A NUMERIC "8" +-- Retrieval info: PRIVATE: WIDTH_READ_B NUMERIC "8" +-- Retrieval info: PRIVATE: WIDTH_WRITE_A NUMERIC "8" +-- Retrieval info: PRIVATE: WIDTH_WRITE_B NUMERIC "8" +-- Retrieval info: PRIVATE: WRADDR_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: WRADDR_REG_B NUMERIC "1" +-- Retrieval info: PRIVATE: WRCTRL_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: enable NUMERIC "0" +-- Retrieval info: PRIVATE: rden NUMERIC "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: ADDRESS_REG_B STRING "CLOCK1" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_B STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_B STRING "BYPASS" +-- Retrieval info: CONSTANT: INDATA_REG_B STRING "CLOCK1" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "1024" +-- Retrieval info: CONSTANT: NUMWORDS_B NUMERIC "1024" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "BIDIR_DUAL_PORT" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_B STRING "NONE" +-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +-- Retrieval info: CONSTANT: OUTDATA_REG_B STRING "CLOCK1" +-- Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" +-- Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_PORT_A STRING "NEW_DATA_NO_NBE_READ" +-- Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_PORT_B STRING "NEW_DATA_NO_NBE_READ" +-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "10" +-- Retrieval info: CONSTANT: WIDTHAD_B NUMERIC "10" +-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_B NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_B NUMERIC "1" +-- Retrieval info: CONSTANT: WRCONTROL_WRADDRESS_REG_B STRING "CLOCK1" +-- Retrieval info: USED_PORT: address_a 0 0 10 0 INPUT NODEFVAL "address_a[9..0]" +-- Retrieval info: USED_PORT: address_b 0 0 10 0 INPUT NODEFVAL "address_b[9..0]" +-- Retrieval info: USED_PORT: clock_a 0 0 0 0 INPUT VCC "clock_a" +-- Retrieval info: USED_PORT: clock_b 0 0 0 0 INPUT NODEFVAL "clock_b" +-- Retrieval info: USED_PORT: data_a 0 0 8 0 INPUT NODEFVAL "data_a[7..0]" +-- Retrieval info: USED_PORT: data_b 0 0 8 0 INPUT NODEFVAL "data_b[7..0]" +-- Retrieval info: USED_PORT: q_a 0 0 8 0 OUTPUT NODEFVAL "q_a[7..0]" +-- Retrieval info: USED_PORT: q_b 0 0 8 0 OUTPUT NODEFVAL "q_b[7..0]" +-- Retrieval info: USED_PORT: wren_a 0 0 0 0 INPUT GND "wren_a" +-- Retrieval info: USED_PORT: wren_b 0 0 0 0 INPUT GND "wren_b" +-- Retrieval info: CONNECT: @address_a 0 0 10 0 address_a 0 0 10 0 +-- Retrieval info: CONNECT: @address_b 0 0 10 0 address_b 0 0 10 0 +-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock_a 0 0 0 0 +-- Retrieval info: CONNECT: @clock1 0 0 0 0 clock_b 0 0 0 0 +-- Retrieval info: CONNECT: @data_a 0 0 8 0 data_a 0 0 8 0 +-- Retrieval info: CONNECT: @data_b 0 0 8 0 data_b 0 0 8 0 +-- Retrieval info: CONNECT: @wren_a 0 0 0 0 wren_a 0 0 0 0 +-- Retrieval info: CONNECT: @wren_b 0 0 0 0 wren_b 0 0 0 0 +-- Retrieval info: CONNECT: q_a 0 0 8 0 @q_a 0 0 8 0 +-- Retrieval info: CONNECT: q_b 0 0 8 0 @q_b 0 0 8 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL inst_videoram.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL inst_videoram.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL inst_videoram.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL inst_videoram.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL inst_videoram_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf diff --git a/Cobra_MiST/rtl/mist_io.v b/Cobra_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Cobra_MiST/rtl/mist_io.v @@ -0,0 +1,491 @@ +// +// mist_io.v +// +// mist_io for the MiST board +// http://code.google.com/p/mist-board/ +// +// Copyright (c) 2014 Till Harbaum +// +// This source file is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This source file is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +/////////////////////////////////////////////////////////////////////// + +// +// Use buffer to access SD card. It's time-critical part. +// Made module synchroneous with 2 clock domains: clk_sys and SPI_SCK +// (Sorgelig) +// +// for synchronous projects default value for PS2DIV is fine for any frequency of system clock. +// clk_ps2 = clk_sys/(PS2DIV*2) +// + +module mist_io #(parameter STRLEN=0, parameter PS2DIV=100) +( + + // parameter STRLEN and the actual length of conf_str have to match + input [(8*STRLEN)-1:0] conf_str, + + // Global clock. It should be around 100MHz (higher is better). + input clk_sys, + + // Global SPI clock from ARM. 24MHz + input SPI_SCK, + + input CONF_DATA0, + input SPI_SS2, + output SPI_DO, + input SPI_DI, + + output reg [7:0] joystick_0, + output reg [7:0] joystick_1, + output reg [15:0] joystick_analog_0, + output reg [15:0] joystick_analog_1, + output [1:0] buttons, + output [1:0] switches, + output scandoubler_disable, + output ypbpr, + + output reg [31:0] status, + + // SD config + input sd_conf, + input sd_sdhc, + output img_mounted, // signaling that new image has been mounted + output reg [31:0] img_size, // size of image in bytes + + // SD block level access + input [31:0] sd_lba, + input sd_rd, + input sd_wr, + output reg sd_ack, + output reg sd_ack_conf, + + // SD byte level access. Signals for 2-PORT altsyncram. + output reg [8:0] sd_buff_addr, + output reg [7:0] sd_buff_dout, + input [7:0] sd_buff_din, + output reg sd_buff_wr, + + // ps2 keyboard emulation + output ps2_kbd_clk, + output reg ps2_kbd_data, + output ps2_mouse_clk, + output reg ps2_mouse_data, + input ps2_caps_led, + + // ARM -> FPGA download + output reg ioctl_download = 0, // signal indicating an active download + output reg [7:0] ioctl_index, // menu index used to upload the file + output ioctl_wr, + output reg [24:0] ioctl_addr, + output reg [7:0] ioctl_dout +); + +reg [7:0] b_data; +reg [6:0] sbuf; +reg [7:0] cmd; +reg [2:0] bit_cnt; // counts bits 0-7 0-7 ... +reg [9:0] byte_cnt; // counts bytes +reg [7:0] but_sw; +reg [2:0] stick_idx; + +reg mount_strobe = 0; +assign img_mounted = mount_strobe; + +assign buttons = but_sw[1:0]; +assign switches = but_sw[3:2]; +assign scandoubler_disable = but_sw[4]; +assign ypbpr = but_sw[5]; + +wire [7:0] spi_dout = { sbuf, SPI_DI}; + +// this variant of user_io is for 8 bit cores (type == a4) only +wire [7:0] core_type = 8'ha4; + +// command byte read by the io controller +wire [7:0] sd_cmd = { 4'h5, sd_conf, sd_sdhc, sd_wr, sd_rd }; + +reg spi_do; +assign SPI_DO = CONF_DATA0 ? 1'bZ : spi_do; + +wire [7:0] kbd_led = { 2'b01, 4'b0000, ps2_caps_led, 1'b1}; + +// drive MISO only when transmitting core id +always@(negedge SPI_SCK) begin + if(!CONF_DATA0) begin + // first byte returned is always core type, further bytes are + // command dependent + if(byte_cnt == 0) begin + spi_do <= core_type[~bit_cnt]; + + end else begin + case(cmd) + // reading config string + 8'h14: begin + // returning a byte from string + if(byte_cnt < STRLEN + 1) spi_do <= conf_str[{STRLEN - byte_cnt,~bit_cnt}]; + else spi_do <= 0; + end + + // reading sd card status + 8'h16: begin + if(byte_cnt == 1) spi_do <= sd_cmd[~bit_cnt]; + else if((byte_cnt >= 2) && (byte_cnt < 6)) spi_do <= sd_lba[{5-byte_cnt, ~bit_cnt}]; + else spi_do <= 0; + end + + // reading sd card write data + 8'h18: + spi_do <= b_data[~bit_cnt]; + + // reading keyboard LED status + 8'h1f: + spi_do <= kbd_led[~bit_cnt]; + + default: + spi_do <= 0; + endcase + end + end +end + +reg b_wr2,b_wr3; +always @(negedge clk_sys) begin + b_wr3 <= b_wr2; + sd_buff_wr <= b_wr3; +end + +// SPI receiver +always@(posedge SPI_SCK or posedge CONF_DATA0) begin + + if(CONF_DATA0) begin + b_wr2 <= 0; + bit_cnt <= 0; + byte_cnt <= 0; + sd_ack <= 0; + sd_ack_conf <= 0; + end else begin + b_wr2 <= 0; + + sbuf <= spi_dout[6:0]; + bit_cnt <= bit_cnt + 1'd1; + if(bit_cnt == 5) begin + if (byte_cnt == 0) sd_buff_addr <= 0; + if((byte_cnt != 0) & (sd_buff_addr != 511)) sd_buff_addr <= sd_buff_addr + 1'b1; + if((byte_cnt == 1) & ((cmd == 8'h17) | (cmd == 8'h19))) sd_buff_addr <= 0; + end + + // finished reading command byte + if(bit_cnt == 7) begin + if(~&byte_cnt) byte_cnt <= byte_cnt + 8'd1; + if(byte_cnt == 0) begin + cmd <= spi_dout; + + if(spi_dout == 8'h19) begin + sd_ack_conf <= 1; + sd_buff_addr <= 0; + end + if((spi_dout == 8'h17) || (spi_dout == 8'h18)) begin + sd_ack <= 1; + sd_buff_addr <= 0; + end + if(spi_dout == 8'h18) b_data <= sd_buff_din; + + mount_strobe <= 0; + + end else begin + + case(cmd) + // buttons and switches + 8'h01: but_sw <= spi_dout; + 8'h02: joystick_0 <= spi_dout; + 8'h03: joystick_1 <= spi_dout; + + // store incoming ps2 mouse bytes + 8'h04: begin + ps2_mouse_fifo[ps2_mouse_wptr] <= spi_dout; + ps2_mouse_wptr <= ps2_mouse_wptr + 1'd1; + end + + // store incoming ps2 keyboard bytes + 8'h05: begin + ps2_kbd_fifo[ps2_kbd_wptr] <= spi_dout; + ps2_kbd_wptr <= ps2_kbd_wptr + 1'd1; + end + + 8'h15: status[7:0] <= spi_dout; + + // send SD config IO -> FPGA + // flag that download begins + // sd card knows data is config if sd_dout_strobe is asserted + // with sd_ack still being inactive (low) + 8'h19, + // send sector IO -> FPGA + // flag that download begins + 8'h17: begin + sd_buff_dout <= spi_dout; + b_wr2 <= 1; + end + + 8'h18: b_data <= sd_buff_din; + + // joystick analog + 8'h1a: begin + // first byte is joystick index + if(byte_cnt == 1) stick_idx <= spi_dout[2:0]; + else if(byte_cnt == 2) begin + // second byte is x axis + if(stick_idx == 0) joystick_analog_0[15:8] <= spi_dout; + else if(stick_idx == 1) joystick_analog_1[15:8] <= spi_dout; + end else if(byte_cnt == 3) begin + // third byte is y axis + if(stick_idx == 0) joystick_analog_0[7:0] <= spi_dout; + else if(stick_idx == 1) joystick_analog_1[7:0] <= spi_dout; + end + end + + // notify image selection + 8'h1c: mount_strobe <= 1; + + // send image info + 8'h1d: if(byte_cnt<5) img_size[(byte_cnt-1)<<3 +:8] <= spi_dout; + + // status, 32bit version + 8'h1e: if(byte_cnt<5) status[(byte_cnt-1)<<3 +:8] <= spi_dout; + default: ; + endcase + end + end + end +end + + +/////////////////////////////// PS2 /////////////////////////////// +// 8 byte fifos to store ps2 bytes +localparam PS2_FIFO_BITS = 3; + +reg clk_ps2; +always @(negedge clk_sys) begin + integer cnt; + cnt <= cnt + 1'd1; + if(cnt == PS2DIV) begin + clk_ps2 <= ~clk_ps2; + cnt <= 0; + end +end + +// keyboard +reg [7:0] ps2_kbd_fifo[1<= 1)&&(ps2_kbd_tx_state < 9)) begin + ps2_kbd_data <= ps2_kbd_tx_byte[0]; // data bits + ps2_kbd_tx_byte[6:0] <= ps2_kbd_tx_byte[7:1]; // shift down + if(ps2_kbd_tx_byte[0]) + ps2_kbd_parity <= !ps2_kbd_parity; + end + + // transmission of parity + if(ps2_kbd_tx_state == 9) ps2_kbd_data <= ps2_kbd_parity; + + // transmission of stop bit + if(ps2_kbd_tx_state == 10) ps2_kbd_data <= 1; // stop bit is 1 + + // advance state machine + if(ps2_kbd_tx_state < 11) ps2_kbd_tx_state <= ps2_kbd_tx_state + 1'd1; + else ps2_kbd_tx_state <= 0; + end + end +end + +// mouse +reg [7:0] ps2_mouse_fifo[1<= 1)&&(ps2_mouse_tx_state < 9)) begin + ps2_mouse_data <= ps2_mouse_tx_byte[0]; // data bits + ps2_mouse_tx_byte[6:0] <= ps2_mouse_tx_byte[7:1]; // shift down + if(ps2_mouse_tx_byte[0]) + ps2_mouse_parity <= !ps2_mouse_parity; + end + + // transmission of parity + if(ps2_mouse_tx_state == 9) ps2_mouse_data <= ps2_mouse_parity; + + // transmission of stop bit + if(ps2_mouse_tx_state == 10) ps2_mouse_data <= 1; // stop bit is 1 + + // advance state machine + if(ps2_mouse_tx_state < 11) ps2_mouse_tx_state <= ps2_mouse_tx_state + 1'd1; + else ps2_mouse_tx_state <= 0; + end + end +end + + +/////////////////////////////// DOWNLOADING /////////////////////////////// + +reg [7:0] data_w; +reg [24:0] addr_w; +reg rclk = 0; + +localparam UIO_FILE_TX = 8'h53; +localparam UIO_FILE_TX_DAT = 8'h54; +localparam UIO_FILE_INDEX = 8'h55; + +// data_io has its own SPI interface to the io controller +always@(posedge SPI_SCK, posedge SPI_SS2) begin + reg [6:0] sbuf; + reg [7:0] cmd; + reg [4:0] cnt; + reg [24:0] addr; + + if(SPI_SS2) cnt <= 0; + else begin + rclk <= 0; + + // don't shift in last bit. It is evaluated directly + // when writing to ram + if(cnt != 15) sbuf <= { sbuf[5:0], SPI_DI}; + + // increase target address after write + if(rclk) addr <= addr + 1'd1; + + // count 0-7 8-15 8-15 ... + if(cnt < 15) cnt <= cnt + 1'd1; + else cnt <= 8; + + // finished command byte + if(cnt == 7) cmd <= {sbuf, SPI_DI}; + + // prepare/end transmission + if((cmd == UIO_FILE_TX) && (cnt == 15)) begin + // prepare + if(SPI_DI) begin + addr <= 0; + ioctl_download <= 1; + end else begin + addr_w <= addr; + ioctl_download <= 0; + end + end + + // command 0x54: UIO_FILE_TX + if((cmd == UIO_FILE_TX_DAT) && (cnt == 15)) begin + addr_w <= addr; + data_w <= {sbuf, SPI_DI}; + rclk <= 1; + end + + // expose file (menu) index + if((cmd == UIO_FILE_INDEX) && (cnt == 15)) ioctl_index <= {sbuf, SPI_DI}; + end +end + +assign ioctl_wr = |ioctl_wrd; +reg [1:0] ioctl_wrd; + +always@(negedge clk_sys) begin + reg rclkD, rclkD2; + + rclkD <= rclk; + rclkD2 <= rclkD; + ioctl_wrd<= {ioctl_wrd[0],1'b0}; + + if(rclkD & ~rclkD2) begin + ioctl_dout <= data_w; + ioctl_addr <= addr_w; + ioctl_wrd <= 2'b11; + end +end + +endmodule diff --git a/Cobra_MiST/rtl/multi74123.vhd b/Cobra_MiST/rtl/multi74123.vhd new file mode 100644 index 00000000..5b25f241 --- /dev/null +++ b/Cobra_MiST/rtl/multi74123.vhd @@ -0,0 +1,36 @@ + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; + +entity multi74123 is + Port ( inh_pos : in STD_LOGIC; + q_neg : out STD_LOGIC; + clk : in STD_LOGIC); +end multi74123; + +architecture Behavioral of multi74123 is +constant pulse_len : integer range 0 to 32767 := 20160; +signal cnt : integer range 0 to 32767 := 0; +signal inh_R : std_logic := '0'; +signal inh_R_prev : std_logic := '0'; + +begin + + process (clk) is + begin + if rising_edge(clk) then + if cnt>0 then + cnt <= cnt - 1; + end if; + inh_R_prev <= inh_R; + inh_R <= inh_pos; + if inh_R_prev = '0' and inh_R='1' then + cnt <= pulse_len; + end if; + end if; + end process; + + q_neg <= '0' when (cnt>0) else '1'; + +end Behavioral; + diff --git a/Cobra_MiST/rtl/osd.v b/Cobra_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Cobra_MiST/rtl/osd.v @@ -0,0 +1,179 @@ +// A simple OSD implementation. Can be hooked up between a cores +// VGA output and the physical VGA pins + +module osd ( + // OSDs pixel clock, should be synchronous to cores pixel clock to + // avoid jitter. + input clk_sys, + + // SPI interface + input SPI_SCK, + input SPI_SS3, + input SPI_DI, + + // VGA signals coming from core + input [5:0] R_in, + input [5:0] G_in, + input [5:0] B_in, + input HSync, + input VSync, + + // VGA signals going to video connector + output [5:0] R_out, + output [5:0] G_out, + output [5:0] B_out +); + +parameter OSD_X_OFFSET = 10'd0; +parameter OSD_Y_OFFSET = 10'd0; +parameter OSD_COLOR = 3'd0; + +localparam OSD_WIDTH = 10'd256; +localparam OSD_HEIGHT = 10'd128; + +// ********************************************************************************* +// spi client +// ********************************************************************************* + +// this core supports only the display related OSD commands +// of the minimig +reg osd_enable; +(* ramstyle = "no_rw_check" *) reg [7:0] osd_buffer[2047:0]; // the OSD buffer itself + +// the OSD has its own SPI interface to the io controller +always@(posedge SPI_SCK, posedge SPI_SS3) begin + reg [4:0] cnt; + reg [10:0] bcnt; + reg [7:0] sbuf; + reg [7:0] cmd; + + if(SPI_SS3) begin + cnt <= 0; + bcnt <= 0; + end else begin + sbuf <= {sbuf[6:0], SPI_DI}; + + // 0:7 is command, rest payload + if(cnt < 15) cnt <= cnt + 1'd1; + else cnt <= 8; + + if(cnt == 7) begin + cmd <= {sbuf[6:0], SPI_DI}; + + // lower three command bits are line address + bcnt <= {sbuf[1:0], SPI_DI, 8'h00}; + + // command 0x40: OSDCMDENABLE, OSDCMDDISABLE + if(sbuf[6:3] == 4'b0100) osd_enable <= SPI_DI; + end + + // command 0x20: OSDCMDWRITE + if((cmd[7:3] == 5'b00100) && (cnt == 15)) begin + osd_buffer[bcnt] <= {sbuf[6:0], SPI_DI}; + bcnt <= bcnt + 1'd1; + end + end +end + +// ********************************************************************************* +// video timing and sync polarity anaylsis +// ********************************************************************************* + +// horizontal counter +reg [9:0] h_cnt; +reg [9:0] hs_low, hs_high; +wire hs_pol = hs_high < hs_low; +wire [9:0] dsp_width = hs_pol ? hs_low : hs_high; + +// vertical counter +reg [9:0] v_cnt; +reg [9:0] vs_low, vs_high; +wire vs_pol = vs_high < vs_low; +wire [9:0] dsp_height = vs_pol ? vs_low : vs_high; + +wire doublescan = (dsp_height>350); + +reg ce_pix; +always @(negedge clk_sys) begin + integer cnt = 0; + integer pixsz, pixcnt; + reg hs; + + cnt <= cnt + 1; + hs <= HSync; + + pixcnt <= pixcnt + 1; + if(pixcnt == pixsz) pixcnt <= 0; + ce_pix <= !pixcnt; + + if(hs && ~HSync) begin + cnt <= 0; + pixsz <= (cnt >> 9) - 1; + pixcnt <= 0; + ce_pix <= 1; + end +end + +always @(posedge clk_sys) begin + reg hsD, hsD2; + reg vsD, vsD2; + + if(ce_pix) begin + // bring hsync into local clock domain + hsD <= HSync; + hsD2 <= hsD; + + // falling edge of HSync + if(!hsD && hsD2) begin + h_cnt <= 0; + hs_high <= h_cnt; + end + + // rising edge of HSync + else if(hsD && !hsD2) begin + h_cnt <= 0; + hs_low <= h_cnt; + v_cnt <= v_cnt + 1'd1; + end else begin + h_cnt <= h_cnt + 1'd1; + end + + vsD <= VSync; + vsD2 <= vsD; + + // falling edge of VSync + if(!vsD && vsD2) begin + v_cnt <= 0; + vs_high <= v_cnt; + end + + // rising edge of VSync + else if(vsD && !vsD2) begin + v_cnt <= 0; + vs_low <= v_cnt; + end + end +end + +// area in which OSD is being displayed +wire [9:0] h_osd_start = ((dsp_width - OSD_WIDTH)>> 1) + OSD_X_OFFSET; +wire [9:0] h_osd_end = h_osd_start + OSD_WIDTH; +wire [9:0] v_osd_start = ((dsp_height- (OSD_HEIGHT<> 1) + OSD_Y_OFFSET; +wire [9:0] v_osd_end = v_osd_start + (OSD_HEIGHT<= h_osd_start) && (h_cnt < h_osd_end) && + (VSync != vs_pol) && (v_cnt >= v_osd_start) && (v_cnt < v_osd_end); + +reg [7:0] osd_byte; +always @(posedge clk_sys) if(ce_pix) osd_byte <= osd_buffer[{doublescan ? osd_vcnt[7:5] : osd_vcnt[6:4], osd_hcnt[7:0]}]; + +wire osd_pixel = osd_byte[doublescan ? osd_vcnt[4:2] : osd_vcnt[3:1]]; + +assign R_out = !osd_de ? R_in : {osd_pixel, osd_pixel, OSD_COLOR[2], R_in[5:3]}; +assign G_out = !osd_de ? G_in : {osd_pixel, osd_pixel, OSD_COLOR[1], G_in[5:3]}; +assign B_out = !osd_de ? B_in : {osd_pixel, osd_pixel, OSD_COLOR[0], B_in[5:3]}; + +endmodule diff --git a/Cobra_MiST/rtl/pll.qip b/Cobra_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Cobra_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) "pll.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Cobra_MiST/rtl/pll.v b/Cobra_MiST/rtl/pll.v new file mode 100644 index 00000000..752a1c32 --- /dev/null +++ b/Cobra_MiST/rtl/pll.v @@ -0,0 +1,385 @@ +// megafunction wizard: %ALTPLL% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altpll + +// ============================================================ +// File Name: pll.v +// Megafunction Name(s): +// altpll +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.0 Build 162 10/23/2013 SJ Web Edition +// ************************************************************ + + +//Copyright (C) 1991-2013 Altera Corporation +//Your use of Altera Corporation's design tools, logic functions +//and other software and tools, and its AMPP partner logic +//functions, and any output files from any of the foregoing +//(including device programming or simulation files), and any +//associated documentation or information are expressly subject +//to the terms and conditions of the Altera Program License +//Subscription Agreement, Altera MegaCore Function License +//Agreement, or other applicable license agreement, including, +//without limitation, that your use is for the sole purpose of +//programming logic devices manufactured by Altera and sold by +//Altera or its authorized distributors. Please refer to the +//applicable agreement for further details. + + +// synopsys translate_off +`timescale 1 ps / 1 ps +// synopsys translate_on +module pll ( + inclk0, + c0, + c1, + c2, + c3); + + input inclk0; + output c0; + output c1; + output c2; + output c3; + + wire [4:0] sub_wire0; + wire [0:0] sub_wire7 = 1'h0; + wire [2:2] sub_wire4 = sub_wire0[2:2]; + wire [0:0] sub_wire3 = sub_wire0[0:0]; + wire [3:3] sub_wire2 = sub_wire0[3:3]; + wire [1:1] sub_wire1 = sub_wire0[1:1]; + wire c1 = sub_wire1; + wire c3 = sub_wire2; + wire c0 = sub_wire3; + wire c2 = sub_wire4; + wire sub_wire5 = inclk0; + wire [1:0] sub_wire6 = {sub_wire7, sub_wire5}; + + altpll altpll_component ( + .inclk (sub_wire6), + .clk (sub_wire0), + .activeclock (), + .areset (1'b0), + .clkbad (), + .clkena ({6{1'b1}}), + .clkloss (), + .clkswitch (1'b0), + .configupdate (1'b0), + .enable0 (), + .enable1 (), + .extclk (), + .extclkena ({4{1'b1}}), + .fbin (1'b1), + .fbmimicbidir (), + .fbout (), + .fref (), + .icdrclk (), + .locked (), + .pfdena (1'b1), + .phasecounterselect ({4{1'b1}}), + .phasedone (), + .phasestep (1'b1), + .phaseupdown (1'b1), + .pllena (1'b1), + .scanaclr (1'b0), + .scanclk (1'b0), + .scanclkena (1'b1), + .scandata (1'b0), + .scandataout (), + .scandone (), + .scanread (1'b0), + .scanwrite (1'b0), + .sclkout0 (), + .sclkout1 (), + .vcooverrange (), + .vcounderrange ()); + defparam + altpll_component.bandwidth_type = "AUTO", + altpll_component.clk0_divide_by = 20, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 37, + altpll_component.clk0_phase_shift = "0", + altpll_component.clk1_divide_by = 192, + altpll_component.clk1_duty_cycle = 50, + altpll_component.clk1_multiply_by = 185, + altpll_component.clk1_phase_shift = "0", + altpll_component.clk2_divide_by = 80, + altpll_component.clk2_duty_cycle = 50, + altpll_component.clk2_multiply_by = 37, + altpll_component.clk2_phase_shift = "0", + altpll_component.clk3_divide_by = 1536, + altpll_component.clk3_duty_cycle = 50, + altpll_component.clk3_multiply_by = 185, + altpll_component.clk3_phase_shift = "0", + altpll_component.compensate_clock = "CLK0", + altpll_component.inclk0_input_frequency = 37037, + altpll_component.intended_device_family = "Cyclone III", + altpll_component.lpm_hint = "CBX_MODULE_PREFIX=pll", + altpll_component.lpm_type = "altpll", + altpll_component.operation_mode = "NORMAL", + altpll_component.pll_type = "AUTO", + altpll_component.port_activeclock = "PORT_UNUSED", + altpll_component.port_areset = "PORT_UNUSED", + altpll_component.port_clkbad0 = "PORT_UNUSED", + altpll_component.port_clkbad1 = "PORT_UNUSED", + altpll_component.port_clkloss = "PORT_UNUSED", + altpll_component.port_clkswitch = "PORT_UNUSED", + altpll_component.port_configupdate = "PORT_UNUSED", + altpll_component.port_fbin = "PORT_UNUSED", + altpll_component.port_inclk0 = "PORT_USED", + altpll_component.port_inclk1 = "PORT_UNUSED", + altpll_component.port_locked = "PORT_UNUSED", + altpll_component.port_pfdena = "PORT_UNUSED", + altpll_component.port_phasecounterselect = "PORT_UNUSED", + altpll_component.port_phasedone = "PORT_UNUSED", + altpll_component.port_phasestep = "PORT_UNUSED", + altpll_component.port_phaseupdown = "PORT_UNUSED", + altpll_component.port_pllena = "PORT_UNUSED", + altpll_component.port_scanaclr = "PORT_UNUSED", + altpll_component.port_scanclk = "PORT_UNUSED", + altpll_component.port_scanclkena = "PORT_UNUSED", + altpll_component.port_scandata = "PORT_UNUSED", + altpll_component.port_scandataout = "PORT_UNUSED", + altpll_component.port_scandone = "PORT_UNUSED", + altpll_component.port_scanread = "PORT_UNUSED", + altpll_component.port_scanwrite = "PORT_UNUSED", + altpll_component.port_clk0 = "PORT_USED", + altpll_component.port_clk1 = "PORT_USED", + altpll_component.port_clk2 = "PORT_USED", + altpll_component.port_clk3 = "PORT_USED", + altpll_component.port_clk4 = "PORT_UNUSED", + altpll_component.port_clk5 = "PORT_UNUSED", + altpll_component.port_clkena0 = "PORT_UNUSED", + altpll_component.port_clkena1 = "PORT_UNUSED", + altpll_component.port_clkena2 = "PORT_UNUSED", + altpll_component.port_clkena3 = "PORT_UNUSED", + altpll_component.port_clkena4 = "PORT_UNUSED", + altpll_component.port_clkena5 = "PORT_UNUSED", + altpll_component.port_extclk0 = "PORT_UNUSED", + altpll_component.port_extclk1 = "PORT_UNUSED", + altpll_component.port_extclk2 = "PORT_UNUSED", + altpll_component.port_extclk3 = "PORT_UNUSED", + altpll_component.width_clock = 5; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +// Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +// Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +// Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +// Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +// Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +// Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +// Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +// Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +// Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +// Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +// Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +// Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "20" +// Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "192" +// Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "80" +// Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "1536" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +// Retrieval info: PRIVATE: DUTY_CYCLE2 STRING "50.00000000" +// Retrieval info: PRIVATE: DUTY_CYCLE3 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "49.950001" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "26.015625" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "12.487500" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "3.251953" +// Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +// Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +// Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +// Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +// Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +// Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +// Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +// Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "deg" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "deg" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 STRING "ps" +// Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +// Retrieval info: PRIVATE: MIRROR_CLK2 STRING "0" +// Retrieval info: PRIVATE: MIRROR_CLK3 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "37" +// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "185" +// Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "37" +// Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "185" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "50.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "26.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "12.50000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "3.25000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT2 STRING "MHz" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT3 STRING "MHz" +// Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT2 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT3 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "deg" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT3 STRING "ps" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +// Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +// Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +// Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +// Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +// Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +// Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +// Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +// Retrieval info: PRIVATE: SPREAD_USE STRING "0" +// Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +// Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +// Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" +// Retrieval info: PRIVATE: STICKY_CLK2 STRING "1" +// Retrieval info: PRIVATE: STICKY_CLK3 STRING "1" +// Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +// Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: USE_CLK0 STRING "1" +// Retrieval info: PRIVATE: USE_CLK1 STRING "1" +// Retrieval info: PRIVATE: USE_CLK2 STRING "1" +// Retrieval info: PRIVATE: USE_CLK3 STRING "1" +// Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +// Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +// Retrieval info: PRIVATE: USE_CLKENA2 STRING "0" +// Retrieval info: PRIVATE: USE_CLKENA3 STRING "0" +// Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +// Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "20" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "37" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "192" +// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "185" +// Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "80" +// Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "37" +// Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "1536" +// Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "185" +// Retrieval info: CONSTANT: CLK3_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +// Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +// Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +// Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +// Retrieval info: USED_PORT: c2 0 0 0 0 OUTPUT_CLK_EXT VCC "c2" +// Retrieval info: USED_PORT: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +// Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +// Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +// Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +// Retrieval info: CONNECT: c2 0 0 0 0 @clk 0 0 1 2 +// Retrieval info: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +// Retrieval info: GEN_FILE: TYPE_NORMAL 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/Cobra_MiST/rtl/ps2_keyboard.vhd b/Cobra_MiST/rtl/ps2_keyboard.vhd new file mode 100644 index 00000000..10b1f855 --- /dev/null +++ b/Cobra_MiST/rtl/ps2_keyboard.vhd @@ -0,0 +1,143 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; + +entity ps2_keyboard is + Port( + CLK : in std_logic; + + PS2_CLK : in std_logic; + PS2_DATA : in std_logic; + + KEY_SCANCODE : out std_logic_vector(7 downto 0); + KEY_MAKE : out std_logic; + KEY_BREAK : out std_logic + ); +end ps2_keyboard; + +architecture Behavioral of ps2_keyboard is + +signal scancode_reg : std_logic_vector(7 downto 0); +signal scancode_next : std_logic_vector(7 downto 0); + +type state_type is (s0, s1, s2, s3, s4, s5, s6, s7); +signal cs : state_type := s0; +signal ns : state_type; + +signal bitpos_reg : integer range 0 to 7; +signal bitpos_next : integer range 0 to 7; + +signal make_reg : std_logic; +signal make_next : std_logic; +signal break_reg : std_logic; +signal break_next : std_logic; + +signal data_R : std_logic; + +signal clk_R_prev : std_logic; +signal clk_R : std_logic; +signal clk_falling_edge : std_logic := '0'; + +begin + + KEY_MAKE <= make_reg; + KEY_BREAK <= break_reg; + KEY_SCANCODE <= scancode_reg; + + process (CLK) is + begin + if rising_edge(CLK) then + data_R <= PS2_DATA; + scancode_reg <= scancode_next; + break_reg <= break_next; + make_reg <= make_next; + bitpos_reg <= bitpos_next; + cs <= ns; + if (clk_R_prev = '1' and clk_R = '0') then + clk_falling_edge <= '1'; + else + clk_falling_edge <= '0'; + end if; + clk_R_prev <= clk_R; + clk_R <= PS2_CLK; + end if; + end process; + + process (cs, break_reg, make_reg, bitpos_reg, scancode_reg, data_R, clk_falling_edge) is + begin + ns <= cs; + break_next <= break_reg; + make_next <= make_reg; + bitpos_next <= bitpos_reg; + scancode_next <= scancode_reg; + + if (clk_falling_edge='1') then + case cs is + when s0 => --idle + if (data_R='0') then --start_bit + bitpos_next <= 0; + make_next <= '0'; + break_next <= '0'; + ns <= s1; + else + ns <= s0; + end if; + + when s1 => + scancode_next(bitpos_reg) <= data_R; + + if bitpos_reg<7 then --get next bit + bitpos_next <= bitpos_reg + 1; + ns <= s1; + else -- last bit, get stop bit + ns <= s2; + end if; + + when s2 => --rcv odd parity bit + ns <= s3; + + when s3 => --rcv stop bit + if (data_R = '1') then --stop_bit + if scancode_reg=X"F0" then --key break + ns <= s4; + else + ns <= s0; + make_next <= '1'; + end if; + else -- wrong stop bit value + ns <= s0; + end if; + + when s4 => --key break + if (data_R = '0') then --start_bit + bitpos_next <= 0; + ns <= s5; + else + ns <= s0; + end if; + + when s5 => + scancode_next(bitpos_reg) <= data_R; + + if bitpos_reg<7 then --get next bit + bitpos_next <= bitpos_reg + 1; + ns <= s5; + else -- last bit, get stop bit + ns <= s6; + end if; + + when s6 => --rcv odd parity bit + ns <= s7; + + when s7 => --rcv stop bit + if (data_R = '1') then --stop_bit + ns <= s0; + break_next <= '1'; + else -- wrong stop bit value + ns <= s0; + end if; + end case; + end if; + end process; + +end Behavioral; + diff --git a/Cobra_MiST/rtl/roms/1986es.rom b/Cobra_MiST/rtl/roms/1986es.rom new file mode 100644 index 00000000..ffef8e1f Binary files /dev/null and b/Cobra_MiST/rtl/roms/1986es.rom differ diff --git a/Cobra_MiST/rtl/roms/48e.rom b/Cobra_MiST/rtl/roms/48e.rom new file mode 100644 index 00000000..ceae2268 Binary files /dev/null and b/Cobra_MiST/rtl/roms/48e.rom differ diff --git a/Cobra_MiST/rtl/roms/48turbo.rom b/Cobra_MiST/rtl/roms/48turbo.rom new file mode 100644 index 00000000..cd44e922 Binary files /dev/null and b/Cobra_MiST/rtl/roms/48turbo.rom differ diff --git a/Cobra_MiST/rtl/roms/BOOT.BIN b/Cobra_MiST/rtl/roms/BOOT.BIN new file mode 100644 index 00000000..c1c7c623 Binary files /dev/null and b/Cobra_MiST/rtl/roms/BOOT.BIN differ diff --git a/Cobra_MiST/rtl/roms/BOOT_DISK.BIN b/Cobra_MiST/rtl/roms/BOOT_DISK.BIN new file mode 100644 index 00000000..d3867aac Binary files /dev/null and b/Cobra_MiST/rtl/roms/BOOT_DISK.BIN differ diff --git a/Cobra_MiST/rtl/roms/OPUS.BIN b/Cobra_MiST/rtl/roms/OPUS.BIN new file mode 100644 index 00000000..ea5666ee Binary files /dev/null and b/Cobra_MiST/rtl/roms/OPUS.BIN differ diff --git a/Cobra_MiST/rtl/roms/OPUS.hex b/Cobra_MiST/rtl/roms/OPUS.hex new file mode 100644 index 00000000..f6dffba7 --- /dev/null +++ b/Cobra_MiST/rtl/roms/OPUS.hex @@ -0,0 +1,1025 @@ +:10000000F331FD5FC3DE06FFE32BE3E5C3EC20FF26 +:10001000C3A72DFFFFFFFFFF788747CD2B1C15C21D +:10002000001CD1C9AFCD2B1CC50E08781747CD2BAE +:10003000E3F5CDB900F1E3C9F5E52A785C23227830 +:100040005C7CB52003FD3440C5D5CDBF02D1C1E1F4 +:10005000F1FBC9F7074572726F720D001130002174 +:10006000200CCDB503C9E521DE06226F5C2100001E +:10007000222D5CE1C3F320FFFFFE41D8FE5B3FC9A8 +:10008000FE30D8FE3A3FC9CD8000D0CD7900D0FEF9 +:1000900061D8FE7B3FC9FE22C8FE23C9D630D8FEF8 +:1000A0000A3FD0D607FE0AD8FE113FC93E20D7C965 +:1000B0003E0DD7B7C93E07D7C97E23B7C8D718F9B1 +:1000C000131A6F131A677CCDD0007DCDD00018DCD9 +:1000D000F51F1F1F1FE60FCDF100D7F1E60FCDF181 +:1000E00000D7C94F06083E30CB1130013CD710F67F +:1000F000C9C630FE3AD8C607C90E01C300010E00BA +:10010000D5E5111027CD220111E803CD220111649C +:1001100000CD2201110A00CD22017DC630D7E1D1E8 +:10012000188AAF3CED5230FB19B9C80DC62FD7C99C +:10013000CDC600F73D206000CDF900C3B000CDE48E +:100140000113FE232830FE6028071BFDCB0046204C +:100150002526001ACD8000D8D6306F131ACD800026 +:100160003FD0D630444D29D829D809D829D8856F11 +:1001700030E92420E6C926001ACD9C00D86F131A56 +:10018000CD9C003FD029D829D829D829D8B56F18B7 +:10019000EDE5CD3E017DE1C90600041ABED8281068 +:1001A0007E23FE2030FAFE0828F0FE0A28EC37C92C +:1001B000D513231ABE28FA7EFE08280DFE0A200653 +:1001C0001ACD87003803D118D7E1B7C97E23FE20A6 +:1001D00030FA7EFE0C37C810F3B7C9CDE301FE2C10 +:1001E000C25116131AFE2028FAFE0928F6B7C97C58 +:1001F000BAC07DBBC91AB72807FE2020061318F520 +:100200003E01C9AFC942485936355447564E4A5542 +:1002100037345246434D4B4938334544580E4C4FC2 +:10022000393257535A200D5030315141E3C4E0E484 +:10023000B4BCBDBBAFB0B1C0A7A6BEADB2BAE5A558 +:10024000C2E1B3B9C1B87EDCDA5CB77B7DD8BFAEA2 +:10025000AAABDDDEDF7FB5D67CD55DDBB6D95BD75B +:100260000C07060405080A0B090FE22A3FCDC8CC8B +:10027000CB5EAC2D2B3D2E2C3B22C73CC33EC52F65 +:10028000C960C63AD0CEA8CAD3D4D1D2A9CF2E2F16 +:1002900011FFFF01FEFEED782FE61F280E677D148B +:1002A000C0D608CB3C30FA535F20F42DCB0038E6A3 +:1002B0007A3CC8FE28C8FE19C87B5A57FE18C9CD1B +:1002C0008E02C021005CCB7E200723352B20023616 +:1002D000FF7D21045CBD20EECD1E03D021005CBE5D +:1002E000282EEB21045CBE2827CB7E2004EBCB7E9E +:1002F000C85F77233605233A095C7723FD4E07FD57 +:100300005601E5CD3303E17732085CFDCB01EEC940 +:100310002336052335C03A0A5C77237E18EA421655 +:10032000007BFE27D0FE182003CB78C021050219E0 +:100330007E37C97BFE3A382F0DFA4F032803C64F8C +:10034000C921EB010428032105021600197EC921E9 +:100350002902CB4028F4CB5A280AFDCB305EC004DA +:10036000C0C620C9C6A5C9FE30D80DFA9D03201904 +:10037000218402CB6828D3FE383007D62004C8C6B3 +:1003800008C9D63604C8C6FEC9213002FE3928BACB +:10039000FE3028B6E607C68004C8EE0FC904C8CBF5 +:1003A0006821300220A4D610FE222806FE20C03E7E +:1003B0005FC93E40C9F37DCB3DCB3D2FE6034F06E1 +:1003C00000DD21CC03DD093A385CF60800000004AA +:1003D0000C0D20FD0E3F05C2D103EE10D3FE444F9D +:1003E000CB6720097AB32809794D1BDDE94D0CDD77 +:1003F000E9FBC9E5CD110430FBE1FDCB0056C8F5A2 +:10040000C5D5E5113500214501CDB503E1D1C1F1D7 +:10041000C9CD8E022802B7C9CD1E03D0155FCD33DA +:1004200003CD360437C9E5CDF303F5CD110438FB10 +:10043000F1E1C9CDFA03FE41D8FE5B3003C620C905 +:10044000FE61D8FE7BD0D620C9ED5B305C2A325CE1 +:10045000A7ED52444D2A345CC9CDC92C1AFE201395 +:1004600020FACDE401CD3E01D0210000C9FE2038A4 +:1004700003FE7FD83E2EC9060ACD050601F60A11F5 +:10048000AA5C217F5C200379804FF70D07466F75CA +:100490006E642000131ABE2320010CD710F6CDB0D5 +:1004A00000CB79C9CD5605D8F70754617065206C2B +:1004B0006F6164696E67206572726F720D00AF3D87 +:1004C000C9FF213F05E521801FCB7F280321980C20 +:1004D0000813DD2BF33E024710FED3FEEE0F06A4F9 +:1004E0002D20F50525F2D804062F10FED3FE3E0D73 +:1004F000063710FED3FE010E3B086FC307057AB323 +:10050000280CDD6E007CAD673E0137C325056C18F5 +:10051000F479CB7810FE3004064210FED3FE063E7E +:1005200020EF05AF3CCB15C214051BDD2306313E81 +:100530007FDBFE1FD07A3CC2FE04063B10FEC9F5ED +:100540003A385CD3FE3E7FDBFE1FFB3807F1C3E089 +:1005500017000000F1C9140815F33E0FD3FE213F28 +:1005600005E5DBFE1FE620F6024FBFC0CDE70530F4 +:10057000FA21150410FE2B7CB520F9CDE30530EBF4 +:10058000069CCDE30530E43EC6B830E02420F106F9 +:10059000C9CDE70530D578FED430F4CDE705D07964 +:1005A000EE034F260006B0181F082007300FDD7538 +:1005B00000180FCB11ADC0791F4F131807DD7E0057 +:1005C000ADC0DD231B0806B22E01CDE305D03ECB26 +:1005D000B8CB1506B0D2CA057CAD677AB320CA7C09 +:1005E000FE01C9CDE705D03E163D20FDA704C83E5B +:1005F0007FDBFE1FD0A9E62028F3792F4FE607F610 +:1006000008D3FE37C9217F5C7EB7C87ECD87003016 +:100610001BFE3F2817FE2A20083E3F772310FC18B8 +:100620000EFE2028F6B7200B3E2018EF2310DC36F4 +:1006300000B7C937C9217F5C131AB7C8CBBF477E43 +:10064000FE3F280AB82806CB7928EDB7C9D505237F +:10065000137EB7280EFE3F28F51AB72803BE28EEF2 +:10066000D118D2D137C9D5112000C5E54177231063 +:10067000FCE119C110F4D1C9D578321B5C1805858D +:100680006F3001247E233C8710F52BD6014F112FAC +:100690005CEDB07E23666FD1E5217F5C3600DD2105 +:1006A000305CE53A2F5CB71A281BCD3E013810DDCF +:1006B0007500DD7401DD23DD23212F5C3518E41A7C +:1006C00013FE2C28F0E1B7C8FE222006CDFF0E3025 +:1006D000D1C9CDE401C877B7C823131A18F821008F +:1006E0005C11015C0150003600EDB0FD213A5C2147 +:1006F0006E0022365C3E0732395CAF32385C326ABB +:100700005CCDFB2D3E3FED47ED5621230522095CD4 +:10071000217D00220C5C211800220E5C3E38321034 +:100720005CFD35C6FD35CAFDCB00D63ECC323B5C08 +:10073000FBED73195CF70F0D0D0D202057656C63F1 +:100740006F6D6520746F20204F505553203A00CDB7 +:100750003631212159011E043E4FCD660621C9596B +:10076000010F0A3E68CD660601060ACD9D2DF75A97 +:100770003830204F5045524154494E47205553453B +:10078000522053595354454D202076332E320D06B6 +:10079000067F203139383820627920204449504F73 +:1007A00027530D0D0D0D0606202020204D41494EEA +:1007B00020204D454E550D0606085F5F5F5F5F5F69 +:1007C0005F5F5F5F5F5F5F5F5F5F5F5F5F5F0D0DDD +:1007D0000606202031202D204D6F6E69746F720D3A +:1007E0000D0606202032202D20417373656D626C4A +:1007F00065720D0D0606202033202D2054434F50E6 +:100800005900CD2604010000CDF030FE31CA5F1B37 +:10081000FE32CA1F08FE33CA1036CD5C0018E3F75B +:100820000F415353454D424C45520D00DDCB00BEA8 +:10083000210060221E5C11FFFFCD530A2B22205C99 +:100840002178FF221C5C219B08222D5CF7074F506A +:1008500055530D0D00AF321B5CFD213A5CFDCB0002 +:1008600086FDCB008E3A1B5CFE07200D2A305CED26 +:100870005B325C193825CDFE00ED7B195CCDC92CAF +:10088000CDE40128D0CD79003807CDA00830CA18B2 +:100890000ACD80003805CDAD0830BECD530018B567 +:1008A00021EC17CD9801D8211518C37806CD510138 +:1008B000D87CA5FEFF37C822305C1AFE2020011329 +:1008C00021AA5C0E00CD8F0911AA5CED5222265C94 +:1008D000ED5B305CCD530A38032831AF08ED4B2671 +:1008E0005C78B1C808280DFDCB00FE36FF2322201E +:1008F0005C36FF232B2B030303CD51097323722393 +:10090000EB21AA5CED4B265C03EDB0C9CD780AED76 +:100910005B265C7AB3281BEBED4228E5EB424B38B3 +:1009200005CD510918DAAF914F3E009847CD3709F0 +:1009300018CE2B2B030303E5D5545D09ED4B205C4A +:1009400079954F789C4703EDB01BED53205CD1E1C6 +:10095000C9D5EB2A205C090178FEB7ED42093815AC +:10096000F74F7574206F66206D656D6F7279202169 +:100970000D00C37908EBED4B205C79954F789C47CF +:10098000032A205CED53205CEDB823D1C923131A50 +:1009900077B7C8FE2020030C18F40D28080C28088F +:1009A000360923180336092301007FE5218F18CD6E +:1009B0009A01E13804702318D61A77CD87003805DC +:1009C000CDED0918CAFE2328F7FE22200DCDED0932 +:1009D000FE2228B9FE0020F518B5FE3B20AFCDED74 +:1009E00009B720FA3E202BBE28FC2318A213231A95 +:1009F00077CD870030F7C913237EFE09282AFE80B1 +:100A00003007CD450AB720EFC9D67F47E5218F18BB +:100A1000CDD7013004E17E18E97EFE203807CD45B0 +:100A20000A132318F4E118D0E5D521AA5CAFEBED49 +:100A300052D17DC606CDE22DE128BD3E20CD450A2E +:100A40001310FA18B3CB41200212C9B7C8F5CD8CE8 +:100A500015F1C92A1E5CFDCB007E2003B43FC94EB0 +:100A600023462378A1FEFF37C878BA3804C079BB83 +:100A7000D0AFBE2320FC18E7AFE5474FEDB1914F53 +:100A80003E0098470BE1C92A345C22245CED5B30C0 +:100A90005CCD530A300EC92A225C4E23462378A12E +:100AA000FEFF37C8EB2A325CB7ED42D8EBED43309E +:100AB0005C11AA5C0E00CDF9092322225CC92A3000 +:100AC0005C3E07D7CDFE0021AA5C7E23B72803D762 +:100AD00018F8CDB0003E7FDBFE1F3FD82A245C7C97 +:100AE000B5C82B7CB522245CC0D5CDF303D1FE0D57 +:100AF00037C02A345C22245CB7C9E12A305CC37653 +:100B000008CD870A3FD0CDBE0A3FD0CD970A18F452 +:100B1000CD270BD82A465CED4B265CCD3709C3E9BF +:100B200016CD270BD818F72A325CED5B305CCDEF81 +:100B300001D8ED5B345CCDEF0138072A305CCDEF96 +:100B400001D808ED5B305CCD530AD82B2BE5ED5B6B +:100B5000325CCD530A3002E1C9CD780A0309D108CD +:100B60003004D5231801E5ED5222265CED5B345CA0 +:100B7000CD530A2B2BED4B265CCD5109D1EB2246F0 +:100B80005CED4B265CEDB0B7C9ED5B345CCD530A30 +:100B90003FD02B2BED4B325CED5B305C732372232B +:100BA000AFBE2320FC7E23A6FEFFD02BEB09D8EBA3 +:100BB00018EAED5B305CCD530A3FD02B2BE5ED5BA3 +:100BC000325C13CD530A2B2BD1B7ED52C83FD0EB7B +:100BD000424BC33709CD870A3FD011A95C217F5C06 +:100BE000131AB7281ABE20F8D523137EB7280A1A7D +:100BF000B72803BE28F3D118E4D1CDBE0A3FD0CD2B +:100C0000970A18D4FDCB00BE1804FDCB00FE2A3095 +:100C10005C221E5CC336082A2D5CE9FDCB007EC831 +:100C2000ED5B305C7AA3FEFF281ACD530A38152BF2 +:100C30002BE5CDB5006069CDF900F73A2000E1CD94 +:100C40003001B7C9F70750726F673A20002A1E5C5F +:100C5000E5CD3001F707456E643A2020002A205C7C +:100C6000CD3001D1B7ED52F70753697A653A2000CC +:100C7000CD3001B7C92A305C22345C2322245CEDDC +:100C80005B1C5CD5D1CDD20A3FD02178FFB7ED52A5 +:100C9000C8D5217F5C06061AE67F77FE202804234C +:100CA0001310F43E0690323C5CAF323D5C773E055B +:100CB00032285CD1CD750D3E06D7D5ED5B1E5C1B91 +:100CC000131A6F131A67A5FEFF28B9083E2108CD35 +:100CD000100D3008B728E9083E2018F2E51B0EFF7A +:100CE000CD350630232A3C5C197ECD8700EB3018C9 +:100CF00021285C3520093604CDB0003E06D7D7E167 +:100D000008D708CDFE0018C6E1CD100D30FB18C481 +:100D1000131AC38B000606CD05062826DA9B08EDBC +:100D20005B1C5C1B0EFFCD35063008CD750DCDB0BC +:100D30000018053E07B35F132178FFB7ED5220E39B +:100D4000B7C92A305C22345C22245CED5B1C5C3E1B +:100D500003F52178FFB7ED522817CD750DF13D2829 +:100D600006F720200018EACDB000CDD50A3F38DFC5 +:100D7000C9F1C3B00006061A4F1AE67F13D710F95F +:100D80001A6F131A67133E3DD7CB792009F7085520 +:100D90006E64656600C9C3C600AF4723BE2803045E +:100DA00018F978FE0F3FC9217E5C237EB7C8FE206C +:100DB00020F8360023010D0011465CEDB0AF122182 +:100DC0007E5CCD990DD8323C5C21455CCD990DD827 +:100DD000323D5CB7C93A3C5C473A3D5CB8281130BB +:100DE000084F7891473E04180490473E05D710FD00 +:100DF00021465CCDB9002A155CCDF52CC3AD083A6F +:100E0000395C18023E3021C059012001C36606CD6D +:100E1000870A3FD011A95C0E00CD35063005CDBE46 +:100E20000A3FD0CD970A18EACDA70DD828E121FFB7 +:100E30000022345CED5B305CCD530A22725CED43E2 +:100E4000745C3E0732285CCDFB2DCD870A3006CD81 +:100E5000FF0DC39A2D11A95C0E00CD35063071D55A +:100E6000CD040E3A285CC607470E00CD9D2D2A30D2 +:100E70005CE52A745C22305CCD870AED4B275C3E32 +:100E80000E9047C5CDBE0ACD970AC1380410F4189C +:100E900006F7070D0010FACD2604E1F522305CCDEF +:100EA000870AF1E1FE5128A7FE593A3C5C201AE579 +:100EB00011AA5CB7ED523E06854F060ECD9D2DCD95 +:100EC000D50DCD870AE13A3D5C5F160019EB188815 +:100ED0003A285CB728063D32285C18122A725CBE9C +:100EE0002320FC4E23462322725CED43745CCD9795 +:100EF0000AC34D0E13CDE401C8FE3AC8FE3BC947F4 +:100F00000E001A13B8280EB7280FFE2028020EFF75 +:100F10000C772318ED360023C977B937C82B0D1885 +:100F2000F81ACD8B00DA45162178FF0606771323D1 +:100F30001ACD8700380510F5C3481608362023104F +:100F4000FBD52178FFED5B1C5C18082178FF7BF650 +:100F5000075F131AE67FBE20F5060523131ABE208D +:100F6000EA10F8ED52203F082A1C5CED4B205CB7DC +:100F7000ED42012000B7ED42301BF74F7574206F32 +:100F8000662073796D626F6C2073706163652021D8 +:100F90000D00C379082A1C5C2B2B2BEB010600EDFE +:100FA000B813ED531C5C7BE6F85FD5DDE1D108C9D1 +:100FB0000600FEBDC804FEE4C804FEB9C804FE89EC +:100FC000C804FEC7C8FEBCC804FEC6C8FEE2C8040A +:100FD000FEC5C804FEB8C90600FE87C804FE94C852 +:100FE00004CD5C10C804BCC90600FE87C804FE948A +:100FF000C804BCC804FEDEC90600FE86C804FE891B +:10100000C804FE92C804FE9DC804FEA3C804FEB234 +:10101000C804FE28280704FE80C8373FC9CDE30175 +:10102000CD5C1020353809CDE301FE29C8C34B162D +:101030002E00CDE301FE2B200ACD3D16FE80381197 +:10104000C34E16FE2D200ECD3D16FE81D24E16ED5E +:10105000446FCDE401FE29C24B1637C9FEA5C8FE78 +:10106000AE20053EDDC38C15FEAFC03EFDC38C1522 +:101070000600FE86C804FE89C804FE92C804FE9DD0 +:10108000C804FEA3C804FEB2C80607FE80C91378D0 +:10109000B1C38C151378878787B1C38C15137887F4 +:1010A000878787B1C38C15133EEDCD8C1579C38C22 +:1010B00015CD3E1647A128D7C3541620053EC9C3F7 +:1010C0008C15CDB00F28CDC354162684CDD70F284C +:1010D000CCC35416CD3E16FE08D24E16878787B174 +:1010E0004FCDE401FE2CC25116CDE301CDF80FC265 +:1010F000541638073ECBCD8C1518933ECBCD8C15AE +:101100007DCD8C151888CDF80F200AD28E10CD8E8B +:10111000107DC38C15DA5416CD3E166F79F646CD88 +:101120008C157DC38C15FE802005CDDB0118D7679B +:10113000CB5920140E09CD5C10C25416CDDB01CD65 +:10114000E80FCA9D10C35416473EEDCD8C153E42A4 +:10115000CB612002F6084F78FEA5C25416CDDB0104 +:10116000CDE80FCA9D10C3541626DECDD70F200C34 +:101170003E03CB412802F6084FC39D10CDF80FC2A5 +:101180005416D29410CD94107DC38C15CDB00F2081 +:1011900008CD9510CDDB0118053ECDCD8C15CDAA1F +:1011A000157DCD8C157CC38C15CDB00F2008CD9549 +:1011B00010CDDB0118E8FE2828043EC318DDCDE37E +:1011C00001CD5C10C25416CDE301FE29C24B1613AB +:1011D0003EE9C38C15CDB00F200E78FE04D2541614 +:1011E000CD9510CDDB0118053E18CD8C15ED4B26A5 +:1011F0005C79D67E4F300105CDAA15380AED427CC8 +:10120000B7C24E167DEE80C38C1579CD8C1518DDD6 +:10121000CD3E16CD8C15CDF50EC8FE2CC251161341 +:1012200018EECD9E11CDF50EC8FE2CC25116131826 +:10123000F1CDAA15DA6016ED4B295C0922295CC9AB +:10124000CDAA15DA601622295CC9CDAA15222B5C1D +:10125000C92A295C222D5CC9FE942828FE842832E4 +:10126000FE28C25A16CDE301FEDEC25416CDE301BC +:10127000FE29C24B16CDDB01CD5C10C254163EE3F5 +:1012800013C38C15CDDB01FEA5C254163EEB13C370 +:101290008C15CDDB01FE83C254163E0813C38C159A +:1012A000FE802028CDDB01FE28C25A16CDE301FEC8 +:1012B0008920040607182B3EDBCD8C15CD3E16CDBC +:1012C0008C15CDE401FE29C24B1613C9CD7010C296 +:1012D0005416CDDB01FE28C25A16CDE301FE89C2A9 +:1012E0005416CDE301FE29C24B163EEDCD8C15C33D +:1012F0009410FE28C25A16CDE301FE89281D3ED364 +:10130000CD8C15CD3E16CD8C15CDE401FE29C24BFA +:1013100016CDDB01FE80C2541613C9CDE301FE29B0 +:10132000C24B163EEDCD8C15CDDB01CD7010CA94AD +:1013300010C35416CD3E16FE03D24E166F3EEDCDB1 +:101340008C153E462D28052D2004F608F610C38C7A +:1013500015FE80C2B113CDDB010E78CDF80F200A47 +:10136000D28E10CD8E107DC38C153028FE872004C0 +:101370003E0A1812FE9420043E1A180A3E3ACD8CFA +:1013800015CD9E11180413CD8C15CDE401FE29C294 +:101390004B1613C9FEA6280FFECA28103E3ECD8C60 +:1013A00015CD3E16C38C150E57C3A7100E5FC3A7ED +:1013B0001026DECDD70F2035CDDB01FE28201413FB +:1013C00078FE023E2A28B73EEDCD8C150E4BCD9E01 +:1013D0001018AE6F78FE037D200BCD5C1020063E0A +:1013E000F913C38C150E01CD9E10C39E11CDF80FBD +:1013F000204A78F5878787B14FF13816FE062825F1 +:10140000CDDB01CDF80F2026D28E10CD8E107DC3FE +:101410008C15CDDB01CD701028F179E63FF606CDB5 +:101420008C157D180ECDDB01CD7010CA8E1079E6BB +:101430003FF606CD8C15CD3E16C38C153815FEA68D +:1014400020080E47CDA810C31113FECA0E4F28F472 +:10145000C35416FE8720063E0213C30613FE9420D3 +:10146000063E1213C30613CDAA15CDE401FE29C210 +:101470004B16CDDB01FE8020093E32CD8C1513C307 +:10148000A111E526DECDD70FE1C2541678FE023E4B +:1014900022CA7B143EEDCD8C150E43CD9E10C37E2B +:1014A00014C8217F5C13CDFF0E30011BD5217F5C5A +:1014B0000EFFCDF909D1C9211B5CB735C036031821 +:1014C00014FDCB007EC82178FF221C5C2A305C22F0 +:1014D000345C22245C2A205C2322295C2100002227 +:1014E0002B5C219B08222D5CED5B1E5C1A4F131AAE +:1014F0004713A1FEFF28C0ED43305CED53225C2A68 +:10150000295C22265CCDF50E201413B728DEFE3AA6 +:1015100028EDFE3BC245161AB728EF1318F9D680FE +:10152000304DCD210F300F3A1B5CFE02D23615DD57 +:10153000CB007EC25716CDE401D680DA4516FE20D8 +:101540002011CDA915383FDD7506DD7407DDCB0010 +:10155000FE1833FE3F200BCDA915DA601622295C58 +:1015600018E52A295CDD7506DD7407DDCB00FE2158 +:101570008615E54F060021301A0909094E237E23FE +:10158000666FCDF40EE9CDE401C30A15D9473A1BC5 +:101590005CFE0320092A295CED5B2B5C19702A296B +:1015A0005C2322295CD9AF37C913AF32285CC5DD73 +:1015B000E5CD0A16CDE401FE2B280EFE2D280AFEED +:1015C000262806FE212802182DF5E513CD0A16C19E +:1015D000F1FE2D200779956F789C1817FE2B2003BC +:1015E0000918D1FE26200779A56F78A4180579B5CA +:1015F0006F78B46718BEDDE1C13A285C87D03A1B2A +:101600005CCB4F210000C8C36016CDE401CD3E0184 +:10161000D01A13FE22281C2A265CFE24C81BCD21CA +:101620000FB7DD6E06DD6607DDCB007EC03EFF3204 +:10163000285CC91A136F1AFE22200A13C913E5CDBC +:10164000AA157DE1C9063021063121063221063373 +:101650002106342106352106362106372106382198 +:101660000639F7074572726F72200078D7CDB00047 +:10167000D92A225C11AA5C0E00CDF909CDBE0AD987 +:10168000211B5CCB862A265C22295C2A195C2B2B29 +:10169000F93FD0CDF50ECA0A151318F7FDCB007E21 +:1016A00020052A1E5C18042A205C2B222B5CAF111B +:1016B0001100DD21AA5C37CD560538053C28EF180E +:1016C00036CD770420E8F7074C6F6164696E672EAA +:1016D0002E0D003EFFED5BB55CDD2A2B5C37CDA403 +:1016E000043014FDCB007E28162A1E5C0101001177 +:1016F0000100CD9C0B18083EFF2A2B5C7723772A2C +:101700001E5C22305CC30A0CAF111100DD21AA5C03 +:1017100037CD560538043C28EFC9CD770420E9F7CA +:1017200007566572696679696E672E2E0D00DD2A8F +:101730001E5CED5BB55CAF3DCDA404D0F7074669F8 +:101740006C65206F6B2E0D003FC9F70753617669FA +:101750006E67202000DD21AA5CDD360003DD230654 +:101760000A117F5C1AB7280BDD770013DD23D71031 +:10177000F318093E20DD7700DD2310F92A205CED07 +:101780005B1E5CB7ED5223DD7500DD7401DD730275 +:10179000DD7203E5D5CDB817DD21AA5CAF111100CC +:1017A000CDC204DDE1D1D0010000CDF0303EFFCD4F +:1017B000C204F70B0700B7C9F70D0D075374617228 +:1017C0007420746170652C207468656E2070726579 +:1017D000737320616E79206B65790D00CD2604C985 +:1017E000F70D07425245414B0D00AFC94108430870 +:1017F000440845084608470849084B084C084D0866 +:101800004E084F085008510852085308540855080C +:10181000560858080C010E00C11403000000000017 +:1018200000210B02FFFF0000B20B00170C030000A9 +:10183000FFFF0E00280E009C16020A000A00FA0A9A +:1018400003000000000700252E030000FFFF0E002C +:10185000010B03000000000000100B010060040CED +:101860000100600A0C004A17003507030A000A004D +:101870000000890B01FFFF1B0C010E00150D03007A +:1018800000000000003721000817010600750C4118 +:101890000A414443200841444420084146270A4164 +:1018A000460A414E442008420A42430A4249542013 +:1018B00008430A43414C4C20084343460A43502006 +:1018C000084350440A435044520A4350490A435083 +:1018D00049520A43504C0A440A4441410A44450AC9 +:1018E00044454320084445464220084445464D208F +:1018F0000844454653200844454657200844490AB1 +:10190000444953502008444A4E5A2008450A454944 +:101910000A454E540A455155200845582008455857 +:10192000580A480A48414C540A484C0A490A494D49 +:101930002008494E2008494E432008494E440A4990 +:101940004E44520A494E490A494E49520A49580AD8 +:1019500049590A4A5020084A5220084C0A4C44204F +:10196000084C44440A4C4444520A4C44490A4C44EE +:1019700049520A4D0A4E430A4E45470A4E4F500AF5 +:101980004E560A4E5A0A4F5220084F524720084FCF +:101990005444520A4F5449520A4F555420084F5547 +:1019A00054440A4F5554490A500A50450A504F0AA8 +:1019B000504F502008505553482008520A52455362 +:1019C00020085245540A524554490A5245544E0A79 +:1019D000524C2008524C410A524C432008524C436E +:1019E000410A524C440A525220085252410A525261 +:1019F000432008525243410A5252440A525354203F +:101A00000853424320085343460A53455420085381 +:101A10004C41200853500A535241200853524C2045 +:101A2000085355422008560A584F5220085A0A0CAB +:101A3000005D16882611802611005D16005D16A037 +:101A40000611005D16005D1640D410005D16C48CB2 +:101A5000113FAD10B80611A9A810B9A810A1A8107F +:101A6000B1A8102FAD10005D1627AD10005D160552 +:101A7000691100101200A114003112002212F3ADFE +:101A800010004A12100A12005D16FBAD1000511230 +:101A9000005D16005812D9AD10005D1676AD10002D +:101AA0005D16005D1600341340A012046911AAA847 +:101AB00010BAA810A2A810B2A810005D16005D16FA +:101AC000C2A91120D511005D16405113A8A810B865 +:101AD000A810A0A810B0A810005D16005D1644A8BC +:101AE0001000AD10005D16005D16B006110040122A +:101AF000BBA810B3A81041F212ABA810A3A8100005 +:101B00005D16005D16005D16C1CA10C5CA10005DE5 +:101B10001680D410C0BB104DA81045A81010EC10B2 +:101B200017AD1000EC1007AD106FA81018EC101FC7 +:101B3000AD1008EC100FAD1067A810C7B1109826B3 +:101B40001137AD10C0D41020EC10005D1628EC1039 +:101B500038EC10900611005D16A80611005D16F70E +:101B60000F4D4F4E49544F520D00210000222D5C65 +:101B7000FD213A5CAF321B5CFDCB00C6FDCB008E75 +:101B8000ED7B195CCDC92CCDE40128E4CD961B304A +:101B9000DFCD530018DA21732BCD9801D8219E2B6D +:101BA000C37806CD4904281AD8D5EBA7ED52E12811 +:101BB00011300CEB09ED5B325CEB03EDB81803035D +:101BC000EDB0F7434F50494544204F2E4B2E0D00AA +:101BD000B7C9FDCB009E117F5C21AA5CCDE401C892 +:101BE000FE28200113CDE40137C8FE22200C131A71 +:101BF0007723131AFE2220F818EAFE292809CD912E +:101C000001D877231B18DD11AA5CB7ED527DD94F9F +:101C1000D9CD4904D822245CEB11AA5CD941D91A48 +:101C200013EDB12015E5D905D928241A13C5EDA166 +:101C3000C12003EA261CE1EA191CFDCB005E200D41 +:101C4000F7074E4F5420464F554E440D00B7C9E19B +:101C5000FDCB00DE2BF707464F554E442041542064 +:101C60003A2000CDC600CDB00023E5D5C5CDD50ABC +:101C7000C1D1E13FD078B120A0C93A345C1801AF9E +:101C8000CD4904D8EB0377EDA1E018FA117F5CCDC4 +:101C90009101D8CD4904D8BDC8087DEBEDB1C0088D +:101CA0002B772308EA9C1CC92A325CED5B305C016F +:101CB0008000AF1313ED5209B42015ED427DF707F4 +:101CC0004F4646534554203D2000CDD000C3B000C0 +:101CD00037C911515CF7070D0720424320202044EB +:101CE00045202020484C20202041462020204958D3 +:101CF00020202049590D0700CD8D1DF70D070D0738 +:101D00002042432720204445272020484C272020DC +:101D10004146272020504320202053500D0700CD5E +:101D20008D1DF70D070D070D07464C414753203D0C +:101D300020535A2D482D504E4320202028535029FF +:101D400020492020520D07062020003A585CCDE3A0 +:101D5000003E06D72A6B5CCDC6003A6D5CCDD00044 +:101D6000CDAC003A6E5CCDD000F70D070D070642F2 +:101D70007265616B706F696E74203A2000CDE62049 +:101D80002805CDC60018033E2DD7C3B0000606CDEA +:101D9000C00010FBC921000022765CCDD21C2A179E +:101DA0005C22505C7CD60C67224E5CFDCB00662822 +:101DB0000EED4B4E5CCD9D2DCDD21CFDCB00A6CDA6 +:101DC000701ECD7630FE512007ED4B505CC39D2D2B +:101DD00021765CCDC52D3810FE082879FE09285FD4 +:101DE000FE0A2820FE0B2814FE0C2869FE0D285739 +:101DF00047CD9C0078301CCD5C0018C67ED60638D6 +:101E0000F67718BB7EC606FE0C30ECFE0A38F23EB2 +:101E10000918EED72A155CCDF52C3A765CFE06380B +:101E200002D606CD671E835FCD3E01EB3A765C8716 +:101E300021525C856F732372FDCB00E621765C2313 +:101E4000347EFE04380C2B347EFE0A20023600233A +:101E50003600C3AB1D23AFB628033518A536032BB8 +:101E6000B620F73609189BB7C847AFC60510FCC99E +:101E70003A765CCD671E0602FE1E38040605D61EA5 +:101E80004F3A775C814F2A4E5C09444DC39D2D3AF1 +:101E90003A5CEE04323A5CC9CDFB2D3E70CD252074 +:101EA000FDCB00EEFDCB00DE2A305CE57DE6806FE9 +:101EB000010006CD9D2D0610CDCA1F10FBE10110BB +:101EC00002CD9D2DCDC600CDF41FCD7630FEC728A6 +:101ED00075FEC3CA4F1FFEC9CA561FE5CDC52DE109 +:101EE0003814FE08CA9B1FFE09CA7F1FFE0ACA706B +:101EF0001FFE0BCA5E1FFE0CCA9B1FFE0DCABA1F37 +:101F0000FE0ECAC01FFDCB005E282CCD9C00382FD2 +:101F10005F56FDCB006E281A070707075F3E0FA22A +:101F2000B377ED4B175C0E00CD9D2DE5CDCA1FE1BB +:101F3000184D3EF0A218E9FE203804FE8138E2E593 +:101F4000CD5C00E118843A395CCD2520C39A2D116F +:101F5000800019C3AB1E118000B7ED5218F57DD675 +:101F6000086F30032518ECE678FE7828E6C3BE1E1D +:101F70007DC6086F30032418DAE67828D618EEFDFF +:101F8000CB005E280CFDCB006E2806FDCB00AE1802 +:101F90001AFDCB00EE237DE67F18E0FDCB005E2826 +:101FA0000DFDCB006E2007FDCB00EEC3C71EFDCBA1 +:101FB00000AE2B7DE67FFE7F18B17DF6076F18D14E +:101FC0003A3A5CEE08323A5C18E1C57DE6F86FCD2E +:101FD000C600CDAC00E506087E23CDD000CDAC0018 +:101FE00010F6D7D7E106087E23CD6D04D710F8CDC3 +:101FF000B000C1C9E57DE680477D904F7D0F0F0F92 +:10200000E60FC6064779E607FDCB005E280F4FCBEB +:102010002781C606FDCB006E20053C1802C6204F66 +:10202000CD9D2DE1C9214B58010501C366062A301B +:102030005CCD30012A325CCD30012A305CED5B3260 +:102040005C19F7282B293D2000CDC600F720202061 +:10205000282D293D20002A305CB7ED52CDC600C3A3 +:10206000B000CDE62028067E36CF32295C21701BD9 +:10207000226F5C21F320E52A305CE5060A21525CE0 +:102080005E235623D510F9F108E1D1C1D9FDE1DD78 +:10209000E1F1E1D1C1C9FD213A5CCDD21CF7070DB8 +:1020A000072063202D20636F6E74696E7565202094 +:1020B00020202071202D20717569740D00CD26041B +:1020C000FE43201021701B226F5C21F320E52A2D96 +:1020D0005CE518A7FE51CA701BCD5C0018DF2A30E2 +:1020E0005C222D5CB7C92A2D5C7CB7C921962022C1 +:1020F0006F5CE1F322565CE122665CED73685CE1A3 +:10210000226B5CF5ED5FD606326E5CED57326D5C8E +:10211000F131665C08F5D9E5D5C5D9FDE5DDE50801 +:10212000F53B3BD5C52A6F5CED7B685CFBE5CDE6F6 +:1021300020C83A295C77C92A7B5CE9ED5B325C7A7E +:10214000B3C8DD2A305C3A345C37CDA404B7C9ED9E +:102150005B325C7AB3C8D5CDB817D1DD2A305C3A92 +:10216000345CC3AF17AFDD21AA5C11110037CDA4D9 +:1021700004D011AA5CF70D0754797065203A20004D +:102180001ACDD000F70D0746696C656E616D65204C +:102190003A2000D5060ACD9404F7074E616D6520FC +:1021A0002868657829203A0D07202000D1060A13F7 +:1021B000CDAC001ACDD00010F6F70D074C656E6758 +:1021C0007468203D2000CDC000F70D0741646472A3 +:1021D000657373203D2000CDC000F70D0750726776 +:1021E0002E6C6774682E203D2000CDC000C3B00067 +:1021F0002A305C22195CC3701B2A305C22425C22AC +:102200003C5C2A325C22445C2A345C22245C3E42E0 +:1022100032715C210A2C22505C224E5C210000228B +:102220007D5C22725C222B5CCDC122CDD50A30F8B8 +:10223000B7C93E3032715CCD5727ED53425CED5348 +:102240003C5C03ED43445CF707444953503A20009B +:10225000CD5904222B5CF707546578743A2000CDE1 +:10226000590422725C7CB5281B210000227D5CF79A +:1022700007576F726B73706163653A2000CD590424 +:102280007CB520032100F022505C224E5CE5CD5746 +:1022900027E17323722371237023E520F1E12246A5 +:1022A0005C22485CF7074C6973743F0D00CD26042F +:1022B000FE592004FDCB37CEB7FDCB3776C0CD43DA +:1022C00024219A5C22765C21715C7EE6F277217F84 +:1022D0005CE5CD0B272A425C224C5CEBE1CD41272B +:1022E0002322745CE5D52A4E5C5E23567AB32878A7 +:1022F000E1E5B7ED523871060421444522945C2192 +:10230000464222965CFDCB376EE1280AE523CD15C7 +:1023100027E1300206017E23E5CDF8262A765CFE11 +:1023200020380EFE80300A362223772336222318E7 +:1023300006362323CD4627CD04272A4E5C23235E71 +:102340002356E1E513B7ED52280410B9180A2A4EB6 +:102350005C23232323224E5CE122425C2A765C2B01 +:10236000362022765CE11859D1E11ACDFB26EB7EAE +:102370002322425CFEFD2802FEDDCA9224FEEDCA45 +:10238000C924FECBCAE724214C2847CD2D257AE667 +:1023900003070707577BE6E0070707B2577BE61FEF +:1023A0005F7AB7200C7BB72818214D2BCD702518EC +:1023B00010CD6D257BB728092A765CCD0427CD6D1D +:1023C0002521715C7EE60CFE04200BCB962A4A5C2C +:1023D00022425CC38027CB6E2817CB6620162A4C7E +:1023E0005CCD1527300BE5218E5C364C23D1CD41D9 +:1023F00027CD4C242A425CED5B445CB7ED52DAB841 +:102400002221715CCB6E2816CB662812CBA62A3C03 +:102410005C22425C2A505C224E5CE1C3B8222A72E4 +:102420005C7CB5281B36FF2336FF23F707546578FD +:102430007420656E64203D202300CDC600CDB00021 +:10244000C3701BCD1104D0FE2028F5C92A765C3656 +:1024500000FDCB374E28143E07D7217F5C060FCDF9 +:102460008C24110600190617CD8C242A725C7CB5C9 +:10247000C8E52A7D5C23227D5CD1EB732372231196 +:102480008E5C0E00CD8F092322725CC97E23D7108B +:10249000FBC921715CCBD6CB6F2802CBC62A425C2C +:1024A000224A5C7EFECBEB201DE5FDCB37DEEB1137 +:1024B0003E5C12237E1313121B237E2322295C12FF +:1024C0001BED53425CE1C36A237EE521882A06386E +:1024D000BE280823232310F8C37F27E3CD2426E159 +:1024E00023118E23D5184E7EE5CB3FCB3FCB3F4704 +:1024F000CB3FCB3FCB3FB72803C6074721302BCD7F +:102500004625E17EFE403815E63FCB3FCB3FCB3F33 +:10251000E52A765CF6307723CD0427E17E2322423C +:102520005CCDF826E6073CCD6D25C3C12304052804 +:1025300004232310FC56235E7ACB3FCB3FFE3CD2D4 +:102540007F2747218F27D504052807CB7E2328FB2B +:1025500010F911945C7EFE802005E1E1C37B27CB5E +:102560007F200512132318EDCBBF12D1C9214C2AAD +:10257000D5ED5B765C3D472807CB7E2328FB10F921 +:1025800047E521715C4ECB51CA2C26FE062809FE78 +:102590000B2805FE13C22C26E17EFE28200512130F +:1025A0002323233E49121379E6010E58B112137EFC +:1025B000FEA92006CBBF12131864FE0320FA2A429C +:1025C0005CCD2426EB362BCB7F2804362DED44231F +:1025D000FE643807363123D664CBFEFE0A3009CBC1 +:1025E0007E2803363023180F06FF04D60A30FBC6B8 +:1025F0000ACBE0CBE87023F6307723362923E5FDBC +:10260000CB375E28182A295C22425C2A745C2B4E48 +:102610002B462B5E2B5670237123722373D1FDCB77 +:1026200037DE183A7E2322425CC3F826E17E4FCB88 +:10263000BFFE03380B2802121323CB7928EF181E94 +:10264000E5F53E231213F1B72A425C20177E2322C0 +:10265000425CEBF5CD4627F1EBCDF8261876ED532D +:10266000765CD1C93D2072D556235E2322425C7A26 +:10267000CDF8267BCDF826425358B721715CCB6E3E +:102680002840CB66626B282FD5CD152738262A2BFC +:102690005C19EB372A3C5CED5230192A445CED5250 +:1026A00038122A2B5CEBB7ED52EB2A485C7223738D +:1026B0002322485CD11818D5ED5B2B5C19D1CD15C0 +:1026C00027EBEBE32B3E4C38023E237723E3EBE191 +:1026D000CD4127EBE123C33A267ED5E5CDF826E1AF +:1026E0007E2322425C1600CB7F2801155F19ED5B2B +:1026F0002B5CB7ED52EB18822A745CF5CD4627228D +:10270000745CF1C9362C2322765CC9062B36202353 +:1027100010FB360DC9B7FDCB376EC8D5ED5B2B5C12 +:10272000ED52ED5B465CEBD5ED5B485CB7ED5219C5 +:10273000D1300B7ABE7B232001BE2320EA37EBD1B8 +:10274000C97ACD46277BF51F1F1F1FCD4F27F1E606 +:102750000FCDF1007723C9F70746697273743A20E9 +:1027600000CD5904E5F7074C6173743A2000CD5948 +:1027700004D1444DB7ED52D0C3911BFDCB379EE140 +:1027800021875C362A23061DCD0D27AFC387234C36 +:10279000C443414CCC4AD04AD25245D4505553C878 +:1027A000504FD043D0494EC34445C3414EC44FD28D +:1027B000584FD24144C45355C24144C35342C353FA +:1027C00059D3444A4EDA4C4449D2435049D24E453B +:1027D000C74350CC5343C64343C649CE4F55D4524A +:1027E0004341CC5253D44350C4435044D24350C9C4 +:1027F0004441C14E4FD04252CB44C945C948414CD7 +:10280000D449CD524CC1524C43C1524CC45252C116 +:10281000525243C15252C4524554C9524554CE45F6 +:10282000D84558D8494EC4494E44D2494EC9494E5C +:1028300049D24C44C44C4444D24C44C94F5444D271 +:102840004F5449D24F5554C44F5554C9840001D2F6 +:1028500002E821C0202024200031A000BC08358ED1 +:10286000011725C0204024400051AC004A0001B2AD +:1028700002C821A02060246000719C000E00358DEC +:10288000011625A0208024800091A8000D500192FF +:10289000026C218020A024A000B180000D30358C76 +:1028A0000193258020C024C000D158000D7002B2D1 +:1028B000026822A020E024E000F15C000C50359575 +:1028C000011326A021002500011160000021002233 +:1028D0000023002400250026002700280041004294 +:1028E0000043004400450046004700480061006284 +:1028F0000063006400650066006700680081008274 +:1029000000830084008500860087008800A100A263 +:1029100000A300A400A500A600A700A800C100C253 +:1029200000C300C400C500C600C700C800E100E243 +:1029300000E300E400E500E6940000E80101010284 +:1029400001030104010501060107010835013502F3 +:102950003503350435053506350735083D013D029B +:102960003D033D043D053D063D073D083820384008 +:102970003860388038A038C038E039004101410261 +:1029800041034104410541064107410828202840F0 +:102990002860288028A028C028E029003020304066 +:1029A0003060308030A030C030E031002C202C402E +:1029B0002C602C802CA02CC02CE02D001C201C4056 +:1029C0001C601C801CA01CC01CE01D00114019C014 +:1029D00009520A40055215C035117001112010002E +:1029E0000932F000053206403D117002116019A055 +:1029F00009726809057215A03A2070031040C000E2 +:102A00000852640A0452F0004111700413601980E6 +:102A10000B72BF0C077215802A20700513400A80C4 +:102A20000B52BDAC0752F0003220700B132019E09E +:102A30000B328C00073215E02E20700C138002AC94 +:102A40000B9290000792F0001E20700DC2C3C4C507 +:102A5000C8CC28484C03A9C1DA4EDA4EC348CC444E +:102A6000C542C341C68280812801A928484CA95388 +:102A7000D0284445A9284243A9285350A9D050C57D +:102A800050CFCDC9D22843A940643F416BE14241B8 +:102A90008E43026E44540045B8004698014703A88F +:102AA00048645F496BE24A3D8E4B01D34DB4004F01 +:102AB00003C850647F516BE352418D53026D5698A9 +:102AC0000657011D58649F596BE45A3D8D5B01B355 +:102AD0005E98075F011E6064BF616BE562418C67B1 +:102AE000B0006864DF696BE66A3D8C6FA4007241D8 +:102AF0009573027578651F796BE87A3D957B02B313 +:102B0000A0DC00A17C00A2CC00A3EC00A8D400A90A +:102B10007400AAC400ABE800B04C00B15000B2D0C1 +:102B200000B3E400B8D800B97800BAC800BBE00030 +:102B3000524CC35252C352CC52D2534CC15352C1C5 +:102B4000805352CC4249D45245D35345D4B0B823D4 +:102B500031B02331B82332B0B1B241462C4146A73F +:102B60002800292CC1412C2800A92332B82333B0D6 +:102B70002333B8410842084308440845084608473B +:102B800008480849084A084B084D084E08500851A3 +:102B900008520853085508580859085A080C0200EA +:102BA0000000002E20010000DE20030000000000D5 +:102BB00000A31B030000FFFF0E00F92101000062CB +:102BC00020030000FFFF0E00D21B0300000000FFE7 +:102BD000003B21006521030040005800007A1C02E0 +:102BE00000000000A81C03000000000700252E01C3 +:102BF0000000981E0032220300000000FF004F2159 +:102C000000350700951D008F1E0300000000000026 +:102C10003721030000000000008C1C01FD5FF02143 +:102C200002004000587F1CFDCB00C6F70F06417222 +:102C30006520796F752073757265203F00CD26047D +:102C4000FE59C23507F70D0D0D4E45572D52414D1A +:102C5000544F503A2000CD59043E5CBC382A200520 +:102C60003ED0BD3823F70D0D44656661756C742048 +:102C700023464635382077696C6C20626520757371 +:102C80006564202E002158FFF70D0D0D06544841B4 +:102C90004E4B20594F55202C2043414C4C2041474E +:102CA00041494E00E5CD2604D1FE6ECA3507F3D565 +:102CB000D901FFFF114000E123D921CC1106FF3ECD +:102CC00080ED4FAFD3FEED4FE9CD7630CDB02DFE88 +:102CD0000D20F6CDDE2CFDCB004EC2F630C92A15F4 +:102CE0005C7DD6206F300E7CD60867FE3820062625 +:102CF000407DE61F6F7DE6E06F11AA5C0E0B0604B7 +:102D0000CD5B2D20083E20121310FC180ACD222D79 +:102D10001213CD842D10F60D20E4AF32D45C11AA2D +:102D20005CC9D5C5E521003D0660CD3D2D200A3E9C +:102D300007B56F232310F33E20E1C1D1C9C511951A +:102D40005C06061AE6FCBE200F233E03835F3001BB +:102D50001410F0C13E8090C9C1AFC9C5D5E511922C +:102D60005C0E080603E57E12231310FAE1240D2001 +:102D7000F221925C0618AFB62310FCE11103001992 +:102D8000D1C1B7C9C5E521A95C0E06E50618CB1669 +:102D90002B10FBE10D20F4E1C1C9010017E5ED4363 +:102DA000175CCD1C30E1C9FDCB004E2803CD0331AB +:102DB000E5D5C5F5D9D5D9CD152FCD1C30D9D1D96B +:102DC000F1C1D1E1C9FE08D8FE0C3FD8E5CD4030B5 +:102DD000210C0022115C0150A0CDF030CD4030E13B +:102DE000B7C921F52D0606BE38062310FA0601C91B +:102DF00096ED4447C9060D13191D24210000221722 +:102E00005C264011014001001822155C3600EDB02F +:102E10002100581101583A395C77010003EDB03AAE +:102E2000385CD3FEC93A305CE60732385C3A325C33 +:102E3000E607070707473A345CE607B032395C1803 +:102E4000CF21AA5C19545D230B78B12802EDB03E66 +:102E50002012C911D35C21D25C0B78B128F1EDB8F6 +:102E600018ED2A155CF5CDF52CF1212A00ED5B1744 +:102E70005CD51600ED52444DFE04CC412EFE05CC2F +:102E8000532EAF32175CCD1C3021AA5CCDB900E1C6 +:102E900022175CC921175CFE0428C7FE0528C3FE63 +:102EA0000FCAFB2DFE06200B7E5FCDE22D7B80320C +:102EB000175CC9FE07200C36002A155C7DE6E06F22 +:102EC000C3452FFE0C201CCDD22ECD1C303E20CD74 +:102ED000A72D21175C7EA720083A185CA7C83629C1 +:102EE0002335C9CDC52D3812FE0828E6FE09283144 +:102EF000FE0A283823AFBEC835C9FE0D282CC9FEEE +:102F0000C6C0F7204C5052494E542000FDCB00CE95 +:102F10003E0DC30331FE20DA942EFE8030E1CD9BBE +:102F20002F21175C7E3C77FE2AC0360023343E18E2 +:102F3000BEC0352100400608E5C5CD632FC1E124A0 +:102F400010F621E050E50608CD542F2410FAE17D5B +:102F5000E6E06FC9C5545DE513011F003600EDB012 +:102F6000E1C1C9545D7DC6206F01E000EDB0D5110F +:102F7000000719D1012000EDB0545D7BD6205F0120 +:102F8000E000EDB0D511000719D1012000EDB054DB +:102F90005D7BD6205F01E000EDB0C96F26002929D6 +:102FA0002911003C19EB2A155C06083A175CE60368 +:102FB00028163D281F233D283C231A131F1F4F7E30 +:102FC000E6C0B1772410F3C91A134F7EE603B17738 +:102FD0002410F5C9D5D9D1D91600D91A13D917CBD0 +:102FE0001217CB125F7EE6FCB277237EE60FB37733 +:102FF0002B2410E4C9D5D9D1D91600D91A13D91761 +:10300000CB1217CB1217CB1217CB125F7EE6F0B2A2 +:1030100077237EE63FB3772B2410DEC9F53A175CA1 +:10302000E63C6F8585CB3FCB3F6F3A185CF50F0FC1 +:103030000FE6E0856FF1E618F6406722155CF1C9EE +:103040002A155CE5D5C5F50EFC3A175CE6031100C0 +:10305000000606280BCB19CB1ACB1B10F83D18F134 +:103060007CC607677EA977237EAA77237EAB77F19C +:10307000C10600D1E1C9FBE5C5AF32135C3A105C73 +:1030800032145C3A145C3D32145CC29E30CD403048 +:103090003A135CEE0132135C3A105C32145CCDEDF5 +:1030A000303A055CB72006AF320B5C182C3A0B5C4B +:1030B000473A085CB8280B320B5C2A0C5C22115C86 +:1030C00018172A115C2B22115C7CB52803AF180954 +:1030D0002A0E5C22115C3A0B5CB728A7F53A135C08 +:1030E000B72803CD4030F1CD3304C1E1C90103ABB2 +:1030F00010FE0D20FBC9D506201ACD03311310F99F +:10310000D13E0DCD1131FE0DC03E0ACD11313E0D27 +:10311000C9F3E5D5C5F51601E67F072F5F060ACB93 +:103120001ACB1B1FD3FE2A365C2B7CB520FB10EF7D +:10313000F1C1D1E1FBC92156311117400E07D50667 +:1031400008C5D5010500EDB0D114C110F4D10DC8EA +:103150003E20835F18E8000000000000E03FC0E070 +:10316000009FC03F20008000002000400000400081 +:103170003C007C800042018280004102018000808E +:103180008400800080880080009C93808000A2944E +:10319000408000BA97408000BAF74080009CF380DE +:1031A000800080F0008000C168008000A24600809E +:1031B000009C01F0800080001F80018000604002C0 +:1031C00080008040048001004005000100200500CF +:1031D000010020090002201009000240100900022D +:1031E00040100480014008048001400804800188E8 +:1031F00008028000900802400090100240009010E9 +:103200000140009210012000A410012000A4200021 +:10321000A000A420005000644000300028400010AE +:1032200000488000080048800008002900000703CB +:103230009100000A85510000158ACA0000154AA6AF +:10324000007FFFFFFFFF40000000015F1DF1C63D52 +:1032500048888A24414888F2203948888220055FBE +:103260001DC1C3F940000000017FFFFFFFFF000008 +:10327000000000B4FD213A5CF70F060642415349B5 +:1032800043202D204445434F4445520D0D424153A8 +:1032900049432D53544152543A2000CD5904EB3048 +:1032A0000FCD530018CECDB000062A3E5FD710FDDB +:1032B000CDB000EBCDC600EBF7064C494E452320C0 +:1032C0003D2000CDC033F70D064C656E6774683A3B +:1032D0002000CDC100CDB00013D5CDF303E1FE51E8 +:1032E000C8CDC600CDAC00EB1ACDD0003E06D71A33 +:1032F00013FE20304FFE06380CFE183008FE0E2854 +:1033000004FE0F200EF7494E56414C494421210D31 +:103310000018C6F53E5BD7F1F5D60521CC33CDB804 +:1033200033F1FE0DCAA632FE103814FE16CDAC00E5 +:1033300038081A13CDD000CDAC001A13CDD0003E02 +:103340005DD7180AFE803053D7CD80003005CDB050 +:103350000018861A13CD80003803D718F6FE2E28E1 +:10336000F9FE0E20E9CDAC00F72820001A13471A09 +:1033700013B02813F7666C6F6174696E67706F69BC +:103380006E74200013180DCDC100CD30003D2060BB +:1033900000CDC63313133E29D718B3FEA5300CF762 +:1033A00047726170686963730018A3D6A42146341C +:1033B000CDB833DA0533189647CDD701D8C3B90055 +:1033C0001A67131A6F13D5CDF900D1C95052494E5F +:1033D0005420434F4D4D41004544495400435552FC +:1033E000534F52204C45465400435552534F5220A0 +:1033F000524947485400435552534F5220444F5767 +:103400004E00435552534F522055500044454C45B1 +:10341000544500454E544552000000494E4B005063 +:103420004150455200464C4153480042524947489A +:103430005400494E5645525345004F56455200419F +:10344000540054414200524E4400494E4B455924C9 +:1034500000504900464E00504F494E5400534352CD +:1034600045454E24004154545200415400544142B9 +:103470000056414C2400434F44450056414C004CFB +:10348000454E0053494E00434F530054414E0041B6 +:10349000534E004143530041544E004C4E0045589A +:1034A0005000494E54005351520053474E00414280 +:1034B00053005045454B00494E005553520053545C +:1034C00052240043485224004E4F540042494E00BB +:1034D0004F5200414E44003C3D003E3D003C3E000A +:1034E0004C494E45005448454E00544F00535445F6 +:1034F000500044454620464E0043415400464F523A +:103500004D4154004D4F5645004552415345004FE3 +:1035100050454E202300434C4F53452023004D453A +:1035200052474500564552494659004245455000CC +:10353000434952434C4500494E4B0050415045527F +:1035400000464C4153480042524947485400494EB6 +:103550005645525345004F564552004F5554004C66 +:103560005052494E54004C4C4953540053544F5000 +:103570000052454144004441544100524553544F88 +:103580005245004E455700424F5244455200434F6A +:103590004E54494E55450044494D0052454D004654 +:1035A0004F5200474F20544F00474F205355420081 +:1035B000494E505554004C4F4144004C495354001F +:1035C0004C4554005041555345004E455854005009 +:1035D0004F4B45005052494E5400504C4F540052EE +:1035E000554E00534156450052414E444F4D495AA5 +:1035F0004500494600434C53004452415700434C58 +:103600004541520052455455524E00434F505900C7 +:1036100031FE5BFD213A5CFD360004CDFB2DAF325F +:10362000505C210068CD213C210157CD213CCD6467 +:103630003ACD453A2129A3224E5CCD983A21D65C59 +:1036400022445C0129A3AFCD323CCDD23B2120588E +:10365000223C5CCDBD3BCDEE3B21105B22485C2182 +:10366000000122545CAF32505C3D32515CCDF83BDE +:10367000CD123C010054204E616D65064C656E67AD +:10368000746820416464722E20427974657320202E +:103690004572726F7220564500DD2A445CDDE5CD2F +:1036A000983A11FFFFCD8F3B7CB7C4743721FFFFE1 +:1036B000ED52CC7437EB2A485C7323722322485CAA +:1036C0002A4E5CED52224E5CD5D9E1D11A19DA8D21 +:1036D0003722445CD5D9E1B7205D32515CCD6B3BDC +:1036E000205BEB21505C3E13BECAB33734CD373B71 +:1036F000ED4B545CCD9D2DEB237EFE04300CE5217B +:103700007D3C16005F197EE11802F630D7CDAC0083 +:1037100023060A7ECD6D04D72310F8CDAC00CD73FF +:103720003B5E235623ED533E5CCD733B2A445C1332 +:1037300013193859C399363A515CB72808CD373B2D +:10374000FD3416180CD51B1B2A3E5CED52D1C474F7 +:1037500037FD461B0E1ACD9D2D1B1BED534A5C21D8 +:103760004A5CCD733B3EFF32515C3A505CFE1328FD +:1037700042C39936CDA63BFD461B0E233A515CB79A +:10378000280104CD9D2D3E2AD7CDAD3BC9CD743740 +:10379000CD123C0017456E64206F662052414D00EB +:1037A0001811F5AFD3FE3E7FDBFE1FFB3002F1C9DF +:1037B000F1F1F1CD3E3B3A505CB72021CD0938CD37 +:1037C000B53BFE4ECA3436FE4DCA3B3CFE51CA35AF +:1037D00007FE42CC643AFE4BCC423A18E2CD0A3B9B +:1037E000FDCB00B6CD123C002420202020003A5012 +:1037F0005C21525CBE28E6CD2A3BFDCB0076281624 +:10380000FB06207610FDC3D739CDE63BF74E657732 +:103810002F4D617800C9CD0938F72F4175746F2F8E +:10382000436F70792F536B69702F4C6F61642F5603 +:1038300065726966792F52656E2F44656C00CDB54F +:103840003BFE4ECA3436FE41CAC939FE43CAD73997 +:10385000FE532828FE4CCA5D39FE56CA7039FE5206 +:103860002826FE442863FE4DCA3B3CFE51CA35075C +:10387000FE42CC643AFE4BCC423A18C2CDDD3BCD81 +:10388000493BFD3418C3EE37FD46190E02CD9D2D80 +:103890002A425C7EB720A72323060AC5E5CD7630F1 +:1038A000E1C1FE0D2814FE09280CFE08280FFE0CAD +:1038B000280B77CD6D04D72310E1C33E383E0AB8FC +:1038C00028D92B043E08D718D22A465CE52A425C48 +:1038D000E5CD493BD1ED4B425CC52A445CAFED429E +:1038E000444DED53425CE1B0B12802EDB0EB36003F +:1038F00022445C21FFFFED52224E5CCD983AD1ED7F +:103900004B465CC52A485CAFED42444DED53465CE6 +:10391000E1B0B12802EDB0ED53485CFD66192E0010 +:103920003A555C3C22175C9447C5ED4B175C04CDBF +:103930009D2D2A155CCDF52CED4B175C05CD9D2DED +:1039400021AA5CCDB900C110E0CDB5003A525C218E +:10395000505C35BEC23E38CDDD3BC3B637CDDD3B16 +:10396000CDF83B3A505C3C672E0022545CC399363C +:10397000CDF83B3EFF32515C2A425CE52A465CE5CD +:10398000CD8E39E122465CE122425CC31638DD2A45 +:10399000425CDD7E00F5DD232A465C5E23561B1B60 +:1039A000B7CD943B3E7638023E2AFD46190E28CD0F +:1039B0009D2DD7AFD3FEF1B7C021515CB63600C8FC +:1039C000ED5B425CCD523B18C5FDCB00F6CD123C01 +:1039D00000244155544F00DD2A425C2A465C5E2398 +:1039E000562322465CD51B1BDD7E0032515CDD2355 +:1039F000CD9F3BDD2A425CD1DD19DD22425C3A518C +:103A00005CCD6B3B20302A425C7EB72829DD2A4200 +:103A10005C2A465C5E23562322465CD51B1BDD7E5A +:103A200000DD2306087610FDCD9F3BDD2A425CD1E8 +:103A3000DD19DD22425C3A4A5C6F2638CD213CC359 +:103A40008238CD8F1ECD123C000B4B2D6265657008 +:103A50003A00FDCB00562806F74F4E2000C9F74F1D +:103A6000464600C9CD123C0000426173653A00FD34 +:103A70007E00EE01FD7700E6012807F74845580073 +:103A80001805F744454300CD983A3A505CB7C8CD85 +:103A9000B03ACD0A3BC32A3BCD123C0017467265B3 +:103AA000653A00214E5CCD733BED4B545CC39D2DBC +:103AB000060221D65CDD21105BAFF57EB72025E53F +:103AC000110C00190E0DCD9D2DCD733B2323CD730D +:103AD0003BE1DD5E00DD23DD5600DD23197EB7EB23 +:103AE000281EEB37DD5E00DD23DD5600DD2319EBFC +:103AF0002B2B224C5C214C5C0E1ACD9D2DCD733BA3 +:103B0000F13CFDBE16D004EB18B0AF32525C2F3240 +:103B1000515C3E0132535C324A5CCDD23B21D65CD3 +:103B200022425C21105B22465CC9FD3419214A5CAB +:103B3000346E2687C3213C21555C342B36002A3C49 +:103B40005C01200009223C5CC92A425C7EB720014E +:103B500037EBF52A465C4E234623EB0922425CED07 +:103B600053465CF13FD87EB720E7C9B7C0B2C0B3B7 +:103B7000FE13C9E5D5C57E23666FFDCB0046280838 +:103B8000CDAC00CDC6001803CDFE00C1D1E1C921E6 +:103B9000A237E537140815F33E0FD3FEC3620521A3 +:103BA000A237E5C3C604E3C5D5DDE5F5E9E1F1DDFE +:103BB000E1D1C1E3C9D5C5CD2604C1D1C9CDA63B4C +:103BC000010002CD9D2D0615F7070D0010FACDADB1 +:103BD0003BC92140580160013E07C3323C3A4A5C70 +:103BE0006F2607C3213CCD123C15000700C92110E8 +:103BF0005B013200AFC3323CCDE63BF706456E7445 +:103C0000657220425245414B20746F2053544F50EF +:103C100000C9E3F546234E23CD9D2DCDB900F1E338 +:103C2000C97C2658CB250604CB2530012410F90188 +:103C30001F00D5545D1377EDB0D1C931FFFFCDFB27 +:103C40002DDD21004011FFFFCD933B7CB7200821E3 +:103C5000FFFFED52E52003CD5C00CD8E027BFE0F11 +:103C60002809FE0828D5FE3520F0C7DD210040DDFB +:103C70007E00DD23D1D51B1BCDC60418DD504E536D +:103C8000430023D1D51B1BCDC60418DB504E534334 +:103C90004445520000000005C020EA0400005359CA +:103CA0004E43310000000005C020F20400005359CB +:103CB0004E4332CC58000005C020070500004C30B0 +:103CC000353037325F000006C020FE040000425944 +:103CD000544541550000000005C0200E0500004C71 +:103CE000303530450000000005C020050500004CBF +:103CF000303530350000000005C020250500005398 +:103D00000000000000000000002020202000200013 +:103D100000285000000000000050F85050F85000FB +:103D20002078A07028A8702008C8D020409898005B +:103D30000020502058906800001020000000000073 +:103D400000102020202010000040202020204000D3 +:103D5000005020F820500000002020F82020000013 +:103D60000000000000204000000000F800000000FB +:103D70000000000000004000000808102040808083 +:103D800000708898A8C87000002060202020700073 +:103D9000007088087080F800007088300888700013 +:103DA0000010305090F8100000F880F00888700083 +:103DB000007080F08888700000F8081020404000F3 +:103DC000007088708888700000708888780870009B +:103DD0000000200000200000000020000020400023 +:103DE00000204080402000000000F800F8000000A3 +:103DF0000020100810200000007088102000200013 +:103E0000007098A8B880780000205088F888880052 +:103E100000F088F08888F00000708880808870004A +:103E200000E090888890E00000F880F08080F80042 +:103E300000F880F08080800000708880B888700072 +:103E4000008888F888888800007020202020700072 +:103E500000080808088870000090A0C0A0908800A2 +:103E6000008080808080F8000088D8A8888888003A +:103E70000088C8A8A8988800007088888888700082 +:103E800000F08888F080800000708888A89870080A +:103E900000F08888F09088000070807008887000BA +:103EA00000F8202020202000008888888888700062 +:103EB0000088888888502000008888A8A8D88800B2 +:103EC0000088502020508800008888502020200042 +:103ED00000F810204080F800003020202020300022 +:103EE0000080804020100808006020202020600012 +:103EF000002070A82020200000000000000000FC2E +:103F000000609080E080F000000070087888780001 +:103F1000008080F08888F000000070888088700041 +:103F2000000808788888780000007088F0807800A1 +:103F30000030406040404000000078888878087079 +:103F4000008080F0888888000020006020207000B9 +:103F50000010001010101060008080A0C0A0900021 +:103F60000040404040403000000050A8A8A8A800F1 +:103F70000000F088888888000000708888887000B9 +:103F80000000F08888F08080000070888878080C35 +:103F90000000304840404000000070807008F00091 +:103FA0000020702020281000000088888888700079 +:103FB00000008888885020000000A8A8A8A8500009 +:103FC0000000885020508800000088888878087099 +:103FD0000000F8102040F800003020402020300081 +:103FE0000808080808080808006020102020600061 +:103FF00000000040A81000007884B4A4A4B4847821 +:00000001FF diff --git a/Cobra_MiST/rtl/roms/UNKN.BIN b/Cobra_MiST/rtl/roms/UNKN.BIN new file mode 100644 index 00000000..deb4cb3d Binary files /dev/null and b/Cobra_MiST/rtl/roms/UNKN.BIN differ diff --git a/Cobra_MiST/rtl/roms/boot64k_v1.bin b/Cobra_MiST/rtl/roms/boot64k_v1.bin new file mode 100644 index 00000000..b03d0bd3 Binary files /dev/null and b/Cobra_MiST/rtl/roms/boot64k_v1.bin differ diff --git a/Cobra_MiST/rtl/roms/boot64k_v2.bin b/Cobra_MiST/rtl/roms/boot64k_v2.bin new file mode 100644 index 00000000..a74b5883 Binary files /dev/null and b/Cobra_MiST/rtl/roms/boot64k_v2.bin differ diff --git a/Cobra_MiST/rtl/roms/bsrom118.rom b/Cobra_MiST/rtl/roms/bsrom118.rom new file mode 100644 index 00000000..4a7614d1 Binary files /dev/null and b/Cobra_MiST/rtl/roms/bsrom118.rom differ diff --git a/Cobra_MiST/rtl/roms/bsrom140.rom b/Cobra_MiST/rtl/roms/bsrom140.rom new file mode 100644 index 00000000..1a686996 Binary files /dev/null and b/Cobra_MiST/rtl/roms/bsrom140.rom differ diff --git a/Cobra_MiST/rtl/roms/charrom.vhd b/Cobra_MiST/rtl/roms/charrom.vhd new file mode 100644 index 00000000..42f468cf --- /dev/null +++ b/Cobra_MiST/rtl/roms/charrom.vhd @@ -0,0 +1,101 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.ALL; +--use IEEE.STD_LOGIC_ARITH.All; +--use ieee.std_logic_unsigned.all; + +entity CharTable_ROM is + Port ( ADDR : in STD_LOGIC_VECTOR (8 downto 0); + DATA_OUT : out STD_LOGIC_VECTOR (7 downto 0)); +end CharTable_ROM; + +architecture Behavioral of CharTable_ROM is + + type ROM_TYPE is array (0 to 511) + of std_logic_vector(7 downto 0); + + constant ROM : ROM_TYPE := + ( +-- addr=0x0000 +X"00",X"0e",X"11",X"01",X"0d",X"15",X"15",X"0e", +X"00",X"04",X"0a",X"11",X"11",X"1f",X"11",X"11", +X"00",X"1e",X"09",X"09",X"0e",X"09",X"09",X"1e", +X"00",X"0e",X"11",X"10",X"10",X"10",X"11",X"0e", +X"00",X"1e",X"09",X"09",X"09",X"09",X"09",X"1e", +X"00",X"1f",X"10",X"10",X"1c",X"10",X"10",X"1f", +X"00",X"1f",X"10",X"10",X"1c",X"10",X"10",X"10", +X"00",X"0f",X"10",X"10",X"13",X"11",X"11",X"0f", +-- addr=0x0040 +X"00",X"11",X"11",X"11",X"1f",X"11",X"11",X"11", +X"00",X"0e",X"04",X"04",X"04",X"04",X"04",X"0e", +X"00",X"01",X"01",X"01",X"01",X"01",X"11",X"0e", +X"00",X"11",X"12",X"14",X"18",X"14",X"12",X"11", +X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"1f", +X"00",X"11",X"1b",X"15",X"15",X"11",X"11",X"11", +X"00",X"11",X"19",X"15",X"13",X"11",X"11",X"11", +X"00",X"1f",X"11",X"11",X"11",X"11",X"11",X"1f", +-- addr=0x0080 +X"00",X"1e",X"11",X"11",X"1e",X"10",X"10",X"10", +X"00",X"0e",X"11",X"11",X"11",X"15",X"12",X"0d", +X"00",X"1e",X"11",X"11",X"1e",X"14",X"12",X"11", +X"00",X"0e",X"11",X"08",X"04",X"02",X"11",X"0e", +X"00",X"1f",X"04",X"04",X"04",X"04",X"04",X"04", +X"00",X"11",X"11",X"11",X"11",X"11",X"11",X"0e", +X"00",X"11",X"11",X"11",X"0a",X"0a",X"04",X"04", +X"00",X"11",X"11",X"11",X"11",X"15",X"1b",X"11", +-- addr=0x00c0 +X"00",X"11",X"11",X"0a",X"04",X"0a",X"11",X"11", +X"00",X"11",X"11",X"0a",X"04",X"04",X"04",X"04", +X"00",X"1f",X"01",X"02",X"04",X"08",X"10",X"1f", +X"00",X"0e",X"08",X"08",X"08",X"08",X"08",X"0e", +X"00",X"10",X"10",X"08",X"04",X"02",X"01",X"01", +X"00",X"0e",X"02",X"02",X"02",X"02",X"02",X"0e", +X"00",X"04",X"0e",X"15",X"04",X"04",X"04",X"04", +X"00",X"00",X"04",X"08",X"1f",X"08",X"04",X"00", +-- addr=0x0100 +X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", +X"00",X"04",X"04",X"04",X"04",X"04",X"00",X"04", +X"00",X"0a",X"0a",X"0a",X"00",X"00",X"00",X"00", +X"00",X"0a",X"0a",X"1b",X"00",X"1b",X"0a",X"0a", +X"00",X"04",X"0f",X"10",X"0e",X"01",X"1e",X"04", +X"00",X"19",X"19",X"02",X"04",X"08",X"13",X"13", +X"00",X"08",X"14",X"14",X"08",X"15",X"12",X"0d", +X"00",X"0c",X"0c",X"0c",X"00",X"00",X"00",X"00", +-- addr=0x0140 +X"00",X"02",X"04",X"08",X"08",X"08",X"04",X"02", +X"00",X"08",X"04",X"02",X"02",X"02",X"04",X"08", +X"00",X"15",X"0e",X"1f",X"0e",X"15",X"00",X"00", +X"00",X"00",X"04",X"04",X"1f",X"04",X"04",X"00", +X"00",X"00",X"00",X"00",X"0c",X"0c",X"04",X"08", +X"00",X"00",X"00",X"00",X"1f",X"00",X"00",X"00", +X"00",X"00",X"00",X"00",X"00",X"00",X"0c",X"0c", +X"00",X"01",X"01",X"02",X"04",X"08",X"10",X"10", +-- addr=0x0180 +X"00",X"0c",X"12",X"12",X"12",X"12",X"12",X"0c", +X"00",X"04",X"0c",X"04",X"04",X"04",X"04",X"0e", +X"00",X"0e",X"11",X"01",X"0e",X"10",X"10",X"1f", +X"00",X"0e",X"11",X"01",X"06",X"01",X"11",X"0e", +X"00",X"02",X"06",X"0a",X"12",X"1f",X"02",X"02", +X"00",X"1f",X"10",X"1e",X"01",X"01",X"11",X"0e", +X"00",X"06",X"08",X"10",X"1e",X"11",X"11",X"0e", +X"00",X"1f",X"01",X"02",X"04",X"08",X"10",X"10", +-- addr=0x01c0 +X"00",X"0e",X"11",X"11",X"0e",X"11",X"11",X"0e", +X"00",X"0e",X"11",X"11",X"0f",X"01",X"02",X"0c", +X"00",X"00",X"0c",X"0c",X"00",X"0c",X"0c",X"00", +X"00",X"0c",X"0c",X"00",X"0c",X"0c",X"04",X"08", +X"00",X"02",X"04",X"08",X"10",X"08",X"04",X"02", +X"00",X"00",X"00",X"1f",X"00",X"1f",X"00",X"00", +X"00",X"08",X"04",X"02",X"01",X"02",X"04",X"08", +X"00",X"0c",X"12",X"02",X"04",X"04",X"00",X"04" + +-- 512 bytes +-- file: MCY7304NAA.bin + ); + +begin + + DATA_OUT <= ROM(to_integer(unsigned(ADDR))); + +end Behavioral; + diff --git a/Cobra_MiST/rtl/roms/cobra.bin b/Cobra_MiST/rtl/roms/cobra.bin new file mode 100644 index 00000000..8684217a Binary files /dev/null and b/Cobra_MiST/rtl/roms/cobra.bin differ diff --git a/Cobra_MiST/rtl/roms/cobra.hex b/Cobra_MiST/rtl/roms/cobra.hex new file mode 100644 index 00000000..cc4e7541 --- /dev/null +++ b/Cobra_MiST/rtl/roms/cobra.hex @@ -0,0 +1,129 @@ +:10000000C303C0D31F31F0BFCDF7C6CDD7C5D31BB7 +:100010002246BF21000018052246BFE12BED7348A0 +:10002000BF3146BFE3E5D5C5F5ED57F3470E0DE209 +:1000300033C00CC5D9081803000000E5D5C5F5DDAF +:10004000E5FDE5214ABF0E02460578B9301B235E67 +:100050002356231AFEDF20F17EE52A46BFED52E14A +:100060001220E60D18E30000002E4A70CD2EC221AA +:10007000EAC10DCC3BC12176C0E52ED3C5E5218474 +:10008000C0CDACC40620434F425241E1C13E3ACDFF +:1000900092C43E0DCD8FC4C8BE235E235623462393 +:1000A000281730F4E521B2C0CD6BC3E1312EBFC3B8 +:1000B0002BC2204552524F52003E3ACD92C40528E1 +:1000C0000E0E00CD5EC2E503280410F718D605EB2E +:1000D000E9E1E943E7C202449EC2034600C0024789 +:1000E00008C3044800C0024B23C1024C77C3024D31 +:1000F0000BC1014F42C2035300C40455D1C007587D +:1001000033C1015936C1015A33C204CD5EC2C8EBB6 +:100110000608C5CD6DC1C1C81310F7EB08CD18C2D4 +:100120000818ECE130032A48BF2B36C02B361022CA +:1001300048BFC92EEA012EFFCD8FC4F53AFDBF4F4F +:10014000F1477E280F0E2DB8280D23237EE67F2051 +:10015000F6C3A4C0CD92C44623CD25C216BF5E23EC +:10016000E5CD74C1E1C87EA720EAC32EC2012D00EF +:10017000FE2C2812131A1BCB78C4D5C1CD97C17998 +:10018000CD92C4EE2DC0CD5EC2D8F57D1213CB78D2 +:1001900028027C12F11BC978FE461A2038D921B3F7 +:1001A000C106084FCB013E2E30017ECD92C42310F4 +:1001B000F3D9C9535A584858504E430E025F06119E +:1001C000AF8F27ED6A10FA0D20F3677D6BCDDCC190 +:1001D0007CCDD5C17DCDD8C107070707F5E60FC691 +:1001E0009027CE4027CD92C4F1C9463E413F4241BF +:1001F00043404443454248454C44D348D0460046DA +:100200003441354237433644394538483B4C3AD877 +:1002100032D930493D4D3C00CD2EC2CDD0C13E201B +:10022000180ECD92C43E3D18073E0ACD92C43E0D35 +:10023000C392C4C2A4C0C1D1E17B957A9CD871237A +:1002400018F720EFD1E1E5193E53CD22C2CD1BC2F4 +:10025000E1AFED523E44CD22C2CDD0C118D02A46E6 +:10026000BFCD8FC4CD8CC23805CD7FC237C9210028 +:100270000029292929B56FCD8FC4CD8CC238F2FE53 +:100280000DC8FE2C2804FE2020A9A7C9D630FE0ADE +:10029000D8D611FE063003D6F6C9C641A7C92093A9 +:1002A000D1E1CD18C2F53AFFBF47F1CD1EC27ECDD8 +:1002B000D5C1237B957A9CDA29C210EFF5CDCCC24B +:1002C000F118DF0A0D20425245414B003EFEDBFF94 +:1002D0001FD83EBFDBFF1FD8E521C3C2CD6BC3E1F2 +:1002E000F131F0BFC310C0CD25C2E1CB7C2813E5AE +:1002F000EBAF6F653E2DED52CD92C4CDBBC1CD1E8F +:10030000C2E1CDBBC1C32EC2214ABF71350D23D17D +:10031000280B732372231A773EDF1218F0ED534631 +:10032000BFE1FDE1DDE1F1C1D1E108D9F1ED472106 +:10033000F3C338022EFBF1C1D1E3ED7B48BFC344C8 +:10034000BFE5CD68C3E131F0BFC310C020535441B5 +:10035000525420544150452E2E002053544F5020CB +:100360005441504520212100215AC37EFE00280619 +:10037000CD17C52318F5C9F5214CC3CD6BC3F1E1E9 +:1003800030026068F5E511EDB0D1D31BCDB8C4F5EE +:10039000CDCCC2F1CDDBC4FE03CA41C3EE3A20F49A +:1003A000215CBF47A73FF5CDDBC477F1373F041091 +:1003B000087EE63F4FC60547AF862310E7C2E4C379 +:1003C0002A5DBF7D6C6719D51160BF79A7EB18B79F +:1003D00020534156452E2E00205441504520455271 +:1003E000524F5200E521D8C3CD6BC3E131F0BFC3FA +:1003F00010C03E03CDC2C4E5CD68C3E1CD2EC2C955 +:10040000F5E521D0C3CD6BC32160032BAFCDC2C4B2 +:100410007CB520F7E1F128050DCAA4C0D5C108E1DB +:10042000D1AFED52D823C5F5CDCCC2F1012000EDFE +:10043000423003094D68E5215CBF712372237323A9 +:10044000702303EBEDB0EB1BCD59C4E17DB420D795 +:10045000D13C08C2F2C3D518DB215CBFCD83C401F7 +:100460003AD31BCDB8C47EC60547AF1001770496BA +:10047000A73FF5AF7ECDC2C4F12310EFCD83C402F8 +:100480000D0AC9E346237ECDC2C410F923E3C9CDCA +:100490007CC637CD99C4FE0DC0F5C5060138043EB3 +:1004A0000A0602CD17C5AF10FAC1F1C9E346237E93 +:1004B000CD17C510F923E3C9F53A1FF82F321FF8FD +:1004C000F1C9C3F1BFC5F50E0BB73802D31F0667DC +:1004D00010FE37CB1F0D20F2F1C1C9C3F4BFC5D543 +:1004E000DBFFCB17CB1738F8063410FEDBFFCB173A +:1004F000CB1738EC0E8059066710FEDBFFCB17CB0D +:1005000017CB1930F2CB133005510E0118E979FEE3 +:100510008020CD7AD1C1C9C3F7BFFE00C8F5F53A36 +:10052000FEBFFE002806DBFFCB6F28FAF1E67FC591 +:10053000D5E5010A002148C511A020EDB12E5109D1 +:100540006EE52A54BFCBBEC916180D170A0B081941 +:10055000095B5C966A727E82788B917723CD9AC50F +:10056000CBFE2254BFE1D1C1F1C92BCD9AC5CBFE40 +:1005700018F001E0FF0918E53EE0A56F18E20E2033 +:1005800018F33E3F23A528DD7218F7CDC9C518D54D +:10059000E12100F818CACBFE18C27CFEF728F1FE54 +:1005A000FBC0D5C5012000ED42CBBEE501E0021144 +:1005B00000F82120F8EDB021E0FA3E2077237CFE00 +:1005C000FB20F7E1CBFEC1D1C9E53E2077237CFEBD +:1005D000FB20F7E1CBFEC93E16CD17C53E18CD175F +:1005E000C5C921FFFF01FFFEED78F601F6E0572FA8 +:1005F000FE019FB0A56F7CA267CB00ED7838EDCBF4 +:100600001FCB143EFFBD2001C9CD0EC67EC9444D8F +:100610001600CB289FF6262E05958537CB1938FA7C +:100620000C482D2E0120F3212DC65F1937C95A58C9 +:10063000435641534446475157455254313233345F +:10064000353039383736504F4955590D4C4B4A489B +:10065000202C4D4E420A3A3B3D0809030A0B0B0081 +:100660007E7F1B212223242530292827260C5E5D2E +:100670005B400D2F2A2D2B202E3E3C3FC3FABFC5D9 +:10068000F5D5E501FF00ED78E61FFE1F200218F604 +:10069000CDD7C6CDE2C5FE0C2005CDD7C518E4FEEA +:1006A000FF28E0FE0020083256BFCDD7C618D4F58B +:1006B0003A56BFFE00201DF1D640F5CDE2C5FEFF43 +:1006C00020F9D31BCDD7C6F147E1D1F13EFF325619 +:1006D000BF78C1C9F118E311FF1F1D20FD1520FAD5 +:1006E000C9C5F5D5E5CDE2C53257BFE1D1F1C1C9E4 +:1006F000F579CD17C5F1C93EC332F1BF32F4BF322F +:10070000F7BF32FABF32FEBF3256BF21C5C422F254 +:10071000BF21DEC422F5BF211AC522F8BF217FC642 +:1007200022FBBF3E0832FFBF3E0D32FDBFC9FFFFB7 +:10073000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:10074000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:10075000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:10076000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:10077000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:10078000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10079000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:1007A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:1007B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:1007C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:1007D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:1007E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:1007F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:00000001FF diff --git a/Cobra_MiST/rtl/roms/cobra_char b/Cobra_MiST/rtl/roms/cobra_char new file mode 100644 index 00000000..271a6533 Binary files /dev/null and b/Cobra_MiST/rtl/roms/cobra_char differ diff --git a/Cobra_MiST/rtl/roms/cobra_char.hex b/Cobra_MiST/rtl/roms/cobra_char.hex new file mode 100644 index 00000000..dbf25afb --- /dev/null +++ b/Cobra_MiST/rtl/roms/cobra_char.hex @@ -0,0 +1,33 @@ +:10000000000E11010D15150E00040A11111F11111A +:10001000001E09090E09091E000E11101010110E04 +:10002000001E09090909091E001F10101C10101FCD +:10003000001F10101C101010000F10101311110FC2 +:10004000001111111F111111000E04040404040EFB +:10005000000101010101110E0011121418141211F6 +:10006000001010101010101F00111B151511111188 +:100070000011191513111111001F11111111111F68 +:10008000001E11111E101010000E11111115120D6D +:10009000001E11111E141211000E11080402110E7F +:1000A000001F040404040404001111111111110EA5 +:1000B000001111110A0A04040011111111151B116C +:1000C0000011110A040A11110011110A0404040498 +:1000D000001F01020408101F000E08080808080E7F +:1000E0000010100804020101000E02020202020EBA +:1000F00000040E1504040404000004081F08040092 +:1001000000000000000000000004040404040004D7 +:10011000000A0A0A00000000000A0A1B001B0A0A63 +:1001200000040F100E011E04001919020408131315 +:10013000000814140815120D000C0C0C000000002F +:10014000000204080808040200080402020204086D +:1001500000150E1F0E150000000004041F0404000B +:10016000000000000C0C0408000000001F0000004C +:100170000000000000000C0C000101020408101037 +:10018000000C12121212120C00040C040404040ECF +:10019000000E11010E10101F000E11010601110EAC +:1001A0000002060A121F0202001F101E0101110E9A +:1001B000000608101E11110E001F01020408101085 +:1001C000000E11110E11110E000E11110F01020C73 +:1001D00000000C0C000C0C00000C0C000C0C0408B3 +:1001E00000020408100804020000001F001F0000A5 +:1001F0000008040201020408000C120204040004B6 +:00000001FF diff --git a/Cobra_MiST/rtl/roms/cobra_rom.coe b/Cobra_MiST/rtl/roms/cobra_rom.coe new file mode 100644 index 00000000..f5ad35c5 --- /dev/null +++ b/Cobra_MiST/rtl/roms/cobra_rom.coe @@ -0,0 +1,162 @@ +memory_initialization_radix=16; +memory_initialization_vector= +c3,03,c0,d3,1f,31,f0,bf,cd,f7,c6,cd,d7,c5,d3,1b, +22,46,bf,21,00,00,18,05,22,46,bf,e1,2b,ed,73,48, +bf,31,46,bf,e3,e5,d5,c5,f5,ed,57,f3,47,0e,0d,e2, +33,c0,0c,c5,d9,08,18,03,00,00,00,e5,d5,c5,f5,dd, +; addr=0x0040 +e5,fd,e5,21,4a,bf,0e,02,46,05,78,b9,30,1b,23,5e, +23,56,23,1a,fe,df,20,f1,7e,e5,2a,46,bf,ed,52,e1, +12,20,e6,0d,18,e3,00,00,00,2e,4a,70,cd,2e,c2,21, +ea,c1,0d,cc,3b,c1,21,76,c0,e5,2e,d3,c5,e5,21,84, +; addr=0x0080 +c0,cd,ac,c4,06,20,43,4f,42,52,41,e1,c1,3e,3a,cd, +92,c4,3e,0d,cd,8f,c4,c8,be,23,5e,23,56,23,46,23, +28,17,30,f4,e5,21,b2,c0,cd,6b,c3,e1,31,2e,bf,c3, +2b,c2,20,45,52,52,4f,52,00,3e,3a,cd,92,c4,05,28, +; addr=0x00c0 +0e,0e,00,cd,5e,c2,e5,03,28,04,10,f7,18,d6,05,eb, +e9,e1,e9,43,e7,c2,02,44,9e,c2,03,46,00,c0,02,47, +08,c3,04,48,00,c0,02,4b,23,c1,02,4c,77,c3,02,4d, +0b,c1,01,4f,42,c2,03,53,00,c4,04,55,d1,c0,07,58, +; addr=0x0100 +33,c1,01,59,36,c1,01,5a,33,c2,04,cd,5e,c2,c8,eb, +06,08,c5,cd,6d,c1,c1,c8,13,10,f7,eb,08,cd,18,c2, +08,18,ec,e1,30,03,2a,48,bf,2b,36,c0,2b,36,10,22, +48,bf,c9,2e,ea,01,2e,ff,cd,8f,c4,f5,3a,fd,bf,4f, +; addr=0x0140 +f1,47,7e,28,0f,0e,2d,b8,28,0d,23,23,7e,e6,7f,20, +f6,c3,a4,c0,cd,92,c4,46,23,cd,25,c2,16,bf,5e,23, +e5,cd,74,c1,e1,c8,7e,a7,20,ea,c3,2e,c2,01,2d,00, +fe,2c,28,12,13,1a,1b,cb,78,c4,d5,c1,cd,97,c1,79, +; addr=0x0180 +cd,92,c4,ee,2d,c0,cd,5e,c2,d8,f5,7d,12,13,cb,78, +28,02,7c,12,f1,1b,c9,78,fe,46,1a,20,38,d9,21,b3, +c1,06,08,4f,cb,01,3e,2e,30,01,7e,cd,92,c4,23,10, +f3,d9,c9,53,5a,58,48,58,50,4e,43,0e,02,5f,06,11, +; addr=0x01c0 +af,8f,27,ed,6a,10,fa,0d,20,f3,67,7d,6b,cd,dc,c1, +7c,cd,d5,c1,7d,cd,d8,c1,07,07,07,07,f5,e6,0f,c6, +90,27,ce,40,27,cd,92,c4,f1,c9,46,3e,41,3f,42,41, +43,40,44,43,45,42,48,45,4c,44,d3,48,d0,46,00,46, +; addr=0x0200 +34,41,35,42,37,43,36,44,39,45,38,48,3b,4c,3a,d8, +32,d9,30,49,3d,4d,3c,00,cd,2e,c2,cd,d0,c1,3e,20, +18,0e,cd,92,c4,3e,3d,18,07,3e,0a,cd,92,c4,3e,0d, +c3,92,c4,c2,a4,c0,c1,d1,e1,7b,95,7a,9c,d8,71,23, +; addr=0x0240 +18,f7,20,ef,d1,e1,e5,19,3e,53,cd,22,c2,cd,1b,c2, +e1,af,ed,52,3e,44,cd,22,c2,cd,d0,c1,18,d0,2a,46, +bf,cd,8f,c4,cd,8c,c2,38,05,cd,7f,c2,37,c9,21,00, +00,29,29,29,29,b5,6f,cd,8f,c4,cd,8c,c2,38,f2,fe, +; addr=0x0280 +0d,c8,fe,2c,28,04,fe,20,20,a9,a7,c9,d6,30,fe,0a, +d8,d6,11,fe,06,30,03,d6,f6,c9,c6,41,a7,c9,20,93, +d1,e1,cd,18,c2,f5,3a,ff,bf,47,f1,cd,1e,c2,7e,cd, +d5,c1,23,7b,95,7a,9c,da,29,c2,10,ef,f5,cd,cc,c2, +; addr=0x02c0 +f1,18,df,0a,0d,20,42,52,45,41,4b,00,3e,fe,db,ff, +1f,d8,3e,bf,db,ff,1f,d8,e5,21,c3,c2,cd,6b,c3,e1, +f1,31,f0,bf,c3,10,c0,cd,25,c2,e1,cb,7c,28,13,e5, +eb,af,6f,65,3e,2d,ed,52,cd,92,c4,cd,bb,c1,cd,1e, +; addr=0x0300 +c2,e1,cd,bb,c1,c3,2e,c2,21,4a,bf,71,35,0d,23,d1, +28,0b,73,23,72,23,1a,77,3e,df,12,18,f0,ed,53,46, +bf,e1,fd,e1,dd,e1,f1,c1,d1,e1,08,d9,f1,ed,47,21, +f3,c3,38,02,2e,fb,f1,c1,d1,e3,ed,7b,48,bf,c3,44, +; addr=0x0340 +bf,e5,cd,68,c3,e1,31,f0,bf,c3,10,c0,20,53,54,41, +52,54,20,54,41,50,45,2e,2e,00,20,53,54,4f,50,20, +54,41,50,45,20,21,21,00,21,5a,c3,7e,fe,00,28,06, +cd,17,c5,23,18,f5,c9,f5,21,4c,c3,cd,6b,c3,f1,e1, +; addr=0x0380 +30,02,60,68,f5,e5,11,ed,b0,d1,d3,1b,cd,b8,c4,f5, +cd,cc,c2,f1,cd,db,c4,fe,03,ca,41,c3,ee,3a,20,f4, +21,5c,bf,47,a7,3f,f5,cd,db,c4,77,f1,37,3f,04,10, +08,7e,e6,3f,4f,c6,05,47,af,86,23,10,e7,c2,e4,c3, +; addr=0x03c0 +2a,5d,bf,7d,6c,67,19,d5,11,60,bf,79,a7,eb,18,b7, +20,53,41,56,45,2e,2e,00,20,54,41,50,45,20,45,52, +52,4f,52,00,e5,21,d8,c3,cd,6b,c3,e1,31,f0,bf,c3, +10,c0,3e,03,cd,c2,c4,e5,cd,68,c3,e1,cd,2e,c2,c9, +; addr=0x0400 +f5,e5,21,d0,c3,cd,6b,c3,21,60,03,2b,af,cd,c2,c4, +7c,b5,20,f7,e1,f1,28,05,0d,ca,a4,c0,d5,c1,08,e1, +d1,af,ed,52,d8,23,c5,f5,cd,cc,c2,f1,01,20,00,ed, +42,30,03,09,4d,68,e5,21,5c,bf,71,23,72,23,73,23, +; addr=0x0440 +70,23,03,eb,ed,b0,eb,1b,cd,59,c4,e1,7d,b4,20,d7, +d1,3c,08,c2,f2,c3,d5,18,db,21,5c,bf,cd,83,c4,01, +3a,d3,1b,cd,b8,c4,7e,c6,05,47,af,10,01,77,04,96, +a7,3f,f5,af,7e,cd,c2,c4,f1,23,10,ef,cd,83,c4,02, +; addr=0x0480 +0d,0a,c9,e3,46,23,7e,cd,c2,c4,10,f9,23,e3,c9,cd, +7c,c6,37,cd,99,c4,fe,0d,c0,f5,c5,06,01,38,04,3e, +0a,06,02,cd,17,c5,af,10,fa,c1,f1,c9,e3,46,23,7e, +cd,17,c5,10,f9,23,e3,c9,f5,3a,1f,f8,2f,32,1f,f8, +; addr=0x04c0 +f1,c9,c3,f1,bf,c5,f5,0e,0b,b7,38,02,d3,1f,06,67, +10,fe,37,cb,1f,0d,20,f2,f1,c1,c9,c3,f4,bf,c5,d5, +db,ff,cb,17,cb,17,38,f8,06,34,10,fe,db,ff,cb,17, +cb,17,38,ec,0e,80,59,06,67,10,fe,db,ff,cb,17,cb, +; addr=0x0500 +17,cb,19,30,f2,cb,13,30,05,51,0e,01,18,e9,79,fe, +80,20,cd,7a,d1,c1,c9,c3,f7,bf,fe,00,c8,f5,f5,3a, +fe,bf,fe,00,28,06,db,ff,cb,6f,28,fa,f1,e6,7f,c5, +d5,e5,01,0a,00,21,48,c5,11,a0,20,ed,b1,2e,51,09, +; addr=0x0540 +6e,e5,2a,54,bf,cb,be,c9,16,18,0d,17,0a,0b,08,19, +09,5b,5c,96,6a,72,7e,82,78,8b,91,77,23,cd,9a,c5, +cb,fe,22,54,bf,e1,d1,c1,f1,c9,2b,cd,9a,c5,cb,fe, +18,f0,01,e0,ff,09,18,e5,3e,e0,a5,6f,18,e2,0e,20, +; addr=0x0580 +18,f3,3e,3f,23,a5,28,dd,72,18,f7,cd,c9,c5,18,d5, +e1,21,00,f8,18,ca,cb,fe,18,c2,7c,fe,f7,28,f1,fe, +fb,c0,d5,c5,01,20,00,ed,42,cb,be,e5,01,e0,02,11, +00,f8,21,20,f8,ed,b0,21,e0,fa,3e,20,77,23,7c,fe, +; addr=0x05c0 +fb,20,f7,e1,cb,fe,c1,d1,c9,e5,3e,20,77,23,7c,fe, +fb,20,f7,e1,cb,fe,c9,3e,16,cd,17,c5,3e,18,cd,17, +c5,c9,21,ff,ff,01,ff,fe,ed,78,f6,01,f6,e0,57,2f, +fe,01,9f,b0,a5,6f,7c,a2,67,cb,00,ed,78,38,ed,cb, +; addr=0x0600 +1f,cb,14,3e,ff,bd,20,01,c9,cd,0e,c6,7e,c9,44,4d, +16,00,cb,28,9f,f6,26,2e,05,95,85,37,cb,19,38,fa, +0c,48,2d,2e,01,20,f3,21,2d,c6,5f,19,37,c9,5a,58, +43,56,41,53,44,46,47,51,57,45,52,54,31,32,33,34, +; addr=0x0640 +35,30,39,38,37,36,50,4f,49,55,59,0d,4c,4b,4a,48, +20,2c,4d,4e,42,0a,3a,3b,3d,08,09,03,0a,0b,0b,00, +7e,7f,1b,21,22,23,24,25,30,29,28,27,26,0c,5e,5d, +5b,40,0d,2f,2a,2d,2b,20,2e,3e,3c,3f,c3,fa,bf,c5, +; addr=0x0680 +f5,d5,e5,01,ff,00,ed,78,e6,1f,fe,1f,20,02,18,f6, +cd,d7,c6,cd,e2,c5,fe,0c,20,05,cd,d7,c5,18,e4,fe, +ff,28,e0,fe,00,20,08,32,56,bf,cd,d7,c6,18,d4,f5, +3a,56,bf,fe,00,20,1d,f1,d6,40,f5,cd,e2,c5,fe,ff, +; addr=0x06c0 +20,f9,d3,1b,cd,d7,c6,f1,47,e1,d1,f1,3e,ff,32,56, +bf,78,c1,c9,f1,18,e3,11,ff,1f,1d,20,fd,15,20,fa, +c9,c5,f5,d5,e5,cd,e2,c5,32,57,bf,e1,d1,f1,c1,c9, +f5,79,cd,17,c5,f1,c9,3e,c3,32,f1,bf,32,f4,bf,32, +; addr=0x0700 +f7,bf,32,fa,bf,32,fe,bf,32,56,bf,21,c5,c4,22,f2, +bf,21,de,c4,22,f5,bf,21,1a,c5,22,f8,bf,21,7f,c6, +22,fb,bf,3e,08,32,ff,bf,3e,0d,32,fd,bf,c9,ff,ff, +ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff, +; addr=0x0740 +ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff, +ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff, +ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff, +ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff, +; addr=0x0780 +ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff, +ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff, +ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff, +ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff, +; addr=0x07c0 +ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff, +ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff, +ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff, +ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff; + \ No newline at end of file diff --git a/Cobra_MiST/rtl/roms/deutsch.hex b/Cobra_MiST/rtl/roms/deutsch.hex new file mode 100644 index 00000000..23afe5d3 --- /dev/null +++ b/Cobra_MiST/rtl/roms/deutsch.hex @@ -0,0 +1,1025 @@ +:10000000F3AF11FFFFC3CB112A5D5C225F5C184385 +:10001000C3F215FFFFFFFFFF2A5D5C7ECD7D00D0A0 +:10002000CD740018F7FFFFFFC35B33FFFFFFFFFF37 +:10003000C52A615CE5C39E16F5E52A785C23227823 +:100040005C7CB52003FD3440C5D5CD6E38D1C1E10F +:10005000F1FBC9E16EFD7500ED7B3D5CC3C516FF8C +:10006000FFFFFFFFFFFFF5E52AB05C7CB52001E94B +:10007000E1F1ED452A5D5C23225D5C7EC9FE21D065 +:10008000FE0DC8FE10D8FE183FD823FE16380123F7 +:1000900037225D5CC9BF524EC4494E4B4559A450EE +:1000A000C946CE504F494ED453435245454EA441C4 +:1000B0005454D241D45441C256414CA4434F44C538 +:1000C0005641CC4C45CE5349CE434FD35441CE41FB +:1000D00053CE4143D34154CE4CCE4558D0494ED453 +:1000E0005351D25347CE4142D3504545CB49CE55CB +:1000F00053D2535452A4434852A44E4FD44249CEF3 +:100100004FD2414EC43CBD3EBD3CBE4C494EC55491 +:100110004845CE54CF535445D04445462046CE435F +:1001200041D4464F524D41D44D4F56C5455241538F +:10013000C54F50454E20A3434C4F534520A34D453A +:100140005247C55645524946D9424545D043495282 +:10015000434CC5494ECB50415045D2464C4153C803 +:100160004252494748D4494E56455253C54F5645C9 +:10017000D24F55D44C5052494ED44C4C4953D45381 +:10018000544FD0524541C4444154C1524553544F39 +:1001900052C54E45D7424F524445D2434F4ED444A8 +:1001A00049CD5245CD464FD2474F54CF474F535577 +:1001B000C2494E5055D44C4F41C44C4953D44C4580 +:1001C000D450415553C54E4558D4504F4BC550524D +:1001D000494ED4504C4FD45255CE534156C552413E +:1001E0004E444F4D495AC549C6434CD3445241D75A +:1001F000434C4541D25245545552CE434F50D920DD +:10020000202020202042485A36355447564E4A5521 +:1002100037345246434D4B4938334544580E4C4FC2 +:100220003932575359200D5030315141E3C4E0E485 +:10023000B4BCBDBBAFB0B1C0A7A6BEADB2BAE5A558 +:10024000C2E1B3B9B8C17EDCDA5CB77B7DD8BFAEA2 +:10025000AAABDDDEDF7FB5D67CD55DDBB6D9D75B5B +:100260000C07060405080A0B090FE22A3FCDC8CC8B +:10027000CB5EAC2D2B3D2E2C3B22C73CC33EC52F65 +:10028000C9603AC6D0CEA8CAD3D4D1D2A9CF2E2F16 +:1002900011FFFF01FEFEED782FE61F280E677D148B +:1002A000C0D608CB3C30FA535F20F42DCB0038E6A3 +:1002B0007A3CC8FE28C8FE19C87B5A57FE18C9CD1B +:1002C0008E02C021005CCB7E200723352B20023616 +:1002D000FF7D21045CBD20EECD1E03D021005CBE5D +:1002E000282EEB21045CBE2827CB7E2004EBCB7E9E +:1002F000C85F77233605233A095C7723FD4E07FD57 +:100300005601E5CD3303E17732085CFDCB01EEC940 +:100310002336052335C03A0A5C77237E18EA421655 +:10032000007BFE27D0FE182003CB78C021050219E0 +:100330007E37C97BFE3A382F0DFA4F032803C64F8C +:10034000C921EB010428032105021600197EC921E9 +:100350002902CB4028F4CB5A280AFDCB305EC004DA +:10036000C0C620C9C6A5C9FE30D80DFA9D03201904 +:10037000215402CB6828D3FE383007D62004C8C6E3 +:1003800008C9D63604C8C6FEC9213002FE3928BACB +:10039000FE3028B6E607C68004C8EE0FC904C8CBF5 +:1003A0006821300220A4D610FE222806FE20C03E7E +:1003B0005FC93E40C9F37DCB3DCB3D2FE6034F06E1 +:1003C00000DD21D103DD093A485CE6380F0F0FF656 +:1003D00008000000040C0D20FD0E3F05C2D603EE00 +:1003E00010D3FE444FCB6720097AB32809794D1BFF +:1003F000DDE94D0CDDE9FBC9EF3127C00334EC6CBE +:10040000981FF504A10F3821925C7EA7205E234E31 +:10041000234678179FB9205423BE205078C63CF25B +:100420002504E26C0406FA04D60C30FBC60CC52188 +:100430006E04CD0634CDB433EF0438F18677EFC0C7 +:10044000023138CD941EFE0B3022EFE004E0348000 +:1004500043559F8001053435710338CD991EC5CDB4 +:10046000991EE150597AB3C81BC3B503CF0A89025C +:10047000D01286890A9760758912D5171F891B903B +:1004800041028924D053CA892E9D36B18938FF494B +:100490003E8943FF6A73894FA70054895C000000BE +:1004A000896914F6248976F11005A07F3139383234 +:1004B0002D38362C207F3230303020416D737472ED +:1004C00061E4213F05E521801FCB7F280321980CA3 +:1004D0000813DD2BF33E024710FED3FEEE0F06A4F9 +:1004E0002D20F50525F2D804062F10FED3FE3E0D73 +:1004F000063710FED3FE010E3B086FC307057AB323 +:10050000280CDD6E007CAD673E0137C325056C18F5 +:10051000F479CB7810FE3004064210FED3FE063E7E +:1005200020EF05AF3CCB15C214051BDD2306313E81 +:100530007FDBFE1FD07A3CC2FE04063B10FEC9F5ED +:100540003A485CE6380F0F0FD3FE3E7FDBFE1FFB01 +:100550003802CF0CF1C9140815F33E0FD3FE213F2A +:1005600005E5DBFE1FE620F6024FBFC0CDE70530F4 +:10057000FA21150410FE2B7CB520F9CDE30530EBF4 +:10058000069CCDE30530E43EC6B830E02420F106F9 +:10059000C9CDE70530D578FED430F4CDE705D07964 +:1005A000EE034F260006B0181F082007300FDD7538 +:1005B00000180FCB11ADC0791F4F131807DD7E0057 +:1005C000ADC0DD231B0806B22E01CDE305D03ECB26 +:1005D000B8CB1506B0D2CA057CAD677AB320CA7C09 +:1005E000FE01C9CDE705D03E163D20FDA704C83E5B +:1005F0007FDBFE1FD0A9E62028F3792F4FE607F610 +:1006000008D3FE37C9F13A745CD6E032745CCD8C05 +:100610001CCD3025283C0111003A745CA728020E3D +:1006200022F7D5DDE1060B3E20121310FCDD36016A +:10063000FFCDF12B21F6FF0B0903300F3A745CA7B5 +:100640002002CF0E78B1280A010A00DDE5E123EB94 +:10065000EDB0DFFEE420493A745CFE03CA8A1CE771 +:10066000CDB228CBF9300B2100003A745C3D28153F +:10067000CF01C28A1CCD30252818237EDD770B23BD +:100680007EDD770C23DD710E3E01CB7128013CDD50 +:100690007700EBE7FE2920DAE7CDEE1BEBC35A0724 +:1006A000FEAA201F3A745CFE03CA8A1CE7CDEE1B2B +:1006B000DD360B00DD360C1B210040DD750DDD74D1 +:1006C0000E184DFEAF204F3A745CFE03CA8A1CE739 +:1006D000CD4820200C3A745CA7CA8A1CCDE61C18B1 +:1006E0000FCD821CDFFE2C280C3A745CA7CA8A1C32 +:1006F000CDE61C1804E7CD821CCDEE1BCD991EDD86 +:10070000710BDD700CCD991EDD710DDD700E606911 +:10071000DD3600031844FECA2809CDEE1BDD360E77 +:100720008018173A745CA7C28A1CE7CD821CCDEEF4 +:100730001BCD991EDD710DDD700EDD3600002A59CE +:100740005CED5B535C37ED52DD750BDD740C2A4BB1 +:100750005CED52DD750FDD7410EB3A745CA7CA7066 +:1007600009E5011100DD09DDE5111100AF37CD56B6 +:1007700005DDE130F23EFECD0116FD3652030E805E +:10078000DD7E00DDBEEF20020EF6FE0430D911C082 +:1007900009C5CD0A0CC1DDE5D121F0FF19060A7E9D +:1007A0003C200379804F131ABE2320010CD710F68A +:1007B000CB7920B33E0DD7E1DD7E00FE03280C3A55 +:1007C000745C3DCA0808FE02CAB608E5DD6EFADDB3 +:1007D00066FBDD5E0BDD560C7CB5280DED52382630 +:1007E0002807DD7E00FE03201DE17CB52006DD6EBE +:1007F0000DDD660EE5DDE13A745CFE02372001A7EF +:100800003EFFCD5605D8CF1ADD5E0BDD560CE57CDC +:10081000B52006131313EB180CDD6EFADD66FBEB47 +:1008200037ED52380911050019444DCD051FE1DDA2 +:100830007E00A7283E7CB528132B462B4E2B0303A6 +:1008400003DD225F5CCDE819DD2A5F5C2A595C2B51 +:10085000DD4E0BDD460CC5030303DD7EFDF5CD55F6 +:100860001623F177D12373237223E5DDE1373EFFB1 +:10087000C30208EB2A595C2BDD225F5CDD4E0BDDE9 +:10088000460CC5CDE519C1E5C5CD5516DD2A5F5C21 +:1008900023DD4E0FDD461009224B5CDD660E7CE643 +:1008A000C0200ADD6E0D22425CFD360A00D1DDE17A +:1008B000373EFFC30208DD4E0BDD460CC503F7369D +:1008C00080EBD1E5E5DDE1373EFFCD0208E1ED5BF0 +:1008D000535C7EE6C020191A13BE2320021ABE1BE9 +:1008E0002B3008E5EBCDB819E118ECCD2C0918E256 +:1008F0007E4FFE80C8E52A4B5C7EFE802825B92805 +:1009000008C5CDB819C1EB18F0E6E0FEA02012D161 +:10091000D5E523131ABE20061730F7E11803E118B6 +:10092000E03EFFD1EB3C37CD2C0918C42010082243 +:100930005F5CEBCDB819CDE819EB2A5F5C0808D5F0 +:10094000CDB819225F5C2A535CE3C50838072BCD6C +:100950005516231803CD551623C1D1ED53535CED25 +:100960005B5F5CC5D5EBEDB0E1C1D5CDE819D1C970 +:10097000E53EFDCD0116AF11A109CD0A0CFDCB025C +:10098000EECDD415DDE5111100AFCDC204DDE106D9 +:10099000327610FDDD5E0BDD560C3EFFDDE1C3C29D +:1009A0000480537461727420746170652C207468C3 +:1009B000656E20707265737320616E79206B657946 +:1009C000AE0D50726F6772616D3AA00D4E756D621B +:1009D00065722061727261793AA00D43686172613B +:1009E000637465722061727261793AA00D42797404 +:1009F00065733AA0CD030BFE20D2D90AFE063869F2 +:100A0000FE183065210B0A5F1600195E19E5C30355 +:100A10000B4E57102954535237504F5F5E5D5C5B4D +:100A20005A54530C3E22B92011FDCB014E2009042B +:100A30000E023E18B82003050E21C3D90D3A915C71 +:100A4000F5FD3657013E20CD650BF132915CC9FDB5 +:100A5000CB014EC2CD0E0E21CD550C05C3D90DCD07 +:100A6000030B793D3DE610185A3E3F186C11870A7A +:100A7000320F5C180B116D0A180311870A320E5CD5 +:100A80002A515C732372C911F409CD800A2A0E5CC5 +:100A9000577DFE16DA11222029444A3E1F91380C58 +:100AA000C6024FFDCB014E20163E1690DA9F1E3C2B +:100AB0004704FDCB0246C2550CFDBE31DA860CC39D +:100AC000D90D7CCD030B813DE61FC857FDCB01C678 +:100AD0003E20CD3B0C1520F8C9CD240BFDCB014E9B +:100AE000201AFDCB02462008ED43885C22845CC9B5 +:100AF000ED438A5CED43825C22865CC9FD71452230 +:100B0000805CC9FDCB014E2014ED4B885C2A845CCF +:100B1000FDCB0246C8ED4B8A5C2A865CC9FD4E457A +:100B20002A805CC9FE80383DFE90302647CD380BC8 +:100B3000CD030B11925C184721925CCD3E0BCB1874 +:100B40009FE60F4FCB189FE6F0B10E0477230D20E0 +:100B5000FBC9C39F3B00C615C5ED4B7B5C180BCD95 +:100B6000100CC3030BC5ED4B365CEB213B5CCB8615 +:100B7000FE202002CBC626006F29292909C1EB7966 +:100B80003D3E21200E054FFDCB014E2806D5CDCD93 +:100B90000ED179B9D5CC550CD1C5E53A915C06FF9B +:100BA0001F3801041F1F9F4F3E08A7FDCB014E2891 +:100BB00005FDCB30CE37EB081AA0AEA912083813CA +:100BC00014233D20F2EB25FDCB014ECCDB0BE1C124 +:100BD0000D23C9083E20835F0818E67C0F0F0FE63F +:100BE00003F65867ED5B8F5C7EABA2ABFDCB57760F +:100BF0002808E6C7CB572002EE38FDCB57662808F9 +:100C0000E6F8CB6F2002EE0777C9E52600E318046B +:100C1000119500F5CD410C38093E20FDCB0146CCA5 +:100C20003B0C1AE67FCD3B0C1A138730F5D1FE48FA +:100C30002803FE82D87AFE03D83E20D5D9D7D9D151 +:100C4000C9F5EB3CCB7E2328FB3D20F8EBF1FE20E1 +:100C5000D81AD641C9FDCB014EC011D90DD578FDAA +:100C6000CB0246C2020DFDBE31381BC0FDCB026671 +:100C70002816FD5E2D1D285A3E00CD0116ED7B3F46 +:100C80005CFDCB02A6C9CF04FD355220453E18902D +:100C9000328C5C2A8F5CE53A915CF53EFDCD011605 +:100CA000AF11F80CCD0A0CFDCB02EE213B5CCBDE84 +:100CB000CBAED9CDD415D9FE202845FEE22841F689 +:100CC00020FE6E283B3EFECD0116F132915CE12202 +:100CD0008F5CCDFE0DFD4631040E21C5CD9B0E7CF3 +:100CE0000F0F0FE603F6586711E05A1A4E0620EB75 +:100CF0001271132310FAC1C9807363726F6C6CBFD9 +:100D0000CF0CFE023880FD8631D619D0ED44C547A0 +:100D10002A8F5CE52A915CE5CD4D0D78F5216B5C61 +:100D200046783C7721895CBE3803340618CD000E26 +:100D3000F13D20E8E1FD7557E1228F5CED4B885CC9 +:100D4000FDCB0286CDD90DFDCB02C6C1C9AF2A8D20 +:100D50005CFDCB0246280467FD6E0E228F5C21915C +:100D60005C20027E0FAEE655AE77C9CDAF0D213CBB +:100D70005CCBAECBC6CD4D0DFD4631CD440E21C072 +:100D80005A3A8D5C0518070E202B770D20FB10F7C3 +:100D9000FD3631023EFDCD01162A515C11F409A742 +:100DA0007323722311A8103F38F6012117182A2146 +:100DB0000000227D5CFDCB3086CD940D3EFECD0142 +:100DC00016CD4D0D0618CD440E2A515C11F4097351 +:100DD0002372FD36520101211821005BFDCB014E2B +:100DE000201278FDCB02462805FD8631D618C5476E +:100DF000CD9B0EC13E21915F160019C3DC0A061778 +:100E0000CD9B0E0E08C5E578E60778200CEB21E0B7 +:100E1000F819EB0120003DEDB0EB21E0FF19EB47A5 +:100E2000E6070F0F0F4F780600EDB0060709E6F84A +:100E300020DBE124C10D20CDCD880E21E0FF19EB90 +:100E4000EDB00601C5CD9B0E0E08C5E578E6070F8F +:100E50000F0F4F7806000D545D360013EDB01101F1 +:100E600007193DE6F84720E5E124C10D20DCCD88D7 +:100E70000E626B133A8D5CFDCB024628033A485C48 +:100E8000770BEDB0C10E21C97C0F0F0F3DF65067F7 +:100E9000EB61682929292929444DC93E1890570F2B +:100EA0000F0FE6E06F7AE618F64067C9F306B02147 +:100EB0000040E5C5CDF40EC1E1247CE607200A7DA3 +:100EC000C6206F3F9FE6F8846710E7180DF32100F6 +:100ED0005B0608C5CDF40EC110F93E04D3FBFB211F +:100EE000005BFD7546AF47772310FCFDCB308E0EBF +:100EF00021C3D90D78FE039FE602D3FB57CD541FC3 +:100F0000380A3E04D3FBFBCDDF0ECF0CDBFB87F8AA +:100F100030EB0E205E230608CB12CB13CB1ADBFB83 +:100F20001F30FB7AD3FB10F00D20E9C92A3D5CE5A8 +:100F3000217F10E5ED733D5CCDD415F51600FD5E07 +:100F4000FF21C800CDB503F121380FE5FE1830317F +:100F5000FE07382DFE10383A01020057FE16380CF5 +:100F600003FDCB377ECA1E10CDD4155FCDD415D569 +:100F70002A5B5CFDCB0786CD5516C1237023711803 +:100F80000AFDCB07862A5B5CCD52161213ED535B2C +:100F90005CC95F160021990F195E19E52A5B5CC9CF +:100FA00009666A50B5707ECFD42A495CFDCB376E96 +:100FB000C29710CD6E19CD95167AB3CA9710E52356 +:100FC0004E2346210A0009444DCD051FCD97102A16 +:100FD000515CE3E53EFFCD0116E12BFD350FCD550C +:100FE00018FD340F2A595C23232323225B5CE1CDB7 +:100FF0001516C9FDCB376E200821495CCD0F191895 +:101000006DFD360010181DCD311018057EFE0DC87F +:1010100023225B5CC9CD3110010100C3E819CDD496 +:1010200015CDD415E1E1E1223D5CFDCB007EC0F998 +:10103000C937CD9511ED521923C1D8C5444D626B06 +:10104000231AE6F0FE102009231AD617CE0020013D +:1010500023A7ED4209EB38E6C9FDCB376EC02A491C +:101060005CCD6E19EBCD9516214A5CCD1C19CD9542 +:10107000173E00C30116FDCB377E28A8C3810FFDA4 +:10108000CB306628A1FD3600FF1600FD5EFE2190E4 +:101090001ACDB503C3300FE5CD90112BCDE5192244 +:1010A0005B5CFD360700E1C9FDCB025EC41D11A7E4 +:1010B000FDCB016EC83A085CFDCB01AEF5FDCB025D +:1010C0006EC46E0DF1FE203052FE10302DFE063043 +:1010D0000A47E6014F781FC612182A2009216A5CC8 +:1010E0003E08AE77180EFE0ED8D60D21415CBE77B5 +:1010F00020023600FDCB02DEBFC947E6074F3E1097 +:10110000CB5820013CFD71D3110D1118063A0D5C2E +:1011100011A8102A4F5C232373237237C9CD4D0DBC +:10112000FDCB029EFDCB02AE2A8A5CE52A3D5CE542 +:10113000216711E5ED733D5C2A825CE537CD9511A1 +:10114000EBCD7D18EBCDE1182A8A5CE3EBCD4D0D9C +:101150003A8B5C92382620067BFD9650301E3E204E +:10116000D5CDF409D118E91600FD5EFE21901ACD07 +:10117000B503FD3600FFED5B8A5C1802D1E1E12288 +:101180003D5CC1D5CDD90DE122825CFD362600C97A +:101190002A615C2BA7ED5B595CFDCB376EC8ED5B1C +:1011A000615CD82A635CC97EFE0E010600CCE8199A +:1011B0007E23FE0D20F1C9F33EFFED5BB25CD9ED5D +:1011C0004BB45CED5B385C2A7B5CD9473E07D3FEB1 +:1011D0003E3FED47000000000000626B36022BBC72 +:1011E00020FAA7ED52192330063528033528F32BB2 +:1011F000D9ED43B45CED53385C227B5CD9042819EB +:1012000022B45C11AF3E01A800EBEDB8EB23227BCA +:101210005C2B014000ED43385C22B25C21003C2293 +:10122000365C2AB25C363E2BF92B2B223D5CED5608 +:10123000FD213A5CFB21B65C224F5C11AF15011514 +:1012400000EBEDB0EB2B22575C2322535C224B5C6E +:1012500036802322595C360D2336802322615C229E +:10126000635C22655C3E38328D5C328F5C32485C58 +:1012700021230522095CFD35C6FD35CA21C615119D +:10128000105C010E00EDB0FDCB01CECDDF0EFD36C2 +:101290003102CD6B0DAF11AA04CD0A0CFDCB02EECD +:1012A0001807FD363102CD9517CDB0163E00CD01A1 +:1012B00016CD2C0FCD171BFDCB007E2012FDCB30A1 +:1012C0006628402A595CCDA711FD3600FF18DD2A9B +:1012D000595C225D5CCDFB1978B1C25D15DFFE0D56 +:1012E00028C0FDCB3046C4AF0DCD6E0D3E19FD9626 +:1012F0004F328C5CFDCB01FEFD3600FFFD360A014E +:10130000CD8A1B76FDCB01AEFDCB304EC4CD0E3A5F +:101310003A5C3CF5210000FD7437FD7426220B5C1D +:1013200021010022165CCDB016FDCB37AECD6E0D7F +:10133000FDCB02EEF147FE0A3802C607CDEF153E9F +:1013400020D778119113CD0A0CCD3B3B00CD0A0C70 +:10135000ED4B455CCD1B1A3E3AD7FD4E0D0600CD38 +:101360001B1ACD97103A3A5C3C281BFE092804FE54 +:10137000152003FD340D01030011705C21445CCB8A +:101380007E280109EDB8FD360AFFFDCB019EC3ACF6 +:1013900012804FCB4E455854206F686E6520464FE3 +:1013A000D25661726961626C65206E6963687420EF +:1013B000676566756E6465EE537562736372697016 +:1013C000742066616C7363E8537065696368657265 +:1013D00020766F6CEC42696C6473636869726D208F +:1013E000766F6CEC4E756D6D6572207A7520677244 +:1013F0006FFE52455455524E206F686E6520474F20 +:101400005355C24461746569656E64E553544F5029 +:10141000204265666568EC46616C7363686572209E +:10142000506172616D657465F2496E7465676572CD +:101430002061757E657268616C622064657320420C +:10144000657265696368F3556E73696E6E20696DC8 +:101450002042415349C3425245414B3A20434F4EEB +:101460005420776965646572686F6CF45A752077EB +:10147000656E696720444154412D57657274E55586 +:101480006E677D6C74696765722044617465696E0E +:10149000616DE54B65696E20506C61747A20667DE4 +:1014A00072205A65696CE553544F5020696E20498B +:1014B0004E5055D4464F52206F686E65204E4558A9 +:1014C000D4556E677D6C746967657320452F412024 +:1014D0004765727BF4556E677D6C7469676520465D +:1014E000617262E5425245414B20696D2050726F36 +:1014F0006772616DED52414D544F50207363686CBB +:10150000656368F442656665686C207665726C6F29 +:101510007265EE556E677D6C7469676572207374D1 +:10152000726561ED464E206F686E65204445C65079 +:101530006172616D657465726665686C65F24B61B8 +:1015400073657474656E6C6164656665686C65F27C +:101550002CA07FFFFF3E10010000C31313ED434991 +:101560005C2A5D5CEB215515E52A615C37ED52E59F +:101570006069CD6E192006CDB819CDE819C1793D45 +:10158000B02828C5030303032BED5B535CD5CD5571 +:1015900016E122535CC1C5132A615C2B2BEDB82ADE +:1015A000495CEBC1702B712B732B72F1C3A212F447 +:1015B00009A8104BF409C41553810FC41552F4093E +:1015C000C4155080CF12010006000B00010001007D +:1015D00006001000FDCB026E2004FDCB02DECDE63E +:1015E00015D828FACF07D9E52A515C232318081EFD +:1015F0003083D9E52A515C5E2356EBCD2C16E1D918 +:10160000C987C6166F265C5E23567AB32002CF17B1 +:101610001B2A4F5C1922515CFDCB30A623232323C8 +:101620004E212D16CDDC16D016005E19E94B06535F +:1016300012501B00FDCB02C6FDCB01AEFDCB30E648 +:101640001804FDCB0286FDCB018EC34D0DFDCB01F1 +:10165000CEC9010100E5CD051FE1CD64162A655C08 +:10166000EBEDB8C9F5E5214B5C3E0E5E2356E3A7D2 +:10167000ED5219E33009D5EB09EB722B7323D1231B +:101680003D20E8EBD1F1A7ED52444D0319EBC90021 +:1016900000EB118F167EE6C020F756235EC92A6341 +:1016A0005C2BCD55162323C1ED43615CC1EB23C9EF +:1016B0002A595C360D225B5C2336802322615C2A2A +:1016C000615C22635C2A635C22655CE521925C229A +:1016D000685CE1C9ED5B595CC3E519237EA7C8B915 +:1016E0002320F837C9CD1E17CD011701000011E2E4 +:1016F000A3EB19380701D415094E2346EB7123706B +:10170000C9E52A4F5C092323234EEB211617CDDCB4 +:10171000164E060009E94B0553035001E1C9CD946B +:101720001EFE103802CF17C6030721105C4F0600BB +:10173000094E23462BC9EF0138CD1E1778B1281664 +:10174000EB2A4F5C092323237EEBFE4B2808FE5334 +:101750002804FE5020CFCD5D17732372C9E5CDF16B +:101760002B78B12002CF0EC51AE6DF4F217A17CDB4 +:10177000DC1630F14E060009C1E94B065308500A49 +:10178000001E0118061E0618021E100B78B120D587 +:1017900057E1C91890ED733F5CFD360210CDAF0DD7 +:1017A000FDCB02C6FD4631CD440EFDCB0286FDCBFE +:1017B00030C62A495CED5B6C5CA7ED52193822D526 +:1017C000CD6E1911C002EBED52E3CD6E19C1C5CD3E +:1017D000B819C109380EEB56235E2BED536C5C181B +:1017E000ED226C5C2A6C5CCD6E192801EBCD3318B0 +:1017F000FDCB02A6C93E0318023E02FD360200CD13 +:101800003025C40116DFCD70203814DFFE3B2804DC +:10181000FE2C2006E7CD821C1808CDE61C1803CD4F +:10182000DE1CCDEE1BCD991E78E63F676922495C30 +:10183000CD6E191E01CD5518D7FDCB026628F63A9C +:101840006B5CFD964F20EEABC8E5D5216C5CCD0FEF +:1018500019D1E118E0ED4B495CCD8019163E280501 +:10186000110000CB13FD732D7EFE40C1D0C5CD28E5 +:101870001A232323FDCB01867AA72805D7FDCB01A8 +:10188000C6D5EBFDCB3096213B5CCB96FDCB376EBE +:101890002802CBD62A5F5CA7ED5220053E3FCDC182 +:1018A00018CDE118EB7ECDB61823FE0D2806EBCD42 +:1018B000371918E0D1C9FE0EC02323232323237E2A +:1018C000C9D92A8F5CE5CBBCCBFD228F5C21915C12 +:1018D00056D53600CDF409E1FD7457E1228F5CD96D +:1018E000C92A5B5CA7ED52C03A415CCB072804C60D +:1018F000431816213B5CCB9E3E4BCB56280BCBDED0 +:101900003CFDCB305E28023E43D5CDC118D1C95E27 +:101910002356E5EB23CD6E19CD9516E1FDCB376E41 +:10192000C0722B73C97BA7F8180DAF093C38FCEDCA +:10193000423D28F1C3EF15CD1B2D3030FE21382C50 +:10194000FDCB0196FECB2824FE3A200EFDCB376E50 +:101950002016FDCB30562814180EFE22200AF53A28 +:101960006A5CEE04326A5CF1FDCB01D6D7C9E52A88 +:10197000535C545DC1CD8019D0C5CDB819EB18F4B6 +:101980007EB8C0237E2BB9C9232323225D5C0E00C1 +:1019900015C8E7BB2004A7C9237ECDB618225D5C1D +:1019A000FE2220010DFE3A2804FECB2004CB412864 +:1019B000DFFE0D20E31537C9E57EFE403817CB6FFB +:1019C000281487FAC7193F01050030020E121723A9 +:1019D0007E30FB180623234E23462309D1A7ED5260 +:1019E000444D19EBC9CDDD19C5782F47792F4F0329 +:1019F000CD6416EBE119D5EDB0E1C92A595C2B2273 +:101A00005D5CE721925C22655CCD3B2DCDA22D383B +:101A10000421F0D809DA8A1CC3C516D5E5AFCB7806 +:101A2000202060691EFF1808D556235EE5EB1E20B6 +:101A30000118FCCD2A19019CFFCD2A190EF6CD2ADA +:101A4000197DCDEF15E1D1C9B1CBBCBFC4AFB49303 +:101A5000919295989898989898987F812E6C6E702E +:101A60004894563F412B171F3777440F592B432D6E +:101A7000513A6D420D495C44155D013D0206006717 +:101A80001E06CB05F01C0600ED1E00EE1C00231FF9 +:101A9000043D06CC0605031D0400AB1D05CD1F0546 +:101AA000892005022C05B21B00B71103A11E05F900 +:101AB000170800801E034F1E005F1E03AC1E006B44 +:101AC0000D0900DC2206003A1F05ED1D05271E0347 +:101AD000421E0905822300AC0E05C91F05F5170B30 +:101AE0000B0B0B0800F8030905202307070707075E +:101AF0000708007A1E0600942205601F062C0A00C3 +:101B000036170600E5160A0093170A2C0A009317E9 +:101B10000A009317009317FDCB01BECDFB19AF321E +:101B2000475C3D323A5C1801E7CDBF16FD340DFA33 +:101B30008A1CDF0600FE0D287AFE3A28EB21761B70 +:101B4000E54FE779D6CEDA8A1C4F21481A094E09AB +:101B500018032A745C7E2322745C01521BC54FFE5D +:101B600020300C21011C0600094E09E5DF05C9DF04 +:101B7000B9C28A1CE7C9CD541F3802CF14CD4D3BE2 +:101B80000020712A425CCB7C281421FEFF22455C98 +:101B90002A615C2BED5B595C1B3A445C1833CD6EBB +:101BA000193A445C2819A72043477EE6C078280FDD +:101BB000CFFFC1CD3025C82A555C3EC0A6C0AFFEC0 +:101BC00001CE0056235EED53455C235E2356EB1990 +:101BD0002322555CEB225D5C571E00FD360AFF1583 +:101BE000FD720DCA281B14CD8B192808CF16CD30D5 +:101BF00025C0C1C1CD5D3B28BAFE3ACA281BC38AA5 +:101C00001C0F1D4B09670B7B8E71B481CFCDDE1C81 +:101C1000BFC1CCEE1BEB2A745C4E2346EBC5C9CD8D +:101C2000B228FD3637003008FDCB37CE2018CF0163 +:101C3000CC9629FDCB0176200DAFCD3025C4F12BFC +:101C400021715CB677EBED43725C224D5CC9C1CD6E +:101C5000561CCDEE1BC93A3B5CF5CDFB24F1FD567D +:101C600001AAE6402024CB7AC2FF2AC9CDB228F5CA +:101C700079F69F3C2014F118A9E7CD821CFE2C2098 +:101C800009E7CDFB24FDCB0176C0CF0BCDFB24FDB6 +:101C9000CB0176C818F4FDCB017EFDCB0286C44D86 +:101CA0000DF13A745CD613CDFC21CDEE1B2A8F5C6E +:101CB000228D5C21915C7E07AEE6AAAE77C9CD305D +:101CC000252813FDCB0286CD4D0D21905C7EF6F8C4 +:101CD00077FDCB57B6DFCDE221189FC30506FE0D79 +:101CE0002804FE3A209CCD3025C8EFA038C9CF0883 +:101CF000C1CD3025280AEF0238EBCDE934DAB31B29 +:101D0000C3291BFECD2009E7CD821CCDEE1B180692 +:101D1000CDEE1BEFA138EFC00201E00138CDFF2A64 +:101D200022685C2B7ECBFE010600090738060E0DEB +:101D3000CD551623E5EF020238E1EB0E0AEDB02A8D +:101D4000455CEB732372FD560D142372CDDA1DD062 +:101D5000FD46382A455C22425C3A475CED44572AEE +:101D60005D5C1EF3C5ED4B555CCD861DED43555CAA +:101D7000C13811E7F620B82803E718E8E73E0192DA +:101D800032445CC9CF117EFE3A2818237EE6C03764 +:101D9000C046234EED43425C234E2346E509444DA5 +:101DA000E11600C5CD8B19C1D018E0FDCB374EC26E +:101DB0002E1C2A4D5CCB7E281F2322685CEFE0E2BC +:101DC0000FC00238CDDA1DD82A685C110F00195EE9 +:101DD00023562366EBC3731ECF00EFE1E0E236002B +:101DE00002010337000438A7C93837C9E7CD1F1CE3 +:101DF000CD30252829DF225F5C2A575C7EFE2C2807 +:101E0000091EE4CD861D3002CF0DCD7700CD561CC6 +:101E1000DF22575C2A5F5CFD362600CD7800DFFEAE +:101E20002C28C9CDEE1BC9CD3025200BCDFB24FEBF +:101E30002CC4EE1BE718F53EE447EDB9110002C3D0 +:101E40008B19CD991E6069CD6E192B22575CC9CDB7 +:101E5000991E78B12004ED4B785CED43765CC92A7D +:101E60006E5CFD5636180CCD991E606916007CFE1E +:101E7000F0302C22425CFD720AC9CD851EED79C975 +:101E8000CD851E02C9CDD52D38152802ED44F5CDDE +:101E9000991EF1C9CDD52D1803CDA22D3801C8CF7B +:101EA0000ACD671E010000CD451E1803CD991E788E +:101EB000B12004ED4BB25CC5ED5B4B5C2A595C2B49 +:101EC000CDE519CD6B0D2A655C11320019D1ED52AB +:101ED00030082AB45CA7ED523002CF15EB22B25C79 +:101EE000D1C1363E2BF9C5ED733D5CEBE9D1FD6602 +:101EF0000D24E333ED4B455CC5E5ED733D5CD5CD7D +:101F0000671E0114002A655C09380AEB215000198C +:101F10003803ED72D82E03C35500010000CD051F14 +:101F2000444DC9C1E1D17AFE3E280B3BE3EBED7392 +:101F30003D5CC5C3731ED5E5CF06CD991E760B78E3 +:101F4000B1280C78A13C200103FDCB016E28EEFDE9 +:101F5000CB01AEC93E7FDBFE1FD83EFEDBFE1FC9B4 +:101F6000CD302528053ECEC3391EFDCB01F6CD8DE3 +:101F70002C3016E7FE242005FDCB01B6E7FE282015 +:101F80003CE7FE292820CD8D2CD28A1CEBE7FE24CD +:101F90002002EBE7EB010600CD55162323360EFE9B +:101FA0002C2003E718E0FE292013E7FE3D200EE772 +:101FB0003A3B5CF5CDFB24F1FDAE01E640C28A1C44 +:101FC000CDEE1BCD3025E1C8E93E0318023E02CD1F +:101FD0003025C40116CD4D0DCDDF1FCDEE1BC9DF61 +:101FE000CD4520280DCD4E2028FBCDFC1FCD4E2009 +:101FF00028F3FE29C8CDC31F3E0DD7C9DFFEAC2094 +:102000000DCD791CCDC31FCD07233E161810FEAD94 +:102010002012E7CD821CCDC31FCD991E3E17D77964 +:10202000D778D7C9CDF221D0CD7020D0CDFB24CD2B +:10203000C31FFDCB0176CCF12BC2E32D78B10BC8C9 +:102040001A13D718F7FE29C8FE0DC8FE3AC9DFFEDD +:102050003B2814FE2C200ACD3025280B3E06D7182D +:1020600006FE27C0CDF51FE7CD45202001C1BFC921 +:10207000FE2337C0E7CD821CA7CDC31FCD941EFE23 +:1020800010D20E16CD0116A7C9CD302528083E0165 +:10209000CD0116CD6E0DFD360201CDC120CDEE1B5A +:1020A000ED4B885C3A6B5CB838030E2147ED4388F2 +:1020B0005C3E1990328C5CFDCB0286CDD90DC36E8F +:1020C0000DCD4E2028FBFE28200EE7CDDF1FDFFEC2 +:1020D00029C28A1CE7C3B221FECA2011E7CD1F1C0A +:1020E000FDCB37FEFDCB0176C28A1C180DCD8D2CA1 +:1020F000D2AF21CD1F1CFDCB37BECD3025CAB221BA +:10210000CDBF1621715CCBB6CBEE010100CB7E209A +:102110000B3A3B5CE64020020E03B677F7360D79AA +:102120000F0F30053E22122B77225B5CFDCB377EF2 +:10213000202C2A5D5CE52A3D5CE5213A21E5FDCBBA +:1021400030662804ED733D5C2A615CCDA711FD3635 +:1021500000FFCD2C0FFDCB01BECDB9211803CD2C36 +:102160000FFD362200CDD621200ACD1D11ED4B8268 +:102170005CCDD90D21715CCBAECB7ECBBE201CE1FA +:10218000E1223D5CE1225F5CFDCB01FECDB9212A5D +:102190005F5CFD362600225D5C18172A635CED5BF0 +:1021A000615C37ED52444DCDB22ACDFF2A1803CDE4 +:1021B000FC1FCD4E20CAC120C92A615C225D5CDFB4 +:1021C000FEE2280C3A715CCD591CDFFE0DC8CF0B26 +:1021D000CD3025C8CF102A515C232323237EFE4B0C +:1021E000C9E7CDF221D8DFFE2C28F6FE3B28F2C34A +:1021F0008A1CFED9D8FEDF3FD8F5E7F1D6C9F5CD68 +:10220000821CF1A7CDC31FF5CD941E57F1D77AD705 +:10221000C9D611CE00281DD602CE002856FE017A5E +:1022200006012004070706044F7AFE0230167921C2 +:10223000915C18387A0607380507070706384F7A81 +:10224000FE0A3802CF13218F5CFE08380B7E280768 +:10225000B02FE6242801784F79CD6C223E07BA9F33 +:10226000CD6C220707E650473E08BA9FAEA0AE7776 +:102270002378C99F7A0F068020030F06404F7AFE0D +:10228000082804FE0230BD79218F5CCD6C22790FC5 +:102290000F0F18D8CD941EFE0830A9D3FE070707EC +:1022A000CB6F2002EE0732485CC93EAF90DAF924CA +:1022B00047A71F371FA71FA8E6F8A86779070707D2 +:1022C000A8E6C7A807076F79E607C9CD0723CDAAF7 +:1022D0002247047E0710FDE601C3282DCD0723CD3C +:1022E000E522C34D0DED437D5CCDAA2247043EFEA1 +:1022F0000F10FD477EFD4E57CB412001A0CB512052 +:1023000002A82F77C3DB0BCD142347C5CD14235967 +:10231000C1514FC9CDD52DDAF9240E01C80EFFC920 +:10232000DFFE2CC28A1CE7CD821CCDEE1BEF2A3DBE +:10233000387EFE813005EF023818A1EFA3383683CE +:10234000EFC50238CD7D24C5EF31E104387EFE8033 +:102350003008EF020238C1C3DC22EFC201C0020321 +:1023600001E00FC00131E00131E0A0C10238FD34CD +:1023700062CD941E6FE5CD941EE167227D5CC1C3E2 +:102380002024DFFE2C2806CDEE1BC37724E7CD8268 +:102390001CCDEE1BEFC5A2041F3130300006023801 +:1023A000C37724C002C102312AE101E12A0FE0050E +:1023B0002AE0013D387EFE813007EF020238C37704 +:1023C00024CD7D24C5EF02E10105C1020131E10404 +:1023D000C2020131E104E2E5E003A204311FC502BB +:1023E00020C002C202C1E504E0E2040FE101C10223 +:1023F000E004E2E50403C22AE12A0F02381AFE8152 +:10240000C1DA7724C5EF01383A7D5CCD282DEFC0C5 +:102410000F01383A7E5CCD282DEFC50FE0E538C1BD +:1024200005283C1814EFE131E304E2E40403C1029F +:10243000E404E2E3040FC20238C5EFC002E10F3149 +:10244000383A7D5CCD282DEF03E0E20FC001E03883 +:102450003A7E5CCD282DEF0338CDB724C110C6EFEE +:10246000020201383A7D5CCD282DEF0301383A7E17 +:102470005CCD282DEF0338CDB724C34D0DEF3128A7 +:102480003432000105E501052A38CDD52D3806E6A0 +:10249000FCC60430023EFCF5CD282DEFE5010531E8 +:1024A0001FC40231A2041FC101C0023104310FA1B7 +:1024B000031BC30238C1C9CD072379B8300669D5DB +:1024C000AF5F1807B1C86841D5160060781F85381E +:1024D00003BC3807944FD9C1C518044FD5D9C12AB8 +:1024E0007D5C788447793C85380D280D3D4FCDE5DE +:1024F00022D97910D9D1C928F3CF0ADF0600C54FF8 +:10250000219625CDDC1679D2842606004E09E9CD28 +:10251000740003FE0DCA8A1CFE2220F3CD7400FE57 +:1025200022C9E7FE282006CD791CDFFE29C28A1CBD +:10253000FDCB017EC9CD07232A365C110001197934 +:102540000F0F0FE6E0A85F79E618EE40570660C56A +:10255000D5E51AAE28043C201A3D4F060714231A6D +:10256000AEA9200F10F7C1C1C13E8090010100F754 +:1025700012180AE111080019D1C110D348C3B22AB8 +:10258000CD0723790F0F0F4FE6E0A86F79E603EE32 +:1025900058677EC3282D221C284F2EF22B12A856D6 +:1025A000A557A784A68FC4E6AABFABC7A9CE00E7EC +:1025B000C3FF24DF23E5010000CD0F25201BCD0F35 +:1025C0002528FBCD30252811F7E1D57E231213FEF7 +:1025D0002220F87E23FE2228F20BD1213B5CCBB6D1 +:1025E000CB7EC4B22AC31227E7CDFB24FE29C28AC0 +:1025F0001CE7C31227C3BD27CD30252828ED4B7615 +:102600005CCD2B2DEFA10F34371604348041000030 +:10261000803202A1033138CDA22DED43765C7EA736 +:102620002803D610771809CD30252804EFA33834B5 +:10263000E7C3C326015A10E7FE23CA0D27213B5CDE +:10264000CBB6CB7E281FC36C3B0E002013CD1E03E0 +:10265000300E155FCD3303F5010100F7F1120E01C5 +:102660000600CDB22AC31227CD2225C43525E7C3E3 +:10267000DB25CD2225C48025E71848CD2225C4CBF3 +:1026800022E7183FCD882C3056FE41303CCD302516 +:102690002023CD9B2CDF010600CD551623360E23BB +:1026A000EB2A655C0E05A7ED4222655CEDB0EB2BD5 +:1026B000CD7700180EDF237EFE0E20FA23CDB43333 +:1026C000225D5CFDCB01F61814CDB228DA2E1CCCAD +:1026D00096293A3B5CFEC0380423CDB4331833014D +:1026E000DB09FE2D2827011810FEAE2820D6AFDA10 +:1026F0008A1C01F004FE142814D28A1C0610C6DCC1 +:102700004FFEDF3002CBB1FEEE3802CBB9C5E7C3D6 +:10271000FF24DFFE28200CFDCB01762017CD522AA6 +:10272000E718F006004F219527CDDC1630064E2124 +:10273000ED260946D17AB8383AA7CA1800C5213B18 +:102740005C7BFEED2006CB7620021E99D5CD302590 +:1027500028097BE63F47EF3B3818097BFDAE01E6D1 +:1027600040C28A1CD1213B5CCBF6CB7B2002CBB68E +:10277000C118C1D579FDCB01762015E63FC6084FBB +:10278000FE102004CBF1180838D7FE172802CBF929 +:10279000C5E7C3FF242BCF2DC32AC42FC55EC63D7A +:1027A000CE3ECC3CCDC7C9C8CAC9CBC5C7C6C80078 +:1027B0000608080A020305050505050506CD3025AE +:1027C0002035E7CD8D2CD28A1CE7FE24F52001E7C9 +:1027D000FE282012E7FE292810CDFB24DFFE2C2046 +:1027E00003E718F5FE29C28A1CE7213B5CCBB6F152 +:1027F0002802CBF6C31227E7E6DF47E7D6244F20AF +:1028000001E7E7E52A535C2B11CE00C5CD861DC13B +:102810003002CF18E5CDAB28E6DFB82008CDAB28D5 +:10282000D624B9280CE12B110002C5CD8B19C11893 +:10283000D7A7CCAB28D1D1ED535D5CCDAB28E5FE5D +:10284000292842237EFE0E164028072BCDAB2823D5 +:10285000160023E5D5CDFB24F1FDAE01E640202B8B +:10286000E1EB2A655C010500ED4222655CEDB0EB11 +:102870002BCDAB28FE29280DE5DFFE2C200DE7E14E +:10288000CDAB2818BEE5DFFE292802CF19D1EB22F7 +:102890005D5C2A0B5CE3220B5CD5E7E7CDFB24E112 +:1028A000225D5CE1220B5CE7C31227237EFE213808 +:1028B000FAC9FDCB01F6DFCD8D2CD28A1CE5E61FCF +:1028C0004FE7E5FE282828CBF1FE242811CBE9CDDF +:1028D000882C300FCD882C3016CBB1E718F6E7FDE9 +:1028E000CB01B63A0C5CA72806CD3025C251294150 +:1028F000CD3025200879E6E0CBFF4F18372A4B5C16 +:102900007EE67F282DB920221787F23F293830D163 +:10291000D5E5231A13FE2028FAF620BE28F4F68007 +:10292000BE20061ACD882C3015E1C5CDB819EBC1F3 +:1029300018CECBF8D1DFFE282809CBE8180DD1D16D +:10294000D1E5DFCD882C3003E718F8E1CB10CB7050 +:10295000C92A0B5C7EFE29CAEF287EF66047237EDB +:10296000FE0E28072BCDAB2823CBA878B92812233D +:1029700023232323CDAB28FE29CAEF28CDAB28186B +:10298000D9CB69200C23ED5B655CCDC033EB2265B0 +:102990005CD1D1AF3CC9AF47CB79204BCB7E200E69 +:1029A0003C234E234623EBCDB22ADFC3492A2323FF +:1029B0002346CB71280A0528E8EBDFFE282061EBCF +:1029C000EB1824E5DFE1FE2C2820CB792852CB71CF +:1029D0002006FE29203CE7C9FE29286CFECC2032C7 +:1029E000DF2B225D5C185E210000E5E7E179FEC087 +:1029F0002009DFFE292851FECC28E5C5E5CDEE2AC9 +:102A0000E3EBCDCC2A38190BCDF42A09D1C110B390 +:102A1000CB792066E5CB712013424BDFFE292802DB +:102A2000CF02E7E1110500CDF42A09C9CDEE2AE372 +:102A3000CDF42AC10923424BEBCDB12ADFFE292870 +:102A400007FE2C20DBCD522AE7FE2828F8FDCB011B +:102A5000B6C9CD3025C4F12BE7FE292850D5AFF5F6 +:102A6000C5110100DFE1FECC2817F1CDCD2AF550CC +:102A700059E5DFE1FECC2809FE29C28A1C626B18E9 +:102A800013E5E7E1FE29280CF1CDCD2AF5DF6069D9 +:102A9000FE2920E6F1E3192BE3A7ED5201000038EF +:102AA0000723A7FA202A444DD1FDCB01B6CD30250E +:102AB000C8AFFDCB01B6C5CDA933C12A655C77236C +:102AC000732372237123702322655CC9AFD5E5F5AA +:102AD000CD821CF1CD30252812F5CD991ED178B1CB +:102AE000372805E1E5A7ED427ADE00E1D1C9EB2305 +:102AF0005E2356C9CD3025C8CDA930DA151FC92AA5 +:102B00004D5CFDCB374E285E01050003237EFE2081 +:102B100028FA300BFE103811FE16300D2318EDCDBB +:102B2000882C38E7FE24CAC02B792A595C2BCD5556 +:102B3000162323EBD52A4D5C1BD606472811237E8E +:102B4000FE2138FAF620131210F4F680123EC02A45 +:102B50004D5CAEF620E1CDEA2BE5EF0238E1010550 +:102B600000A7ED421840FDCB01762806110600199A +:102B700018E72A4D5CED4B725CFDCB374620307870 +:102B8000B1C8E5F7D5C5545D233620EDB8E5CDF1E4 +:102B90002BE1E3A7ED42093002444DE3EB78B12885 +:102BA00002EDB0C1D1E1EB78B1C8D5EDB0E1C92BF0 +:102BB0002B2B7EE5C5CDC62BC1E1030303C3E8196A +:102BC0003EDF2A4D5CA6F5CDF12BEB09C52B224D3E +:102BD0005C0303032A595C2BCD55162A4D5CC1C5F5 +:102BE00003EDB8EB23C1702B71F12B772A595C2BC5 +:102BF000C92A655C2B462B4E2B562B5E2B7E2265FD +:102C00005CC9CDB228C28A1CCD30252008CBB1CDFD +:102C10009629CDEE1B3808C5CDB819CDE819C1CB22 +:102C2000F90600C5210100CB7120022E05EBE72635 +:102C3000FFCDCC2ADA202AE1C524E56069CDF42A4B +:102C4000EBDFFE2C28E8FE2920BBE7C179682600CF +:102C500023232919DA151FD5C5E5444D2A595C2BC4 +:102C6000CD55162377C10B0B0B23712370C178232D +:102C700077626B1B3600CB7128023620C1EDB8C1DC +:102C8000702B712B3D20F8C9CD1B2D3FD8FE413F45 +:102C9000D0FE5BD8FE613FD0FE7BC9FEC420191177 +:102CA0000000E7D631CE00200AEB3FED6ADAAD3105 +:102CB000EB18EF424BC32B2DFE2E280FCD3B2DFEE4 +:102CC0002E2028E7CD1B2D3822180AE7CD1B2DDA40 +:102CD0008A1CEFA038EFA1C00238DFCD222D380BBF +:102CE000EFE0A405C0040F38E718EFFE452803FE07 +:102CF00065C006FFE7FE2B2805FE2D200204E7CD68 +:102D00001B2D38CBC5CD3B2DCDD52DC1DAAD31A78F +:102D1000FAAD31042802ED44C34F2DFE30D8FE3AFF +:102D20003FC9CD1B2DD8D6304F0600FD213A5CAFF0 +:102D30005F514847CDB62AEF38A7C9F5EFA038F163 +:102D4000CD222DD8EF01A4040F38CD740018F1075F +:102D50000F30022F3CF521925CCD0B35EFA438F1FA +:102D6000CB3F300DF5EFC1E0000404330205E1383C +:102D7000F12808F5EF310438F118E5EF0238C923DE +:102D80004E237EA9915F237E89A957C90E00E5369F +:102D9000002371237BA99177237A89A977233600B1 +:102DA000E1C9EF387EA72805EFA20F2738EF0238D8 +:102DB000E5D5EB46CD7F2DAF90CB79424B7BD1E172 +:102DC000C957179F5F4FAF47CDB62AEF34EF1A2090 +:102DD0009A85042738CDA22DD8F505042803F137AC +:102DE000C9F1C9EF3136000B3137000D02383E30E2 +:102DF000D7C92A383E2DD7EFA0C3C4C50238D9E5BC +:102E0000D9EF3127C203E201C202387EA72047CDA5 +:102E10007F2D06107AA72006B32809530608D5D9B6 +:102E2000D1D91857EFE2387ED67ECDC12D573AACB6 +:102E30005C9232AC5C7ACD4F2DEF3127C103E13883 +:102E4000CDD52DE532A15C3D179F3C21AB5C7723AE +:102E50008677E1C3CF2ED680FE1C3813CDC12DD688 +:102E6000074721AC5C867778ED44CD4F2D1892EB67 +:102E7000CDBA2FD9CBFA7DD9D68047CB23CB12D967 +:102E8000CB13CB12D921AA5C0E057E8F27772B0D91 +:102E900020F810E7AF21A65C11A15C0609ED6F0ECA +:102EA000FFED6F20040D0C200A1213FD3471FD3468 +:102EB000720E00CB4028012310E73AAB5CD60938EC +:102EC0000AFD35713E04FDBE6F1841EF02E238EB9A +:102ED000CDBA2FD93E80952E00CBFAD9CDDD2FFD6E +:102EE0007E71FE083806D9CB12D918200100027B6A +:102EF000CD8B2F5F7ACD8B2F57C5D9C110F121A172 +:102F00005C79FD4E710977FD347118D3F521A15C10 +:102F1000FD4E7106000941F12B7ECE0077A72805F2 +:102F2000FE0A3F300810F1360104FD3472FD707165 +:102F3000EF0238D9E1D9ED4BAB5C21A15C78FE09F9 +:102F40003804FEFC3826A7CCEF15AF90FA522F4775 +:102F5000180C79A728037E230DCDEF1510F479A75F +:102F6000C8043E2ED73E3010FB4118E6501506012E +:102F7000CD4A2F3E45D74A79A7F2832FED444F3EE5 +:102F80002D18023E2BD70600C31B1AD56F26005DF5 +:102F9000542929192959194C7DD1C97E3600A7C851 +:102FA00023CB7ECBFE2BC8C501050009414F372B33 +:102FB0007E2FCE007710F879C1C9E5F54E2346770C +:102FC00023794EC5234E2346EB575ED52356235E09 +:102FD000D5D9D1E1C1D92356235EF1E1C9A7C8FEF5 +:102FE000213016C547D9CB2DCB1ACB1BD9CB1ACB49 +:102FF0001B10F2C1D0CD0430C0D9AF2E00575DD91F +:10300000110000C91CC014C0D91C200114D9C9EB7F +:10301000CD6E34EB1AB62026D523E5235E23562346 +:1030200023237E234E2346E1EB09EB8E0FCE0020B7 +:103030000B9F77237323722B2B2BD1C92BD1CD93CD +:1030400032D9E5D9D5E5CD9B2F47EBCD9B2F4FB896 +:1030500030037841EBF590CDBA2FCDDD2FF1E1773C +:10306000E5686119D9EBED4AEB7C8D6F1FADD9EBAB +:10307000E11F30083E01CDDD2F342823D97DE680C5 +:10308000D923772B281F7BED443F5F7A2FCE005743 +:10309000D97B2FCE005F7A2FCE0030071FD934CADC +:1030A000AD31D957D9AFC35531C506107C4D21007C +:1030B0000029380ACB1117300319380210F3C1C99F +:1030C000CDE934D823AECBFE2BC91AB62022D5E5E4 +:1030D000D5CD7F2DEBE341CD7F2D78A94FE1CDA953 +:1030E00030EBE1380A7AB320014FCD8E2DD1C9D112 +:1030F000CD9332AFCDC030D8D9E5D9D5EBCDC030E6 +:10310000EB385AE5CDBA2F78A7ED62D9E5ED62D953 +:1031100006211811300519D9ED5AD9D9CB1CCB1D70 +:10312000D9CB1CCB1DD9CB18CB19D9CB191F10E487 +:10313000EBD9EBD9C1E178812001A73D3F173F1FB3 +:10314000F246313068A73C20083806D9CB7AD9201E +:103150005C77D978D930157EA73E802801AFD9A2F7 +:10316000CDFB2F0777382E23772B18290620D9CBB4 +:103170007AD9201207CB13CB12D9CB13CB12D93566 +:1031800028D710EA18D717300CCD04302007D916ED +:1031900080D9342818E523D9D5D9C17817CB161F83 +:1031A00077237123722373E1D1D9E1D9C9CF05CD3A +:1031B0009332EBAFCDC03038F4EBCDC030D8D9E589 +:1031C000D9D5E5CDBA2FD9E56069D96168AF06DFF9 +:1031D000181017CB11D9CB11CB10D929D9ED6AD939 +:1031E0003810ED52D9ED52D9300F19D9ED5AD9A76F +:1031F0001808A7ED52D9ED52D93704FAD231F52883 +:10320000E15F51D95950F1CB18F1CB18D9C1E17810 +:1032100091C33D317EA7C8FE81300636003E20189E +:1032200051FE91201A2323233E80A62BB62B200388 +:103230003E80AE2B2036772336FF2B3E18183330D6 +:103240002CD52FC6912356235E2B2B0E00CB7A282C +:10325000010DCBFA0608908038045A160090280712 +:1032600047CB3ACB1B10FACD8E2DD1C97ED6A0F01C +:10327000ED44D5EB2B47CB38CB38CB38280536007F +:103280002B10FBE6072809473EFFCB2710FCA6774B +:10329000EBD1C9CD9632EB7EA7C0D5CD7F2DAF2324 +:1032A000772B7706917AA72008B342281053580647 +:1032B00089EB052930FCCB09CB1CCB1DEB2B732BE9 +:1032C000722B70D1C900B00040B000013000F1494C +:1032D0000FDAA240B0000A8F363C34A1330F30CA57 +:1032E00030AF3151381B3524353B353B353B353B11 +:1032F000353B353B3514302D353B353B353B353B88 +:10330000353B353B359C35DE35BC3445366E34694E +:1033100036DE357436B537AA37DA3733384338E214 +:10332000371337C436AF364A3892346A34AC34A5D2 +:1033300034B3341F36C9350135C033A0368636C69E +:10334000337A360635F9349B3683371432A2334F3D +:103350002D973249341B342D340F34CDBF3578329C +:10336000675CD9E3D9ED53655CD97E23E5A7F2808C +:103370003357E6600F0F0F0FC67C6F7AE61F180EEB +:10338000FE183008D901FBFF545D09D9076F11D72A +:10339000322600195E2356216533E3D5D9ED4B66FD +:1033A0005CC9F13A675CD918C3D5E5010500CD05C4 +:1033B0001FE1D1C9ED5B655CCDC033ED53655CC9E0 +:1033C000CDA933EDB0C9626BCDA933D9E5D9E3C539 +:1033D0007EE6C007074F0C7EE63F2002237EC650E4 +:1033E000123E059123130600EDB0C1E3D9E1D947A0 +:1033F000AF05C8121318FAA7C8F5D5110000CDC83B +:1034000033D1F13D18F24F0707814F060009C9D5A6 +:103410002A685CCD0634CDC033E1C9626BD9E521A1 +:10342000C532D9CDF733CDC833D9E1D9C9E5EB2AB7 +:10343000685CCD0634EBCDC033EBE1C906051A4E0E +:10344000EB1271231310F7EBC947CD5E33310FC078 +:1034500002A0C231E004E2C10338CDC633CD6233ED +:103460000F01C20235EEE10338C906FF1806CDE9A7 +:1034700034D806007EA7280B2378E680B6173F1FB6 +:10348000772BC9D5E5CD7F2DE178B12F4FCD8E2D8E +:10349000D1C9CDE934D8D511010023CB162B9F4FCC +:1034A000CD8E2DD1C9CD991EED781804CD991E0A67 +:1034B000C3282DCD991E212B2DE5C5C9CDF12B0B90 +:1034C00078B120231ACD8D2C3809D6903819FE15E5 +:1034D00030153C3D878787FEA8300CED4B7B5C8127 +:1034E0004F300104C32B2DCF09E5C5477E23B623FA +:1034F000B623B678C1E1C037C9CDE934D83EFF184C +:1035000006CDE9341805AF23AE2B07E53E0077233F +:10351000772317771F23772377E1C9EBCDE934EBC6 +:10352000D83718E7EBCDE934EBD0A718DEEBCDE9BF +:1035300034EBD0D51BAF121B12D1C978D608CB57AC +:1035400020013D0F3008F5E5CD3C34D1EBF1CB57F0 +:1035500020070FF5CD0F3018330FF5CDF12BD5C562 +:10356000CDF12BE17CB5E378200BB1C12804F13F0C +:103570001816F11813B1280D1A96380920ED0B13FF +:1035800023E32B18DFC1F1A7F5EFA038F1F5DC013B +:1035900035F1F5D4F934F10FD40135C9CDF12BD57E +:1035A000C5CDF12BE1E5D5C509444DF7CDB22AC112 +:1035B000E178B12802EDB0C1E178B12802EDB02A7E +:1035C000655C11FBFFE519D1C9CDD52D380E200C56 +:1035D000F5010100F7F112CDB22AEBC9CF0A2A5D3D +:1035E0005CE578C6E39FF5CDF12BD503F7E1ED530C +:1035F0005D5CD5EDB0EB2B360DFDCB01BECDFB24D4 +:10360000DFFE0D2007E1F1FDAE01E640C28A1C227B +:103610005D5CFDCB01FECDFB24E1225D5C18A001C9 +:103620000100F7225B5CE52A515CE53EFFCD011607 +:10363000CDE32DE1CD1516D12A5B5CA7ED52444DAB +:10364000CDB22AEBC9CD941EFE10D29F1E2A515C2A +:10365000E5CD0116CDE61501000030030CF712CDC3 +:10366000B22AE1CD1516C3BF35CDF12B78B12801B3 +:103670001AC3282DCDF12BC32B2DD9E521675C353D +:10368000E1200423D9C9D95E7B179F5719D9C913E3 +:10369000131A1B1BA720EFD923D9C9F1D9E3D9C924 +:1036A000EFC00231E00527E001C00403E038C9EFB4 +:1036B000313600043A38C9313AC003E00130000322 +:1036C000A10338C9EF3D34F138AA3B29043127C39F +:1036D00003310FA1038813365865669D786540A2B3 +:1036E0006032C9E721F7AF24EB2FB0B014EE7EBBF8 +:1036F0009458F13A7EF8CFE338CDD52D2007380322 +:10370000863009CF053807963004ED4477C9EF02BB +:10371000A038C9EF3D3137000438CF09A002387E08 +:103720003680CD282DEF34380003013134F04CCCF5 +:10373000CCCD0337000801A103013834EF0134F088 +:10374000317217F80401A203A2033134322004A21B +:10375000038C11AC140956DAA55930C55C90AA9EA9 +:10376000706F61A1CBDA96A4319FB4E7A0FE5CFC38 +:10377000EA1B43CA36EDA79C7E5EF06E238093045D +:103780000F38C9EF3D34EE22F9836E0431A20F27C2 +:1037900003310F310F312AA1033137C00004023841 +:1037A000C9A103013600021B38C9EF392AA103E081 +:1037B00000061B3303EF39313104310FA1038614A6 +:1037C000E65C1F0BA38F38EEE91563BB23EE920D69 +:1037D000CDEDF1235D1BEA0438C9EF311F0120054F +:1037E00038C9CD97327EFE81380EEFA11B0105311D +:1037F00036A30100061B3303EFA001313104310F62 +:10380000A1038C10B2130E55E48D5839BC5B98FDA2 +:103810009E003675A0DBE8B46342C4E6B50936BE47 +:10382000E936731B5DECD8DE63BEF061A1B30C0416 +:103830000F38C9EF313104A1031B28A10F05243132 +:103840000F38C9EF22A3031B38C9EF3130001EA285 +:1038500038EF0131300007250438C3C43602313057 +:103860000009A001370006A1010502A138C9DDE564 +:10387000FDCB01662803CD423ACDBF02DDE1C90E82 +:10388000FD16FF1EBF423E07ED79ED603E0EED795D +:10389000ED78F6F06FC9423E0EED7943ED69C9420D +:1038A0003E0EED79ED78C97DE6FE6F18E97DF601F3 +:1038B0006F18E310FEC9C50610CDB338C110F7C9A3 +:1038C000C5CD9F38C1E620280210F5C9C5CD9F3867 +:1038D000C1E620200210F5C9CD7F3806011805CDBC +:1038E0007F380604C5CD9F38C1E6202840AFC5F516 +:1038F000CDAD3806A3CDC0382031CDA7381802FF92 +:10390000FF062BCDB338CD9F38CB6F2804F1371885 +:1039100003F1373F1FF5CDAD380626CDB338CDA71F +:10392000380623CDB338F1C110C4C9F1C1CDAD38CB +:10393000AF32885B3C373FC9CD7F383A885BE68041 +:103940002057CD9F38E62028E43A885BA7200B3C1F +:1039500032885B3E4C32895B18423A895B3D328942 +:103960005B2039AF32885B32895B328A5BCDA73806 +:103970000621CDC03820B6CDAD380624CDCC3828B0 +:10398000ACCDA738060FCDB638CDDF38209FCBFFA2 +:10399000E6F032885BAFCB3FC9AF37C9AF3C37C920 +:1039A000CD38393A885B2FE6C0C0DD218A5B060539 +:1039B000C5CDD838C23A3ACB7F2821CDDF38207A1E +:1039C000C1C54FDD7E00CB40280CCB39CB39CB397C +:1039D000CB39E6F01802E60FB1DD7700C1CB40200D +:1039E00002DD2B10CB1E80DD21885B213F3A0603D0 +:1039F000DD7E00A62821CB7B2842C5F5781802FF82 +:103A0000FF3DCB27CB27CB27F60747F1CB27DA1390 +:103A10003A10F958C12025DD232310D4CB7B200791 +:103A20007BE6FC28021D1D3A8A5BE60828067BE639 +:103A30007FC6125F7BC65A5FAFC9C1C9AF3CC90F11 +:103A4000FFF21E803A785CE6012004CDA039C02147 +:103A5000005CCB7E200C7EFE5B380723352B2002DA +:103A600036FF7D21045CBD20E9CDAE3AC07B21004C +:103A70005CBE282AEB21045CBE2823CB7E2004EB0D +:103A8000CB7EC85F7723360A233A095CCB3F772386 +:103A9000CDD73A737B32085C213B5CCBEEC9233631 +:103AA0000A2335C03A0A5CCB3F77235E18E67B21B8 +:103AB000665BCB462806FE6D301AAFC9FE80301417 +:103AC000FE6C20F600000000000000000000000076 +:103AD00000000000AF3CC9E57BD65B16005F2166A5 +:103AE0005BCB46280521133B182521253BFE1138C9 +:103AF0001E21213BFE152817FE162813180300FF70 +:103B0000FFFE17280A21183BFE21300321133B1921 +:103B10005EE1C92E0D33323129282A2F2D3938374D +:103B20002B36353430A50DA6A7A8A9AA0B0C07097A +:103B30000A08ACADAEAFB0B1B2B3B4FDCB016620F4 +:103B400005AF114F15C9210F01E3C3005BFDCB0188 +:103B5000662005FDCB0A7EC921120118ECFDCB01C0 +:103B6000662004DFFE0DC921150118DDCD8E020E81 +:103B700000200DCD1E033008155FCD3303C357263B +:103B8000FDCB0166CA6026F3CDA039FB200CCDAE7B +:103B90003A2007CDD73A7BC357260E00C36026FED6 +:103BA000A3280CFEA42808D6A5D25F0BC3560BFD94 +:103BB000CB016628F211C93BD5D6A311D23B28030D +:103BC00011DA3B3E04F5C3170C37FDCB014EC0C3E1 +:103BD000030B53504543545255CD504C41D9C3016A +:103BE0003C00000000000000000000000000000099 +:103BF000000000000000000000000000000000FFC6 +:103C0000FFC3A039C3103CC3103CC3103CC3103CDD +:103C10003E7FDBFE1FD83EFEDBFE1FD83E07D3FEF5 +:103C20003E02CD0116AF323C5C3E16D7AFD7AFD7C0 +:103C30001E084350783DCB17CB17CB17823D328FF0 +:103C40005C218F3C4B7ED7230D20FA10E7431520D3 +:103C5000E3210048545D13AF7701FF0FEDB0EB1186 +:103C60000059010002EDB0F31170032E0701990015 +:103C70000B78B120FB7DEE106FD3FE1B7AB320EDE5 +:103C80000100000B78B120FB0B78B120FB18D91391 +:103C9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:103CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:103CB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:103CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:103CD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:103CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:103CF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:103D00000000000000000000001010101000100063 +:103D1000002424000000000000247E24247E2400CF +:103D200000083E283E0A3E0800626408102646004D +:103D3000001028102A443A0000081000000000007B +:103D400000040808080804000020101010102000CB +:103D5000000014083E081400000008083E0808008F +:103D60000000000000080810000000003E000000F5 +:103D700000000000001818000000020408102000D5 +:103D8000003C464A52623C000018280808083E00E1 +:103D9000003C42023C407E00003C420C02423C009F +:103DA00000081828487E0800007E407C02423C0043 +:103DB000003C407C42423C00007E0204081010009F +:103DC000003C423C42423C00003C42423E023C003D +:103DD0000000001000001000000010000010102073 +:103DE00000000408100804000000003E003E00002F +:103DF0000000100804081000003C420408000800FD +:103E0000003C4A565E403C00003C42427E4242003A +:103E1000007C427C42427C00003C424040423C00EC +:103E20000078444242447800007E407C40407E005E +:103E3000007E407C40404000003C42404E423C00FE +:103E40000042427E42424200003E080808083E000E +:103E50000002020242423C000044487048444200D2 +:103E60000040404040407E000042665A42424200CC +:103E7000004262524A464200003C424242423C00FA +:103E8000007C42427C404000003C4242524A3C009E +:103E9000007C42427C444200003C403C02423C00E8 +:103EA00000FE1010101010000042424242423C003E +:103EB000004242424224180000424242425A240038 +:103EC00000422418182442000082442810101000D8 +:103ED000007E040810207E00243C42427E424200C4 +:103EE000243C424242423C002442424242423C0084 +:103EF000001038541010100000000000000000FFF7 +:103F00000010080000000000000038043C443C00A1 +:103F10000020203C22223C0000001C2020201C000D +:103F20000004043C44443C000000384478403C0019 +:103F3000000C10181010100000003C44443C0438E1 +:103F40000040407844444400001000301010380015 +:103F50000004000404042418002028303028240021 +:103F60000010101010100C0000006854545454003D +:103F7000000078444444440000003844444438007D +:103F8000000078444478404000003C44443C04062F +:103F900000001C2020202000000038403804780059 +:103FA0000010381010100C00000044444444380045 +:103FB00000004444282810000000445454542800B1 +:103FC000000044281028440000004444443C0438C5 +:103FD00000007C0810207C00240038043C443C0095 +:103FE0002400384444443800240044444444380005 +:103FF000003C424C42425C403C4299A1A199423C67 +:00000001FF diff --git a/Cobra_MiST/rtl/roms/deutsch.rom b/Cobra_MiST/rtl/roms/deutsch.rom new file mode 100644 index 00000000..eeeee112 Binary files /dev/null and b/Cobra_MiST/rtl/roms/deutsch.rom differ diff --git a/Cobra_MiST/rtl/roms/groot.hex b/Cobra_MiST/rtl/roms/groot.hex new file mode 100644 index 00000000..e0e2d2ae --- /dev/null +++ b/Cobra_MiST/rtl/roms/groot.hex @@ -0,0 +1,1025 @@ +:10000000F3AF11FFFFC3AA042A5D5C225F5C1843B3 +:10001000C3F215FFFFFFFFFF2A5D5C7ECD7D00D0A0 +:10002000CD740018F7FFFFFFC35B33FFFFFFFFFF37 +:10003000C52A615CE5C39E16F5E52A785C23227823 +:100040005C7CB52003FD3440C5D5CDBF02D1C1E1F4 +:10005000F1FBC9E16EFD7500ED7B3D5CC3C516FF8C +:10006000FFFFFFFFFFFFF3AFD3FE3E3FED472AB296 +:100070005CC319122A5D5C23225D5C7EC9FE21D01F +:10008000FE0DC8FE10D8FE183FD823FE16380123F7 +:1000900037225D5CC9BF524EC4494E4B4559A450EE +:1000A000C946CE504F494ED453435245454EA441C4 +:1000B0005454D241D45441C256414CA4434F44C538 +:1000C0005641CC4C45CE5349CE434FD35441CE41FB +:1000D00053CE4143D34154CE4CCE4558D0494ED453 +:1000E0005351D25347CE4142D3504545CB49CE55CB +:1000F00053D2535452A4434852A44E4FD44249CEF3 +:100100004FD2414EC43CBD3EBD3CBE4C494EC55491 +:100110004845CE54CF535445D04445462046CE435F +:1001200041D4464F524D41D44D4F56C5455241538F +:10013000C54F50454E20A3434C4F534520A34D453A +:100140005247C55645524946D9424545D043495282 +:10015000434CC5494ECB50415045D2464C4153C803 +:100160004252494748D4494E56455253C54F5645C9 +:10017000D24F55D44C5052494ED44C4C4953D45381 +:10018000544FD0524541C4444154C1524553544F39 +:1001900052C54E45D7424F524445D2434F4E544923 +:1001A0004E55C54449CD5245CD464FD2474F2054B8 +:1001B000CF474F205355C2494E5055D44C4F41C4A0 +:1001C0004C4953D44C45D450415553C54E4558D451 +:1001D000504F4BC55052494ED4504C4FD45255CE2F +:1001E000534156C552414E444F4D495AC549C643E5 +:1001F0004CD3445241D7434C4541D25245545552B9 +:10020000CE434F50D942485936355447564E4A5539 +:1002100037345246434D4B4938334544580E4C4FC2 +:10022000393257535A200D5030315141E3C4E0E484 +:10023000B4BCBDBBAFB0B1C0A7A6BEADB2BAE5A558 +:10024000C2E1B3B9C1B87EDCDA5CB77B7DD8BFAEA2 +:10025000AAABDDDEDF7FB5D67CD55DDBB6D95BD75B +:100260000C07060405080A0B090FE22A3FCDC8CC8B +:10027000CB5EAC2D2B3D2E2C3B22C73CC33EC52F65 +:10028000C960C63AD0CEA8CAD3D4D1D2A9CF2E2F16 +:1002900011FFFF01FEFEED782FE61F280E677D148B +:1002A000C0D608CB3C30FA535F20F42DCB0038E6A3 +:1002B0007A3CC8FE28C8FE19C87B5A57FE18C9CD1B +:1002C0008E02C021005CCB7E200723352B20023616 +:1002D000FF7D21045CBD20EECD1E03D021005CBE5D +:1002E000282EEB21045CBE2827CB7E2004EBCB7E9E +:1002F000C85F77233605233A095C7723FD4E07FD57 +:100300005601E5CD3303E17732085CFDCB01EEC940 +:100310002336052335C03A0A5C77237E18EA421655 +:10032000007BFE27D0FE182003CB78C021050219E0 +:100330007E37C97BFE3A382F0DFA4F032803C64F8C +:10034000C921EB010428032105021600197EC921E9 +:100350002902CB4028F4CB5A280AFDCB305EC004DA +:10036000C0C620C9C6A5C9FE30D80DFA9D03201904 +:10037000215402CB6828D3FE383007D62004C8C6E3 +:1003800008C9D63604C8C6FEC9213002FE3928BACB +:10039000FE3028B6E607C68004C8EE0FC904C8CBF5 +:1003A0006821300220A4D610FE222806FE20C03E7E +:1003B0005FC93E40C9F37DCB3DCB3D2FE6034F06E1 +:1003C00000DD21D103DD093A485CE6380F0F0FF656 +:1003D00008000000040C0D20FD0E3F05C2D603EE00 +:1003E00010D3FE444FCB6720097AB32809794D1BFF +:1003F000DDE94D0CDDE9FBC9EF3127C00334EC6CBE +:10040000981FF504A10F3821925C7EA7205E234E31 +:10041000234678179FB9205423BE205078C63CF25B +:100420002504E26C0406FA04D60C30FBC60CC52188 +:100430006E04CD0634CDB433EF0438F18677EFC0C7 +:10044000023138CD941EFE0B3022EFE004E0348000 +:1004500043559F8001053435710338CD991EC5CDB4 +:10046000991EE150597AB3C81BC3B503CF0A89025C +:10047000D01286890A9760758912D5171F891B903B +:1004800041028924D053CA892E9D36B18938FF494B +:100490003E8943FF6A73894FA70054895C000000BE +:1004A000896914F6248976F110053E3FD3DB3EFFBF +:1004B000D3FB3E80D3FB3E02D3BBAFC3CB1109CBF2 +:1004C000FEC9213F05E521801FCB7F280321980C21 +:1004D0000813DD2BF33E024710FED3FEEE0F06A4F9 +:1004E0002D20F50525F2D804062F10FED3FE3E0D73 +:1004F000063710FED3FE010E3B086FC307057AB323 +:10050000280CDD6E007CAD673E0137C325056C18F5 +:10051000F479CB7810FE3004064210FED3FE063E7E +:1005200020EF05AF3CCB15C214051BDD2306313E81 +:100530007FDBFE1FD07A3CC2FE04063B10FEC9F5ED +:100540003A485CE6380F0F0FD3FE3E7FDBFE1FFB01 +:100550003802CF0CF1C9140815F33E0FD3FE213F2A +:1005600005E5DBFE1FE620F6024FBFC0CDE70530F4 +:10057000FA21150410FE2B7CB520F9CDE30530EBF4 +:10058000069CCDE30530E43EC6B830E02420F106F9 +:10059000C9CDE70530D578FED430F4CDE705D07964 +:1005A000EE034F260006B0181F082007300FDD7538 +:1005B00000180FCB11ADC0791F4F131807DD7E0057 +:1005C000ADC0DD231B0806B22E01CDE305D03ECB26 +:1005D000B8CB1506B0D2CA057CAD677AB320CA7C09 +:1005E000FE01C9CDE705D03E163D20FDA704C83E5B +:1005F0007FDBFE1FD0A9E62028F3792F4FE607F610 +:1006000008D3FE37C9F13A745CD6E032745CCD8C05 +:100610001CCD3025283C0111003A745CA728020E3D +:1006200022F7D5DDE1060B3E20121310FCDD36016A +:10063000FFCDF12B21F6FF0B0903300F3A745CA7B5 +:100640002002CF0E78B1280A010A00DDE5E123EB94 +:10065000EDB0DFFEE420493A745CFE03CA8A1CE771 +:10066000CDB228CBF9300B2100003A745C3D28153F +:10067000CF01C28A1CCD30252818237EDD770B23BD +:100680007EDD770C23DD710E3E01CB7128013CDD50 +:100690007700EBE7FE2920DAE7CDEE1BEBC35A0724 +:1006A000FEAA201F3A745CFE03CA8A1CE7CDEE1B2B +:1006B000DD360B00DD360C1B210040DD750DDD74D1 +:1006C0000E184DFEAF204F3A745CFE03CA8A1CE739 +:1006D000CD4820200C3A745CA7CA8A1CCDE61C18B1 +:1006E0000FCD821CDFFE2C280C3A745CA7CA8A1C32 +:1006F000CDE61C1804E7CD821CCDEE1BCD991EDD86 +:10070000710BDD700CCD991EDD710DDD700E606911 +:10071000DD3600031844FECA2809CDEE1BDD360E77 +:100720008018173A745CA7C28A1CE7CD821CCDEEF4 +:100730001BCD991EDD710DDD700EDD3600002A59CE +:100740005CED5B535C37ED52DD750BDD740C2A4BB1 +:100750005CED52DD750FDD7410EB3A745CA7CA7066 +:1007600009E5011100DD09DDE5111100AF37CD56B6 +:1007700005DDE130F23EFECD0116FD3652030E805E +:10078000DD7E00DDBEEF20020EF6FE0430D911C082 +:1007900009C5CD0A0CC1DDE5D121F0FF19060A7E9D +:1007A0003C200379804F131ABE2320010CD710F68A +:1007B000CB7920B33E0DD7E1DD7E00FE03280C3A55 +:1007C000745C3DCA0808FE02CAB608E5DD6EFADDB3 +:1007D00066FBDD5E0BDD560C7CB5280DED52382630 +:1007E0002807DD7E00FE03201DE17CB52006DD6EBE +:1007F0000DDD660EE5DDE13A745CFE02372001A7EF +:100800003EFFCD5605D8CF1ADD5E0BDD560CE57CDC +:10081000B52006131313EB180CDD6EFADD66FBEB47 +:1008200037ED52380911050019444DCD051FE1DDA2 +:100830007E00A7283E7CB528132B462B4E2B0303A6 +:1008400003DD225F5CCDE819DD2A5F5C2A595C2B51 +:10085000DD4E0BDD460CC5030303DD7EFDF5CD55F6 +:100860001623F177D12373237223E5DDE1373EFFB1 +:10087000C30208EB2A595C2BDD225F5CDD4E0BDDE9 +:10088000460CC5CDE519C1E5C5CD5516DD2A5F5C21 +:1008900023DD4E0FDD461009224B5CDD660E7CE643 +:1008A000C0200ADD6E0D22425CFD360A00D1DDE17A +:1008B000373EFFC30208DD4E0BDD460CC503F7369D +:1008C00080EBD1E5E5DDE1373EFFCD0208E1ED5BF0 +:1008D000535C7EE6C020191A13BE2320021ABE1BE9 +:1008E0002B3008E5EBCDB819E118ECCD2C0918E256 +:1008F0007E4FFE80C8E52A4B5C7EFE802825B92805 +:1009000008C5CDB819C1EB18F0E6E0FEA02012D161 +:10091000D5E523131ABE20061730F7E11803E118B6 +:10092000E03EFFD1EB3C37CD2C0918C42010082243 +:100930005F5CEBCDB819CDE819EB2A5F5C0808D5F0 +:10094000CDB819225F5C2A535CE3C50838072BCD6C +:100950005516231803CD551623C1D1ED53535CED25 +:100960005B5F5CC5D5EBEDB0E1C1D5CDE819D1C970 +:10097000E53EFDCD0116AF11A109CD0A0CFDCB025C +:10098000EECDD415DDE5111100AFCDC204DDE106D9 +:10099000327610FDDD5E0BDD560C3EFFDDE1C3C29D +:1009A0000480537461727420746170652C207468C3 +:1009B000656E20707265737320616E79206B657946 +:1009C000AE0D50726F6772616D3AA00D4E756D621B +:1009D00065722061727261793AA00D43686172613B +:1009E000637465722061727261793AA00D42797404 +:1009F00065733AA0C32C39FE20D2D90AFE063869A5 +:100A0000FE183065210B0A5F1600195E19E5C30355 +:100A10000B4E57102954535237504F5F5E5D5C5B4D +:100A20005A54530C3E22B92011FDCB014E2009042B +:100A30000E023E19B82003050E21C3D90D3A915C70 +:100A4000F5FD3657013E20CD650BF1C32039C9FDB8 +:100A5000CB014EC2CD0E0E21CD550C05C3D90DCD07 +:100A6000030B793D3DE610185A3E3F186C11870A7A +:100A7000320F5C180B116D0A180311870A320E5CD5 +:100A80002A515C732372C911F409CD800A2A0E5CC5 +:100A9000577DFE16DA11222029444A3E1F91380C58 +:100AA000C6024FFDCB014E20163E1690DA9F1E3C2B +:100AB0004704FDCB0246C2550CFDBE31DA860CC39D +:100AC000D90D7CCD030B813DE61FC857FDCB01C678 +:100AD0003E20CD3B0C1520F8C9CD240BFDCB014E9B +:100AE000201AFDCB02462008ED43885C22845CC9B5 +:100AF000ED438A5CED43825C22865CC9FD7145FD55 +:100B00007546C9FDCB014E2014ED4B885C2A845CF0 +:100B1000FDCB0246C8ED4B8A5C2A865CC9FD4E457A +:100B2000CD2639C9FE80383DFE90302647CD380BA2 +:100B3000CD030B11925C184721925CCD3E0BCB1874 +:100B40009FE60F4FCB189FE6F0B10E0477230D20E0 +:100B5000FBC9D6A53009C615C5ED4B7B5C180BCD7E +:100B6000100CC3030BC5ED4B365CEB213B5CCB8615 +:100B7000FE202002CBC626006F29292909C1EB7966 +:100B80003D3E21200E054FFDCB014E2806D5CDCD93 +:100B90000ED179B9D5CC550CD1C5E53A915C06FF9B +:100BA0001F3801041F1F9F4F3E08A7FDCB014E2891 +:100BB00005FDCB30CE37EB081AA0AEA912083813CA +:100BC00014233D20F2EB25FDCB014ECCDB0BE1C124 +:100BD0000D23C9083E20835F0818E67C0F0F0FE63F +:100BE00003F65867ED5B8F5C7EABA2ABFDCB57760F +:100BF0002808E6C7CB572002EE38FDCB57662808F9 +:100C0000E6F8CB6F2002EE0777C9E52600E318046B +:100C1000119500F5CD410C38093E20FDCB0146CCA5 +:100C20003B0C1AE67FCD3B0C1A138730F5D1FE48FA +:100C30002803FE82D87AFE03D83E20D5D9D7D9D151 +:100C4000C9F5EB3CCB7E2328FB3D20F8EBF1FE20E1 +:100C5000D81AD641C9FDCB014EC011D90DD578FDAA +:100C6000CB0246C2020DFDBE31381BC0FDCB026671 +:100C70002816FD5E2D1D285A3E00CD0116ED7B3F46 +:100C80005CFDCB02A6C9CF04FD355220453E18902D +:100C9000328C5C2A8F5CE53A915CF53EFDCD011605 +:100CA000AF11F80CCD0A0CFDCB02EE213B5CCBDE84 +:100CB000CBAED9CDD415D9FE202845FEE22841F689 +:100CC00020FE6E283B3EFECD0116F132915CE12202 +:100CD0008F5CCDFE0DFD4631040E21C5CD9B0E7CF3 +:100CE0000F0F0FE603F6586711E05A1A4E0620EB75 +:100CF0001271132310FAC1C9807363726F6C6CBFD9 +:100D0000CF0CFE023880FD8631D619D0ED44C547A0 +:100D10002A8F5CE52A915CE5CD4D0D78F5216B5C61 +:100D200046783C7721895CBE3803340618CD000E26 +:100D3000F13D20E8E1FD7557E1228F5CED4B885CC9 +:100D4000FDCB0286CDD90DFDCB02C6C1C9AF2A8D20 +:100D50005CFDCB0246280467FD6E0E228F5C21915C +:100D60005C20027E0FAEE655AE77C9CDAF0D213CBB +:100D70005CCBAECBC6CD4D0DFD4631CD440E21C072 +:100D80005A3A8D5C0518070E202B770D20FB10F7C3 +:100D9000FD3631023EFDCD01162A515C11F409A742 +:100DA0007323722311A8103F38F6012117182A2146 +:100DB0000000227D5CFDCB3086CD940D3EFECD0142 +:100DC00016CD4D0D0618CD440E2A515C11F4097351 +:100DD0002372FD36520101211821005BFDCB014E2B +:100DE000201278FDCB02462805FD8631D618C5476E +:100DF000CD9B0EC13E21915F160019C3DC0A061778 +:100E0000CD9B0E0E08C5E578E60778200CEB21E0B7 +:100E1000F819EB0120003DEDB0EB21E0FF19EB47A5 +:100E2000E6070F0F0F4F780600EDB0060709E6F84A +:100E300020DBE124C10D20CDCD880E21E0FF19EB90 +:100E4000EDB00601C5CD9B0E0E08C5E578E6070F8F +:100E50000F0F4F7806000D545D360013EDB01101F1 +:100E600007193DE6F84720E5E124C10D20DCCD88D7 +:100E70000E626B133A8D5CFDCB024628033A485C48 +:100E8000770BEDB0C10E21C97C0F0F0F3DF65067F7 +:100E9000EB61682929292929444DC93E1890570F2B +:100EA0000F0FE6E06F7AE618F64067C9F306B02147 +:100EB0000040E5C5CDF40EC1E1247CE607200A7DA3 +:100EC000C6206F3F9FE6F8846710E7180DF32100F6 +:100ED0005B0608C5CDF40EC110F93E04D3FBFB211F +:100EE000005BFD7546AF47772310FCFDCB308E0EBF +:100EF00021C3D90DC36E389FE602D3FB57CD541FD3 +:100F0000380A3E04D3FBFBCDDF0ECF0CDBFB87F8AA +:100F100030EB0E205E230608CB12CB13CB1ADBFB83 +:100F20001F30FB7AD3FB10F00D20E9C92A3D5CE5A8 +:100F3000217F10E5ED733D5CCDD415F51600FD5E07 +:100F4000FF21C800CDB503F121380FE5FE1830317F +:100F5000FE07382DFE10383A01020057FE16380CF5 +:100F600003FDCB377ECA1E10CDD4155FCDD415D569 +:100F70002A5B5CFDCB0786CD5516C1237023711803 +:100F80000AFDCB07862A5B5CCD52161213ED535B2C +:100F90005CC95F160021990F195E19E52A5B5CC9CF +:100FA00009666A50B5707ECFD42A495CFDCB376E96 +:100FB000C29710CD6E19CD95167AB3CA9710E52356 +:100FC0004E2346210A0009444DCD051FCD97102A16 +:100FD000515CE3E53EFFCD0116E12BFD350FCD550C +:100FE00018FD340F2A595C23232323225B5CE1CDB7 +:100FF0001516C9FDCB376E200821495CCD0F191895 +:101000006DFD360010181DCD311018057EFE0DC87F +:1010100023225B5CC9CD3110010100C3E819CDD496 +:1010200015CDD415E1E1E1223D5CFDCB007EC0F998 +:10103000C937CD9511ED521923C1D8C5444D626B06 +:10104000231AE6F0FE102009231AD617CE0020013D +:1010500023A7ED4209EB38E6C9FDCB376EC02A491C +:101060005CCD6E19EBCD9516214A5CCD1C19CD9542 +:10107000173E00C30116FDCB377E28A8C3810FFDA4 +:10108000CB306628A1FD3600FF1600FD5EFE2190E4 +:101090001ACDB503C3300FE5CD90112BCDE5192244 +:1010A0005B5CFD360700E1C9FDCB025EC41D11A7E4 +:1010B000FDCB016EC83A085CFDCB01AEF5FDCB025D +:1010C0006EC46E0DF1FE203052FE10302DFE063043 +:1010D0000A47E6014F781FC612182A2009216A5CC8 +:1010E0003E08AE77180EFE0ED8D60D21415CBE77B5 +:1010F00020023600FDCB02DEBFC947E6074F3E1097 +:10110000CB5820013CFD71D3110D1118063A0D5C2E +:1011100011A8102A4F5C232373237237C9CD4D0DBC +:10112000FDCB029EFDCB02AE2A8A5CE52A3D5CE542 +:10113000216711E5ED733D5C2A825CE537CD9511A1 +:10114000EBCD7D18EBCDE1182A8A5CE3EBCD4D0D9C +:101150003A8B5C92382620067BFD9650301E3E204E +:10116000D5CDF409D118E91600FD5EFE21901ACD07 +:10117000B503FD3600FFED5B8A5C1802D1E1E12288 +:101180003D5CC1D5CDD90DE122825CFD362600C97A +:101190002A615C2BA7ED5B595CFDCB376EC8ED5B1C +:1011A000615CD82A635CC97EFE0E010600CCE8199A +:1011B0007E23FE0D20F1C9F33EFFED5BB25CD9ED5D +:1011C0004BB45CED5B385C2A7B5CD9473E00D3FEB8 +:1011D0003E3FED47000000000000626B36022BBC72 +:1011E00020FAA7ED52192330063528033528F32BB2 +:1011F000D9ED43B45CED53385C227B5CD9042819EB +:1012000022B45C11AF3E01A800EBEDB8EB23227BCA +:101210005C2B014000ED43385C22B25C21003C2293 +:10122000365C2AB25C363E2BF92B2B223D5CED5608 +:10123000FD213A5CFB21B65C224F5C11AF15011514 +:1012400000EBEDB0EB2B22575C2322535C224B5C6E +:1012500036802322595C360D2336802322615C229E +:10126000635C22655C3E07328D5C328F5C32485C89 +:1012700021230522095CFD35C6FD35CA21C615119D +:10128000105C010E00EDB0FDCB01CECDDF0EFD36C2 +:101290003102CD6B0DAF113815CD0A0CFDCB02EE2E +:1012A0001807FD363102CD9517CDB0163E00CD01A1 +:1012B00016CD2C0FCD171BFDCB007E2012FDCB30A1 +:1012C0006628402A595CCDA711FD3600FF18DD2A9B +:1012D000595C225D5CCDFB1978B1C25D15DFFE0D56 +:1012E00028C0FDCB3046C4AF0DCD6E0D3E19FD9626 +:1012F0004F328C5CFDCB01FEFD3600FFFD360A014E +:10130000CD8A1B76FDCB01AEFDCB304EC4CD0E3A5F +:101310003A5C3CF5210000FD7437FD7426220B5C1D +:1013200021010022165CCDB016FDCB37AECD6E0D7F +:10133000FDCB02EEF147FE0A3802C607CDEF153E9F +:1013400020D778119113CD0A0CAF113615CD0A0CA8 +:10135000ED4B455CCD1B1A3E3AD7FD4E0D0600CD38 +:101360001B1ACD97103A3A5C3C281BFE092804FE54 +:10137000152003FD340D01030011705C21445CCB8A +:101380007E280109EDB8FD360AFFFDCB019EC3ACF6 +:1013900012804FCB4E45585420776974686F75742E +:1013A00020464FD25661726961626C65206E6F741F +:1013B00020666F756EE45375627363726970742092 +:1013C00077726F6EE74F7574206F66206D656D6F75 +:1013D00072F94F7574206F66207363726565EE4E07 +:1013E000756D62657220746F6F206269E7524554B3 +:1013F00055524E20776974686F757420474F535566 +:10140000C2456E64206F662066696CE553544F5088 +:101410002073746174656D656EF4496E76616C69F4 +:101420006420617267756D656EF4496E74656765F9 +:1014300072206F7574206F662072616E67E54E6F63 +:101440006E73656E736520696E2042415349C342D5 +:101450005245414B202D20434F4E542072657065FC +:101460006174F34F7574206F6620444154C1496E16 +:1014700076616C69642066696C65206E616DE54E0D +:101480006F20726F6F6D20666F72206C696EE5530E +:10149000544F5020696E20494E5055D4464F52202B +:1014A000776974686F7574204E4558D4496E7661BB +:1014B0006C696420492F4F206465766963E5496E45 +:1014C00076616C696420636F6C6F75F242524541BE +:1014D0004B20696E746F2070726F677261ED5241BC +:1014E0004D544F50206E6F20676F6FE453746174DA +:1014F000656D656E74206C6F73F4496E76616C690E +:1015000064207374726561ED464E20776974686F6C +:101510007574204445C6506172616D6574657220B2 +:101520006572726FF254617065206C6F6164696EF0 +:1015300067206572726FF22CA07F204E6577205A6B +:101540007820537065637472756D20524F4D205230 +:1015500045414459A03E10010000C31313ED434917 +:101560005C2A5D5CEB215515E52A615C37ED52E59F +:101570006069CD6E192006CDB819CDE819C1793D45 +:10158000B02828C5030303032BED5B535CD5CD5571 +:1015900016E122535CC1C5132A615C2B2BEDB82ADE +:1015A000495CEBC1702B712B732B72F1C3A212F447 +:1015B00009A8104BF409C41553810FC41552F4093E +:1015C000C4155080CF12010006000B00010001007D +:1015D00006001000FDCB026E2004FDCB02DECDE63E +:1015E00015D828FACF07D9E52A515C232318081EFD +:1015F0003083D9E52A515C5E2356EBCD2C16E1D918 +:10160000C987C6166F265C5E23567AB32002CF17B1 +:101610001B2A4F5C1922515CFDCB30A623232323C8 +:101620004E212D16CDDC16D016005E19E94B06535F +:1016300012501B00FDCB02C6FDCB01AEFDCB30E648 +:101640001804FDCB0286FDCB018EC34D0DFDCB01F1 +:10165000CEC9010100E5CD051FE1CD64162A655C08 +:10166000EBEDB8C9F5E5214B5C3E0E5E2356E3A7D2 +:10167000ED5219E33009D5EB09EB722B7323D1231B +:101680003D20E8EBD1F1A7ED52444D0319EBC90021 +:1016900000EB118F167EE6C020F756235EC92A6341 +:1016A0005C2BCD55162323C1ED43615CC1EB23C9EF +:1016B0002A595C360D225B5C2336802322615C2A2A +:1016C000615C22635C2A635C22655CE521925C229A +:1016D000685CE1C9ED5B595CC3E519237EA7C8B915 +:1016E0002320F837C9CD1E17CD011701000011E2E4 +:1016F000A3EB19380701D415094E2346EB7123706B +:10170000C9E52A4F5C092323234EEB211617CDDCB4 +:10171000164E060009E94B0553035001E1C9CD946B +:101720001EFE103802CF17C6030721105C4F0600BB +:10173000094E23462BC9EF0138CD1E1778B1281664 +:10174000EB2A4F5C092323237EEBFE4B2808FE5334 +:101750002804FE5020CFCD5D17732372C9E5CDF16B +:101760002B78B12002CF0EC51AE6DF4F217A17CDB4 +:10177000DC1630F14E060009C1E94B065308500A49 +:10178000001E0118061E0618021E100B78B120D587 +:1017900057E1C91890ED733F5CFD360210CDAF0DD7 +:1017A000FDCB02C6FD4631CD440EFDCB0286FDCBFE +:1017B00030C62A495CED5B6C5CA7ED52193822D526 +:1017C000CD6E1911C002EBED52E3CD6E19C1C5CD3E +:1017D000B819C109380EEB56235E2BED536C5C181B +:1017E000ED226C5C2A6C5CCD6E192801EBCD3318B0 +:1017F000FDCB02A6C93E0318023E02FD360200CD13 +:101800003025C40116DFCD70203814DFFE3B2804DC +:10181000FE2C2006E7CD821C1808CDE61C1803CD4F +:10182000DE1CCDEE1BCD991E78E63F676922495C30 +:10183000CD6E191E01CD5518D7FDCB026628F63A9C +:101840006B5CFD964F20EEABC8E5D5216C5CCD0FEF +:1018500019D1E118E0ED4B495CCD8019163E280501 +:10186000110000CB13FD732D7EFE40C1D0C5CD28E5 +:101870001A232323FDCB01867AA72805D7FDCB01A8 +:10188000C6D5EBFDCB3096213B5CCB96FDCB376EBE +:101890002802CBD62A5F5CA7ED5220053E3FCDC182 +:1018A00018CDE118EB7ECDB61823FE0D2806EBCD42 +:1018B000371918E0D1C9FE0EC02323232323237E2A +:1018C000C9D92A8F5CE5CBBCCBFD228F5C21915C12 +:1018D00056D53600CDF409E1FD7457E1228F5CD96D +:1018E000C92A5B5CA7ED52C03A415CCB072804C60D +:1018F000431816213B5CCB9E3E4BCB56280BCBDED0 +:101900003CFDCB305E28023E43D5CDC118D1C95E27 +:101910002356E5EB23CD6E19CD9516E1FDCB376E41 +:10192000C0722B73C97BA7F8180DAF093C38FCEDCA +:10193000423D28F1C3EF15CD1B2D3030FE21382C50 +:10194000FDCB0196FECB2824FE3A200EFDCB376E50 +:101950002016FDCB30562814180EFE22200AF53A28 +:101960006A5CEE04326A5CF1FDCB01D6D7C9E52A88 +:10197000535C545DC1CD8019D0C5CDB819EB18F4B6 +:101980007EB8C0237E2BB9C9232323225D5C0E00C1 +:1019900015C8E7BB2004A7C9237ECDB618225D5C1D +:1019A000FE2220010DFE3A2804FECB2004CB412864 +:1019B000DFFE0D20E31537C9E57EFE403817CB6FFB +:1019C000281487FAC7193F01050030020E121723A9 +:1019D0007E30FB180623234E23462309D1A7ED5260 +:1019E000444D19EBC9CDDD19C5782F47792F4F0329 +:1019F000CD6416EBE119D5EDB0E1C92A595C2B2273 +:101A00005D5CE721925C22655CCD3B2DCDA22D383B +:101A10000421F0D809DA8A1CC3C516D5E5AFCB7806 +:101A2000202060691EFF1808D556235EE5EB1E20B6 +:101A30000118FCCD2A19019CFFCD2A190EF6CD2ADA +:101A4000197DCDEF15E1D1C9B1CBBCBFC4AFB49303 +:101A5000919295989898989898987F812E6C6E702E +:101A60004894563F412B171F3777440F592B432D6E +:101A7000513A6D420D495C44155D013D0206006717 +:101A80001E06CB05F01C0600ED1E00EE1C00231FF9 +:101A9000043D06CC0605031D0400AB1D05CD1F0546 +:101AA000892005022C05B21B00B71103A11E05F900 +:101AB000170800801E034F1E005F1E03AC1E006B44 +:101AC0000D0900DC2206003A1F05ED1D05271E0347 +:101AD000421E0905822300AC0E05C91F05F5170B30 +:101AE0000B0B0B0800F8030905202307070707075E +:101AF0000708007A1E0600942205601F062C0A00C3 +:101B000036170600E5160A0093170A2C0A009317E9 +:101B10000A009317009317FDCB01BECDFB19AF321E +:101B2000475C3D323A5C1801E7CDBF16FD340DFA33 +:101B30008A1CDF0600FE0D287AFE3A28EB21761B70 +:101B4000E54FE779D6CEDA8A1C4F21481A094E09AB +:101B500018032A745C7E2322745C01521BC54FFE5D +:101B600020300C21011C0600094E09E5DF05C9DF04 +:101B7000B9C28A1CE7C9CD541F3802CF14FDCB0A65 +:101B80007E20712A425CCB7C281421FEFF22455C1A +:101B90002A615C2BED5B595C1B3A445C1833CD6EBB +:101BA000193A445C2819A72043477EE6C078280FDD +:101BB000CFFFC1CD3025C82A555C3EC0A6C0AFFEC0 +:101BC00001CE0056235EED53455C235E2356EB1990 +:101BD0002322555CEB225D5C571E00FD360AFF1583 +:101BE000FD720DCA281B14CD8B192808CF16CD30D5 +:101BF00025C0C1C1DFFE0D28BAFE3ACA281BC38A20 +:101C00001C0F1D4B09670B7B8E71B481CFCDDE1C81 +:101C1000BFC1CCEE1BEB2A745C4E2346EBC5C9CD8D +:101C2000B228FD3637003008FDCB37CE2018CF0163 +:101C3000CC9629FDCB0176200DAFCD3025C4F12BFC +:101C400021715CB677EBED43725C224D5CC9C1CD6E +:101C5000561CCDEE1BC93A3B5CF5CDFB24F1FD567D +:101C600001AAE6402024CB7AC2FF2AC9CDB228F5CA +:101C700079F69F3C2014F118A9E7CD821CFE2C2098 +:101C800009E7CDFB24FDCB0176C0CF0BCDFB24FDB6 +:101C9000CB0176C818F4FDCB017EFDCB0286C44D86 +:101CA0000DF13A745CD613CDFC21CDEE1B2A8F5C6E +:101CB000228D5C21915C7E07AEE6AAAE77C9CD305D +:101CC000252813FDCB0286CD4D0D21905C7EF6F8C4 +:101CD00077FDCB57B6DFCDE221189FC30506FE0D79 +:101CE0002804FE3A209CCD3025C8EFA038C9CF0883 +:101CF000C1CD3025280AEF0238EBCDE934DAB31B29 +:101D0000C3291BFECD2009E7CD821CCDEE1B180692 +:101D1000CDEE1BEFA138EFC00201E00138CDFF2A64 +:101D200022685C2B7ECBFE010600090738060E0DEB +:101D3000CD551623E5EF020238E1EB0E0AEDB02A8D +:101D4000455CEB732372FD560D142372CDDA1DD062 +:101D5000FD46382A455C22425C3A475CED44572AEE +:101D60005D5C1EF3C5ED4B555CCD861DED43555CAA +:101D7000C13811E7F620B82803E718E8E73E0192DA +:101D800032445CC9CF117EFE3A2818237EE6C03764 +:101D9000C046234EED43425C234E2346E509444DA5 +:101DA000E11600C5CD8B19C1D018E0FDCB374EC26E +:101DB0002E1C2A4D5CCB7E281F2322685CEFE0E2BC +:101DC0000FC00238CDDA1DD82A685C110F00195EE9 +:101DD00023562366EBC3731ECF00EFE1E0E236002B +:101DE00002010337000438A7C93837C9E7CD1F1CE3 +:101DF000CD30252829DF225F5C2A575C7EFE2C2807 +:101E0000091EE4CD861D3002CF0DCD7700CD561CC6 +:101E1000DF22575C2A5F5CFD362600CD7800DFFEAE +:101E20002C28C9CDEE1BC9CD3025200BCDFB24FEBF +:101E30002CC4EE1BE718F53EE447EDB9110002C3D0 +:101E40008B19CD991E6069CD6E192B22575CC9CDB7 +:101E5000991E78B12004ED4B785CED43765CC92A7D +:101E60006E5CFD5636180CCD991E606916007CFE1E +:101E7000F0302C22425CFD720AC9CD851EED79C975 +:101E8000CD851E02C9CDD52D38152802ED44F5CDDE +:101E9000991EF1C9CDD52D1803CDA22D3801C8CF7B +:101EA0000ACD671E010000CD451E1803CD991E788E +:101EB000B12004ED4BB25CC5ED5B4B5C2A595C2B49 +:101EC000CDE519CD6B0D2A655C11320019D1ED52AB +:101ED00030082AB45CA7ED523002CF15EB22B25C79 +:101EE000D1C1363E2BF9C5ED733D5CEBE9D1FD6602 +:101EF0000D24E333ED4B455CC5E5ED733D5CD5CD7D +:101F0000671E0114002A655C09380AEB215000198C +:101F10003803ED72D82E03C35500010000CD051F14 +:101F2000444DC9C1E1D17AFE3E280B3BE3EBED7392 +:101F30003D5CC5C3731ED5E5CF06CD991E760B78E3 +:101F4000B1280C78A13C200103FDCB016E28EEFDE9 +:101F5000CB01AEC93E7FDBFE1FD83EFEDBFE1FC9B4 +:101F6000CD302528053ECEC3391EFDCB01F6CD8DE3 +:101F70002C3016E7FE242005FDCB01B6E7FE282015 +:101F80003CE7FE292820CD8D2CD28A1CEBE7FE24CD +:101F90002002EBE7EB010600CD55162323360EFE9B +:101FA0002C2003E718E0FE292013E7FE3D200EE772 +:101FB0003A3B5CF5CDFB24F1FDAE01E640C28A1C44 +:101FC000CDEE1BCD3025E1C8E93E0318023E02CD1F +:101FD0003025C40116CD4D0DCDDF1FCDEE1BC9DF61 +:101FE000CD4520280DCD4E2028FBCDFC1FCD4E2009 +:101FF00028F3FE29C8CDC31F3E0DD7C9DFFEAC2094 +:102000000DCD791CCDC31FCD07233E161810FEAD94 +:102010002012E7CD821CCDC31FCD991E3E17D77964 +:10202000D778D7C9CDF221D0CD7020D0CDFB24CD2B +:10203000C31FFDCB0176CCF12BC2E32D78B10BC8C9 +:102040001A13D718F7FE29C8FE0DC8FE3AC9DFFEDD +:102050003B2814FE2C200ACD3025280B3E06D7182D +:1020600006FE27C0CDF51FE7CD45202001C1BFC921 +:10207000FE2337C0E7CD821CA7CDC31FCD941EFE23 +:1020800010D20E16CD0116A7C9CD302528083E0165 +:10209000CD0116CD6E0DFD360201CDC120CDEE1B5A +:1020A000ED4B885C3A6B5CB838030E2147ED4388F2 +:1020B0005C3E1990328C5CFDCB0286CDD90DC36E8F +:1020C0000DCD4E2028FBFE28200EE7CDDF1FDFFEC2 +:1020D00029C28A1CE7C3B221FECA2011E7CD1F1C0A +:1020E000FDCB37FEFDCB0176C28A1C180DCD8D2CA1 +:1020F000D2AF21CD1F1CFDCB37BECD3025CAB221BA +:10210000CDBF1621715CCBB6CBEE010100CB7E209A +:102110000B3A3B5CE64020020E03B677F7360D79AA +:102120000F0F30053E22122B77225B5CFDCB377EF2 +:10213000202C2A5D5CE52A3D5CE5213A21E5FDCBBA +:1021400030662804ED733D5C2A615CCDA711FD3635 +:1021500000FFCD2C0FFDCB01BECDB9211803CD2C36 +:102160000FFD362200CDD621200ACD1D11ED4B8268 +:102170005CCDD90D21715CCBAECB7ECBBE201CE1FA +:10218000E1223D5CE1225F5CFDCB01FECDB9212A5D +:102190005F5CFD362600225D5C18172A635CED5BF0 +:1021A000615C37ED52444DCDB22ACDFF2A1803CDE4 +:1021B000FC1FCD4E20CAC120C92A615C225D5CDFB4 +:1021C000FEE2280C3A715CCD591CDFFE0DC8CF0B26 +:1021D000CD3025C8CF102A515C232323237EFE4B0C +:1021E000C9E7CDF221D8DFFE2C28F6FE3B28F2C34A +:1021F0008A1CFED9D8FEDF3FD8F5E7F1D6C9F5CD68 +:10220000821CF1A7CDC31FF5CD941E57F1D77AD705 +:10221000C9D611CE00281DD602CE002856FE017A5E +:1022200006012004070706044F7AFE0230167921C2 +:10223000915C18387A0607380507070706384F7A81 +:10224000FE0A3802CF13218F5CFE08380B7E280768 +:10225000B02FE6242801784F79CD6C223E07BA9F33 +:10226000CD6C220707E650473E08BA9FAEA0AE7776 +:102270002378C99F7A0F068020030F06404F7AFE0D +:10228000082804FE0230BD79218F5CCD6C22790FC5 +:102290000F0F18D8CD941EFE0830A9D3FE070707EC +:1022A000CB6F2002EE0732485CC93EAF90DAF924CA +:1022B00047A71F371FA71FA8E6F8A86779070707D2 +:1022C000A8E6C7A807076F79E607C9CD0723CDAAF7 +:1022D0002247047E0710FDE601C3282DCD0723CD3C +:1022E000E522C34D0DED437D5CCDAA2247043EFEA1 +:1022F0000F10FD477EFD4E57CB412001A0CB512052 +:1023000002A82F77C3DB0BCD142347C5CD14235967 +:10231000C1514FC9CDD52DDAF9240E01C80EFFC920 +:10232000DFFE2CC28A1CE7CD821CCDEE1BEF2A3DBE +:10233000387EFE813005EF023818A1EFA3383683CE +:10234000EFC50238CD7D24C5EF31E104387EFE8033 +:102350003008EF020238C1C3DC22EFC201C0020321 +:1023600001E00FC00131E00131E0A0C10238FD34CD +:1023700062CD941E6FE5CD941EE167227D5CC1C3E2 +:102380002024DFFE2C2806CDEE1BC37724E7CD8268 +:102390001CCDEE1BEFC5A2041F3130300006023801 +:1023A000C37724C002C102312AE101E12A0FE0050E +:1023B0002AE0013D387EFE813007EF020238C37704 +:1023C00024CD7D24C5EF02E10105C1020131E10404 +:1023D000C2020131E104E2E5E003A204311FC502BB +:1023E00020C002C202C1E504E0E2040FE101C10223 +:1023F000E004E2E50403C22AE12A0F02381AFE8152 +:10240000C1DA7724C5EF01383A7D5CCD282DEFC0C5 +:102410000F01383A7E5CCD282DEFC50FE0E538C1BD +:1024200005283C1814EFE131E304E2E40403C1029F +:10243000E404E2E3040FC20238C5EFC002E10F3149 +:10244000383A7D5CCD282DEF03E0E20FC001E03883 +:102450003A7E5CCD282DEF0338CDB724C110C6EFEE +:10246000020201383A7D5CCD282DEF0301383A7E17 +:102470005CCD282DEF0338CDB724C34D0DEF3128A7 +:102480003432000105E501052A38CDD52D3806E6A0 +:10249000FCC60430023EFCF5CD282DEFE5010531E8 +:1024A0001FC40231A2041FC101C0023104310FA1B7 +:1024B000031BC30238C1C9CD072379B8300669D5DB +:1024C000AF5F1807B1C86841D5160060781F85381E +:1024D00003BC3807944FD9C1C518044FD5D9C12AB8 +:1024E0007D5C788447793C85380D280D3D4FCDE5DE +:1024F00022D97910D9D1C928F3CF0ADF0600C54FF8 +:10250000219625CDDC1679D2842606004E09E9CD28 +:10251000740003FE0DCA8A1CFE2220F3CD7400FE57 +:1025200022C9E7FE282006CD791CDFFE29C28A1CBD +:10253000FDCB017EC9CD07232A365C110001197934 +:102540000F0F0FE6E0A85F79E618EE40570660C56A +:10255000D5E51AAE28043C201A3D4F060714231A6D +:10256000AEA9200F10F7C1C1C13E8090010100F754 +:1025700012180AE111080019D1C110D348C3B22AB8 +:10258000CD0723790F0F0F4FE6E0A86F79E603EE32 +:1025900058677EC3282D221C284F2EF22B12A856D6 +:1025A000A557A784A68FC4E6AABFABC7A9CE00E7EC +:1025B000C3FF24DF23E5010000CD0F25201BCD0F35 +:1025C0002528FBCD30252811F7E1D57E231213FEF7 +:1025D0002220F87E23FE2228F20BD1213B5CCBB6D1 +:1025E000CB7EC4B22AC31227E7CDFB24FE29C28AC0 +:1025F0001CE7C31227C3BD27CD30252828ED4B7615 +:102600005CCD2B2DEFA10F34371604348041000030 +:10261000803202A1033138CDA22DED43765C7EA736 +:102620002803D610771809CD30252804EFA33834B5 +:10263000E7C3C326015A10E7FE23CA0D27213B5CDE +:10264000CBB6CB7E281FCD8E020E002013CD1E03ED +:10265000300E155FCD3303F5010100F7F1120E01C5 +:102660000600CDB22AC31227CD2225C43525E7C3E3 +:10267000DB25CD2225C48025E71848CD2225C4CBF3 +:1026800022E7183FCD882C3056FE41303CCD302516 +:102690002023CD9B2CDF010600CD551623360E23BB +:1026A000EB2A655C0E05A7ED4222655CEDB0EB2BD5 +:1026B000CD7700180EDF237EFE0E20FA23CDB43333 +:1026C000225D5CFDCB01F61814CDB228DA2E1CCCAD +:1026D00096293A3B5CFEC0380423CDB4331833014D +:1026E000DB09FE2D2827011810FEAE2820D6AFDA10 +:1026F0008A1C01F004FE142814D28A1C0610C6DCC1 +:102700004FFEDF3002CBB1FEEE3802CBB9C5E7C3D6 +:10271000FF24DFFE28200CFDCB01762017CD522AA6 +:10272000E718F006004F219527CDDC1630064E2124 +:10273000ED260946D17AB8383AA7CA1800C5213B18 +:102740005C7BFEED2006CB7620021E99D5CD302590 +:1027500028097BE63F47EF3B3818097BFDAE01E6D1 +:1027600040C28A1CD1213B5CCBF6CB7B2002CBB68E +:10277000C118C1D579FDCB01762015E63FC6084FBB +:10278000FE102004CBF1180838D7FE172802CBF929 +:10279000C5E7C3FF242BCF2DC32AC42FC55EC63D7A +:1027A000CE3ECC3CCDC7C9C8CAC9CBC5C7C6C80078 +:1027B0000608080A020305050505050506CD3025AE +:1027C0002035E7CD8D2CD28A1CE7FE24F52001E7C9 +:1027D000FE282012E7FE292810CDFB24DFFE2C2046 +:1027E00003E718F5FE29C28A1CE7213B5CCBB6F152 +:1027F0002802CBF6C31227E7E6DF47E7D6244F20AF +:1028000001E7E7E52A535C2B11CE00C5CD861DC13B +:102810003002CF18E5CDAB28E6DFB82008CDAB28D5 +:10282000D624B9280CE12B110002C5CD8B19C11893 +:10283000D7A7CCAB28D1D1ED535D5CCDAB28E5FE5D +:10284000292842237EFE0E164028072BCDAB2823D5 +:10285000160023E5D5CDFB24F1FDAE01E640202B8B +:10286000E1EB2A655C010500ED4222655CEDB0EB11 +:102870002BCDAB28FE29280DE5DFFE2C200DE7E14E +:10288000CDAB2818BEE5DFFE292802CF19D1EB22F7 +:102890005D5C2A0B5CE3220B5CD5E7E7CDFB24E112 +:1028A000225D5CE1220B5CE7C31227237EFE213808 +:1028B000FAC9FDCB01F6DFCD8D2CD28A1CE5E61FCF +:1028C0004FE7E5FE282828CBF1FE242811CBE9CDDF +:1028D000882C300FCD882C3016CBB1E718F6E7FDE9 +:1028E000CB01B63A0C5CA72806CD3025C251294150 +:1028F000CD3025200879E6E0CBFF4F18372A4B5C16 +:102900007EE67F282DB920221787F23F293830D163 +:10291000D5E5231A13FE2028FAF620BE28F4F68007 +:10292000BE20061ACD882C3015E1C5CDB819EBC1F3 +:1029300018CECBF8D1DFFE282809CBE8180DD1D16D +:10294000D1E5DFCD882C3003E718F8E1CB10CB7050 +:10295000C92A0B5C7EFE29CAEF287EF66047237EDB +:10296000FE0E28072BCDAB2823CBA878B92812233D +:1029700023232323CDAB28FE29CAEF28CDAB28186B +:10298000D9CB69200C23ED5B655CCDC033EB2265B0 +:102990005CD1D1AF3CC9AF47CB79204BCB7E200E69 +:1029A0003C234E234623EBCDB22ADFC3492A2323FF +:1029B0002346CB71280A0528E8EBDFFE282061EBCF +:1029C000EB1824E5DFE1FE2C2820CB792852CB71CF +:1029D0002006FE29203CE7C9FE29286CFECC2032C7 +:1029E000DF2B225D5C185E210000E5E7E179FEC087 +:1029F0002009DFFE292851FECC28E5C5E5CDEE2AC9 +:102A0000E3EBCDCC2A38190BCDF42A09D1C110B390 +:102A1000CB792066E5CB712013424BDFFE292802DB +:102A2000CF02E7E1110500CDF42A09C9CDEE2AE372 +:102A3000CDF42AC10923424BEBCDB12ADFFE292870 +:102A400007FE2C20DBCD522AE7FE2828F8FDCB011B +:102A5000B6C9CD3025C4F12BE7FE292850D5AFF5F6 +:102A6000C5110100DFE1FECC2817F1CDCD2AF550CC +:102A700059E5DFE1FECC2809FE29C28A1C626B18E9 +:102A800013E5E7E1FE29280CF1CDCD2AF5DF6069D9 +:102A9000FE2920E6F1E3192BE3A7ED5201000038EF +:102AA0000723A7FA202A444DD1FDCB01B6CD30250E +:102AB000C8AFFDCB01B6C5CDA933C12A655C77236C +:102AC000732372237123702322655CC9AFD5E5F5AA +:102AD000CD821CF1CD30252812F5CD991ED178B1CB +:102AE000372805E1E5A7ED427ADE00E1D1C9EB2305 +:102AF0005E2356C9CD3025C8CDA930DA151FC92AA5 +:102B00004D5CFDCB374E285E01050003237EFE2081 +:102B100028FA300BFE103811FE16300D2318EDCDBB +:102B2000882C38E7FE24CAC02B792A595C2BCD5556 +:102B3000162323EBD52A4D5C1BD606472811237E8E +:102B4000FE2138FAF620131210F4F680123EC02A45 +:102B50004D5CAEF620E1CDEA2BE5EF0238E1010550 +:102B600000A7ED421840FDCB01762806110600199A +:102B700018E72A4D5CED4B725CFDCB374620307870 +:102B8000B1C8E5F7D5C5545D233620EDB8E5CDF1E4 +:102B90002BE1E3A7ED42093002444DE3EB78B12885 +:102BA00002EDB0C1D1E1EB78B1C8D5EDB0E1C92BF0 +:102BB0002B2B7EE5C5CDC62BC1E1030303C3E8196A +:102BC0003EDF2A4D5CA6F5CDF12BEB09C52B224D3E +:102BD0005C0303032A595C2BCD55162A4D5CC1C5F5 +:102BE00003EDB8EB23C1702B71F12B772A595C2BC5 +:102BF000C92A655C2B462B4E2B562B5E2B7E2265FD +:102C00005CC9CDB228C28A1CCD30252008CBB1CDFD +:102C10009629CDEE1B3808C5CDB819CDE819C1CB22 +:102C2000F90600C5210100CB7120022E05EBE72635 +:102C3000FFCDCC2ADA202AE1C524E56069CDF42A4B +:102C4000EBDFFE2C28E8FE2920BBE7C179682600CF +:102C500023232919DA151FD5C5E5444D2A595C2BC4 +:102C6000CD55162377C10B0B0B23712370C178232D +:102C700077626B1B3600CB7128023620C1EDB8C1DC +:102C8000702B712B3D20F8C9CD1B2D3FD8FE413F45 +:102C9000D0FE5BD8FE613FD0FE7BC9FEC420191177 +:102CA0000000E7D631CE00200AEB3FED6ADAAD3105 +:102CB000EB18EF424BC32B2DFE2E280FCD3B2DFEE4 +:102CC0002E2028E7CD1B2D3822180AE7CD1B2DDA40 +:102CD0008A1CEFA038EFA1C00238DFCD222D380BBF +:102CE000EFE0A405C0040F38E718EFFE452803FE07 +:102CF00065C006FFE7FE2B2805FE2D200204E7CD68 +:102D00001B2D38CBC5CD3B2DCDD52DC1DAAD31A78F +:102D1000FAAD31042802ED44C34F2DFE30D8FE3AFF +:102D20003FC9CD1B2DD8D6304F0600FD213A5CAFF0 +:102D30005F514847CDB62AEF38A7C9F5EFA038F163 +:102D4000CD222DD8EF01A4040F38CD740018F1075F +:102D50000F30022F3CF521925CCD0B35EFA438F1FA +:102D6000CB3F300DF5EFC1E0000404330205E1383C +:102D7000F12808F5EF310438F118E5EF0238C923DE +:102D80004E237EA9915F237E89A957C90E00E5369F +:102D9000002371237BA99177237A89A977233600B1 +:102DA000E1C9EF387EA72805EFA20F2738EF0238D8 +:102DB000E5D5EB46CD7F2DAF90CB79424B7BD1E172 +:102DC000C957179F5F4FAF47CDB62AEF34EF1A2090 +:102DD0009A85042738CDA22DD8F505042803F137AC +:102DE000C9F1C9EF3136000B3137000D02383E30E2 +:102DF000D7C92A383E2DD7EFA0C3C4C50238D9E5BC +:102E0000D9EF3127C203E201C202387EA72047CDA5 +:102E10007F2D06107AA72006B32809530608D5D9B6 +:102E2000D1D91857EFE2387ED67ECDC12D573AACB6 +:102E30005C9232AC5C7ACD4F2DEF3127C103E13883 +:102E4000CDD52DE532A15C3D179F3C21AB5C7723AE +:102E50008677E1C3CF2ED680FE1C3813CDC12DD688 +:102E6000074721AC5C867778ED44CD4F2D1892EB67 +:102E7000CDBA2FD9CBFA7DD9D68047CB23CB12D967 +:102E8000CB13CB12D921AA5C0E057E8F27772B0D91 +:102E900020F810E7AF21A65C11A15C0609ED6F0ECA +:102EA000FFED6F20040D0C200A1213FD3471FD3468 +:102EB000720E00CB4028012310E73AAB5CD60938EC +:102EC0000AFD35713E04FDBE6F1841EF02E238EB9A +:102ED000CDBA2FD93E80952E00CBFAD9CDDD2FFD6E +:102EE0007E71FE083806D9CB12D918200100027B6A +:102EF000CD8B2F5F7ACD8B2F57C5D9C110F121A172 +:102F00005C79FD4E710977FD347118D3F521A15C10 +:102F1000FD4E7106000941F12B7ECE0077A72805F2 +:102F2000FE0A3F300810F1360104FD3472FD707165 +:102F3000EF0238D9E1D9ED4BAB5C21A15C78FE09F9 +:102F40003804FEFC3826A7CCEF15AF90FA522F4775 +:102F5000180C79A728037E230DCDEF1510F479A75F +:102F6000C8043E2ED73E3010FB4118E6501506012E +:102F7000CD4A2F3E45D74A79A7F2832FED444F3EE5 +:102F80002D18023E2BD70600C31B1AD56F26005DF5 +:102F9000542929192959194C7DD1C97E3600A7C851 +:102FA00023CB7ECBFE2BC8C501050009414F372B33 +:102FB0007E2FCE007710F879C1C9E5F54E2346770C +:102FC00023794EC5234E2346EB575ED52356235E09 +:102FD000D5D9D1E1C1D92356235EF1E1C9A7C8FEF5 +:102FE000213016C547D9CB2DCB1ACB1BD9CB1ACB49 +:102FF0001B10F2C1D0CD0430C0D9AF2E00575DD91F +:10300000110000C91CC014C0D91C200114D9C9EB7F +:10301000CD6E34EB1AB62026D523E5235E23562346 +:1030200023237E234E2346E1EB09EB8E0FCE0020B7 +:103030000B9FC3393A23722B2B2BD1C92BD1CD93A4 +:1030400032D9E5D9D5E5CD9B2F47EBCD9B2F4FB896 +:1030500030037841EBF590CDBA2FCDDD2FF1E1773C +:10306000E5686119D9EBED4AEB7C8D6F1FADD9EBAB +:10307000E11F30083E01CDDD2F342823D97DE680C5 +:10308000D923772B281F7BED443F5F7A2FCE005743 +:10309000D97B2FCE005F7A2FCE0030071FD934CADC +:1030A000AD31D957D9AFC35531C506107C4D21007C +:1030B0000029380ACB1117300319380210F3C1C99F +:1030C000CDE934D823AECBFE2BC91AB62022D5E5E4 +:1030D000D5CD7F2DEBE341CD7F2D78A94FE1CDA953 +:1030E00030EBE1380A7AB320014FCD8E2DD1C9D112 +:1030F000CD9332AFCDC030D8D9E5D9D5EBCDC030E6 +:10310000EB385AE5CDBA2F78A7ED62D9E5ED62D953 +:1031100006211811300519D9ED5AD9D9CB1CCB1D70 +:10312000D9CB1CCB1DD9CB18CB19D9CB191F10E487 +:10313000EBD9EBD9C1E178812001A73D3F173F1FB3 +:10314000F246313068A73C20083806D9CB7AD9201E +:103150005C77D978D930157EA73E802801AFD9A2F7 +:10316000CDFB2F0777382E23772B18290620D9CBB4 +:103170007AD9201207CB13CB12D9CB13CB12D93566 +:1031800028D710EA18D717300CCD04302007D916ED +:1031900080D9342818E523D9D5D9C17817CB161F83 +:1031A00077237123722373E1D1D9E1D9C9CF05CD3A +:1031B0009332EBAFCDC03038F4EBCDC030D8D9E589 +:1031C000D9D5E5CDBA2FD9E56069D96168AF06DFF9 +:1031D000181017CB11D9CB11CB10D929D9ED6AD939 +:1031E0003810ED52D9ED52D9300F19D9ED5AD9A76F +:1031F0001808A7ED52D9ED52D93704FAD231F52883 +:10320000DA5F51D95950F1CB18F1CB18D9C1E17817 +:1032100091C33D317EA7C8FE81300636003E20189E +:1032200051FE91181A2323233E80A62BB62B200390 +:103230003E80AE2B2036772336FF2B3E18183330D6 +:103240002CD52FC6912356235E2B2B0E00CB7A282C +:10325000010DCBFA0608908038045A160090280712 +:1032600047CB3ACB1B10FACD8E2DD1C97ED6A0F01C +:10327000ED44D5EB2B47CB38CB38CB38280536007F +:103280002B10FBE6072809473EFFCB2710FCA6774B +:10329000EBD1C9CD9632EB7EA7C0D5CD7F2DAF2324 +:1032A000772B7706917AA72008B342281053580647 +:1032B00089EB052930FCCB09CB1CCB1DEB2B732BE9 +:1032C000722B70D1C900B00040B000013000F1494C +:1032D0000FDAA240B0000A8F363C34A1330F30CA57 +:1032E00030AF3151381B3524353B353B353B353B11 +:1032F000353B353B3514302D353B353B353B353B88 +:10330000353B353B359C35DE35BC3445366E34694E +:1033100036DE357436B537AA37DA3733384338E214 +:10332000371337C436AF364A3892346A34AC34A5D2 +:1033300034B3341F36C9350135C033A0368636C69E +:10334000337A360635F9349B3683371432A2334F3D +:103350002D973249341B342D340F34CDBF3578329C +:10336000675CD9E3D9ED53655CD97E23E5A7F2808C +:103370003357E6600F0F0F0FC67C6F7AE61F180EEB +:10338000FE183008D901FBFF545D09D9076F11D72A +:10339000322600195E2356216533E3D5D9ED4B66FD +:1033A0005CC9F13A675CD918C3D5E5010500CD05C4 +:1033B0001FE1D1C9ED5B655CCDC033ED53655CC9E0 +:1033C000CDA933EDB0C9626BCDA933D9E5D9E3C539 +:1033D0007EE6C007074F0C7EE63F2002237EC650E4 +:1033E000123E059123130600EDB0C1E3D9E1D947A0 +:1033F000AF05C8121318FAA7C8F5D5110000CDC83B +:1034000033D1F13D18F24F0707814F060009C9D5A6 +:103410002A685CCD0634CDC033E1C9626BD9E521A1 +:10342000C532D9CDF733CDC833D9E1D9C9E5EB2AB7 +:10343000685CCD0634EBCDC033EBE1C906051A4E0E +:10344000EB1271231310F7EBC947CD5E33310FC078 +:1034500002A0C231E004E2C10338CDC633CD6233ED +:103460000F01C20235EEE10338C906FF1806CDE9A7 +:1034700034D806007EA7280B2378E680B6173F1FB6 +:10348000772BC9D5E5CD7F2DE178B12F4FCD8E2D8E +:10349000D1C9CDE934D8D511010023CB162B9F4FCC +:1034A000CD8E2DD1C9CD991EED781804CD991E0A67 +:1034B000C3282DCD991E212B2DE5C5C9CDF12B0B90 +:1034C00078B120231ACD8D2C3809D6903819FE15E5 +:1034D00030153C3D878787FEA8300CED4B7B5C8127 +:1034E0004F300104C32B2DCF09E5C5477E23B623FA +:1034F000B623B678C1E1C037C9CDE934D83EFF184C +:1035000006CDE9341805AF23AE2B07E53E0077233F +:10351000772317771F23772377E1C9EBCDE934EBC6 +:10352000D83718E7EBCDE934EBD0A718DEEBCDE9BF +:1035300034EBD0D51BAF121B12D1C978D608CB57AC +:1035400020013D0F3008F5E5CD3C34D1EBF1CB57F0 +:1035500020070FF5CD0F3018330FF5CDF12BD5C562 +:10356000CDF12BE17CB5E378200BB1C12804F13F0C +:103570001816F11813B1280D1A96380920ED0B13FF +:1035800023E32B18DFC1F1A7F5EFA038F1F5DC013B +:1035900035F1F5D4F934F10FD40135C9CDF12BD57E +:1035A000C5CDF12BE1E5D5C509444DF7CDB22AC112 +:1035B000E178B12802EDB0C1E178B12802EDB02A7E +:1035C000655C11FBFFE519D1C9CDD52D380E200C56 +:1035D000F5010100F7F112CDB22AEBC9CF0A2A5D3D +:1035E0005CE578C6E39FF5CDF12BD503F7E1ED530C +:1035F0005D5CD5EDB0EB2B360DFDCB01BECDFB24D4 +:10360000DFFE0D2007E1F1FDAE01E640C28A1C227B +:103610005D5CFDCB01FECDFB24E1225D5C18A001C9 +:103620000100F7225B5CE52A515CE53EFFCD011607 +:10363000CDE32DE1CD1516D12A5B5CA7ED52444DAB +:10364000CDB22AEBC9CD941EFE10D29F1E2A515C2A +:10365000E5CD0116CDE61501000030030CF712CDC3 +:10366000B22AE1CD1516C3BF35CDF12B78B12801B3 +:103670001AC3282DCDF12BC32B2DD9E521675C353D +:10368000E1200423D9C9D95E7B179F5719D9C913E3 +:10369000131A1B1BA720EFD923D9C9F1D9E3D9C924 +:1036A000EFC00231E00527E001C00403E038C9EFB4 +:1036B000313600043A38C9313AC003E00130000322 +:1036C000A10338C9EF3D34F138AA3B29043127C39F +:1036D00003310FA1038813365865669D786540A2B3 +:1036E0006032C9E721F7AF24EB2FB0B014EE7EBBF8 +:1036F0009458F13A7EF8CFE338CDD52D2007380322 +:10370000863009CF053807963004ED4477C9EF02BB +:10371000A038C9EF3D3137000438CF09A002387E08 +:103720003680CD282DEF34380003013134F04CCCF5 +:10373000CCCD0337000801A103013834EF0134F088 +:10374000317217F80401A203A2033134322004A21B +:10375000038C11AC140956DAA55930C55C90AA9EA9 +:10376000706F61A1CBDA96A4319FB4E7A0FE5CFC38 +:10377000EA1B43CA36EDA79C7E5EF06E238093045D +:103780000F38C9EF3D34EE22F9836E0431A20F27C2 +:1037900003310F310F312AA1033137C00004023841 +:1037A000C9A103013600021B38C9EF392AA103E081 +:1037B00000061B3303EF39313104310FA1038614A6 +:1037C000E65C1F0BA38F38EEE91563BB23EE920D69 +:1037D000CDEDF1235D1BEA0438C9EF311F0120054F +:1037E00038C9CD97327EFE81380EEFA11B0105311D +:1037F00036A30100061B3303EFA001313104310F62 +:10380000A1038C10B2130E55E48D5839BC5B98FDA2 +:103810009E003675A0DBE8B46342C4E6B50936BE47 +:10382000E936731B5DECD8DE63BEF061A1B30C0416 +:103830000F38C9EF313104A1031B28A10F05243132 +:103840000F38C9EF22A3031B38C9EF3130001EA285 +:1038500038EF0131300007250438C3C43602313057 +:103860000009A001370006A1010502A138C9DDE564 +:103870003A815C06058710FD16005FDD21005B5F65 +:10388000DD1906207EDD770023DD2310F73A815C09 +:103890003CFE08280632815CDDE1C9F521005B3E73 +:1038A0001BCD0A393E41CD0A393E08CD0A393E1BAF +:1038B000CD0A393E4DCD0A393E1BCD0A393E4BCD9E +:1038C0000A393E00CD0A393E01CD0A3906201120C1 +:1038D00000C50608C5E50608CB16171910FAE1C1A0 +:1038E000CD0A3910EFC12310E83E0DCD0A393E0A4A +:1038F000CD0A393E1BCD0A393E32CD0A393E12CDB2 +:103900000A39AF32815CF1DDE1C9C5F5AFDBBB0738 +:1039100038FAF1F5D39BAFD3BB3E02D3BBF1C1C99B +:1039200032915CC3DC0A2A805C265BC9CD030BFDA7 +:10393000CB014ECAF709CA283AFE06CAC839FE0D9D +:103940002833FE162854FE17284AFE1C2818FE208D +:10395000DA0A39FE80382FFE90DA0E3AD6A5D21058 +:103960000CC615C3F939116C39C3800ACD0A391157 +:10397000F409C3800AFD364500CD283A3E0ACD0A37 +:10398000393E0DC30A39FE602865FE7F2866FD3486 +:1039900045C30A3911A639C3800A11A039C3800A68 +:1039A00011B439C3800A11AE39CD800A180C11F454 +:1039B00009C3800A11F409CD800AFD9645D8C8478D +:1039C0003E20CD863910F9C9FD7E4547E6F0C61088 +:1039D000904718ECC90608C5060821925CAFCB16C3 +:1039E000CB172310F9CD0A39C110ECFD3445C9219C +:1039F000003F181021F83F180BED5B7B5C6F260031 +:103A00002929291911925C010800EDB0180447CD4D +:103A1000380B3E1BCD0A393E4BCD0A393E08CD0A44 +:103A2000393E00CD0A3918AD3E3FD3DB3EFFD3FB14 +:103A30003E80D3FB3E02D3BBC9F53CB3B22014F1A8 +:103A4000E53680233600233600233600E12B3691FD +:103A5000C33A30F1772373C33530FFFFFFFFFFFF19 +:103A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:103A7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:103A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:103A9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:103AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:103AB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:103AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:103AD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:103AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:103AF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:103B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:103B1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:103B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:103B3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:103B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:103B5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:103B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:103B7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:103B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:103B9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:103BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:103BB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:103BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:103BD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:103BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:103BF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:103C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:103C1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:103C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:103C3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:103C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:103C5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:103C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:103C7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:103C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:103C9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:103CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:103CB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:103CC000FFFFFF0E3F21000011FB01761B7AB3209E +:103CD000FB1100013EFFED40CB402809060D10FE10 +:103CE000231BBA20F13E00BC20D9CB3DCB3DCB3DC0 +:103CF000E5C1C9FFFFFFFFFFFFFFFFFFFFFFFFFF62 +:103D00000000000000000000001010101000100063 +:103D1000002424000000000000247E24247E2400CF +:103D200000083E283E0A3E0800626408102646004D +:103D3000001028102A443A0000081000000000007B +:103D400000040808080804000020101010102000CB +:103D5000000014083E081400000008083E0808008F +:103D60000000000000080810000000003E000000F5 +:103D700000000000001818000000020408102000D5 +:103D8000003C464A52623C000018280808083E00E1 +:103D9000003C42023C407E00003C420C02423C009F +:103DA00000081828487E0800007E407C02423C0043 +:103DB000003C407C42423C00007E0204081010009F +:103DC000003C423C42423C00003C42423E023C003D +:103DD0000000001000001000000010000010102073 +:103DE00000000408100804000000003E003E00002F +:103DF0000000100804081000003C420408000800FD +:103E0000003C4A565E403C00003C42427E4242003A +:103E1000007C427C42427C00003C424040423C00EC +:103E20000078444242447800007E407C40407E005E +:103E3000007E407C40404000003C42404E423C00FE +:103E40000042427E42424200003E080808083E000E +:103E50000002020242423C000044487048444200D2 +:103E60000040404040407E000042665A42424200CC +:103E7000004262524A464200003C424242423C00FA +:103E8000007C42427C404000003C4242524A3C009E +:103E9000007C42427C444200003C403C02423C00E8 +:103EA00000FE1010101010000042424242423C003E +:103EB000004242424224180000424242425A240038 +:103EC00000422418182442000082442810101000D8 +:103ED000007E040810207E00000E080808080E006E +:103EE0000000402010080400007010101010700036 +:103EF000001028440000000000000000000000FF47 +:103F0000001C227820207E00000038043C443C0045 +:103F10000020203C22223C0000001C2020201C000D +:103F20000004043C44443C000000384478403C0019 +:103F3000000C10181010100000003C44443C0438E1 +:103F40000040407844444400001000301010380015 +:103F50000004000404042418002028303028240021 +:103F60000010101010100C0000006854545454003D +:103F7000000078444444440000003844444438007D +:103F8000000078444478404000003C44443C04062F +:103F900000001C2020202000000038403804780059 +:103FA0000010381010100C00000044444444380045 +:103FB00000004444282810000000445454542800B1 +:103FC000000044281028440000004444443C0438C5 +:103FD00000007C0810207C00000E083008080E004D +:103FE00000080808080808000070100C1010700085 +:103FF00000142800000000003C4299A1A199423C15 +:00000001FF diff --git a/Cobra_MiST/rtl/roms/groot.rom b/Cobra_MiST/rtl/roms/groot.rom new file mode 100644 index 00000000..5d35484b Binary files /dev/null and b/Cobra_MiST/rtl/roms/groot.rom differ diff --git a/Cobra_MiST/rtl/roms/gw03.rom b/Cobra_MiST/rtl/roms/gw03.rom new file mode 100644 index 00000000..1f95f9f7 Binary files /dev/null and b/Cobra_MiST/rtl/roms/gw03.rom differ diff --git a/Cobra_MiST/rtl/roms/hdt-iso.rom b/Cobra_MiST/rtl/roms/hdt-iso.rom new file mode 100644 index 00000000..93817b0f Binary files /dev/null and b/Cobra_MiST/rtl/roms/hdt-iso.rom differ diff --git a/Cobra_MiST/rtl/roms/imc.rom b/Cobra_MiST/rtl/roms/imc.rom new file mode 100644 index 00000000..9b632277 Binary files /dev/null and b/Cobra_MiST/rtl/roms/imc.rom differ diff --git a/Cobra_MiST/rtl/roms/iso8bm.rom b/Cobra_MiST/rtl/roms/iso8bm.rom new file mode 100644 index 00000000..cdd3677b Binary files /dev/null and b/Cobra_MiST/rtl/roms/iso8bm.rom differ diff --git a/Cobra_MiST/rtl/roms/isomoje.rom b/Cobra_MiST/rtl/roms/isomoje.rom new file mode 100644 index 00000000..e58afa41 Binary files /dev/null and b/Cobra_MiST/rtl/roms/isomoje.rom differ diff --git a/Cobra_MiST/rtl/roms/jgh.rom b/Cobra_MiST/rtl/roms/jgh.rom new file mode 100644 index 00000000..87c44352 Binary files /dev/null and b/Cobra_MiST/rtl/roms/jgh.rom differ diff --git a/Cobra_MiST/rtl/roms/plus4.rom b/Cobra_MiST/rtl/roms/plus4.rom new file mode 100644 index 00000000..794766c3 Binary files /dev/null and b/Cobra_MiST/rtl/roms/plus4.rom differ diff --git a/Cobra_MiST/rtl/roms/psycho.rom b/Cobra_MiST/rtl/roms/psycho.rom new file mode 100644 index 00000000..65b3badc Binary files /dev/null and b/Cobra_MiST/rtl/roms/psycho.rom differ diff --git a/Cobra_MiST/rtl/roms/sc01.rom b/Cobra_MiST/rtl/roms/sc01.rom new file mode 100644 index 00000000..034778bc Binary files /dev/null and b/Cobra_MiST/rtl/roms/sc01.rom differ diff --git a/Cobra_MiST/rtl/roms/spectrum.hex b/Cobra_MiST/rtl/roms/spectrum.hex new file mode 100644 index 00000000..2ad77244 --- /dev/null +++ b/Cobra_MiST/rtl/roms/spectrum.hex @@ -0,0 +1,1025 @@ +:10000000F3AF11FFFFC3CB112A5D5C225F5C184385 +:10001000C3F215FFFFFFFFFF2A5D5C7ECD7D00D0A0 +:10002000CD740018F7FFFFFFC35B33FFFFFFFFFF37 +:10003000C52A615CE5C39E16F5E52A785C23227823 +:100040005C7CB52003FD3440C5D5CDBF02D1C1E1F4 +:10005000F1FBC9E16EFD7500ED7B3D5CC3C516FF8C +:10006000FFFFFFFFFFFFF5E52AB05C7CB52001E94B +:10007000E1F1ED452A5D5C23225D5C7EC9FE21D065 +:10008000FE0DC8FE10D8FE183FD823FE16380123F7 +:1000900037225D5CC9BF524EC4494E4B4559A450EE +:1000A000C946CE504F494ED453435245454EA441C4 +:1000B0005454D241D45441C256414CA4434F44C538 +:1000C0005641CC4C45CE5349CE434FD35441CE41FB +:1000D00053CE4143D34154CE4CCE4558D0494ED453 +:1000E0005351D25347CE4142D3504545CB49CE55CB +:1000F00053D2535452A4434852A44E4FD44249CEF3 +:100100004FD2414EC43CBD3EBD3CBE4C494EC55491 +:100110004845CE54CF535445D04445462046CE435F +:1001200041D4464F524D41D44D4F56C5455241538F +:10013000C54F50454E20A3434C4F534520A34D453A +:100140005247C55645524946D9424545D043495282 +:10015000434CC5494ECB50415045D2464C4153C803 +:100160004252494748D4494E56455253C54F5645C9 +:10017000D24F55D44C5052494ED44C4C4953D45381 +:10018000544FD0524541C4444154C1524553544F39 +:1001900052C54E45D7424F524445D2434F4E544923 +:1001A0004E55C54449CD5245CD464FD2474F2054B8 +:1001B000CF474F205355C2494E5055D44C4F41C4A0 +:1001C0004C4953D44C45D450415553C54E4558D451 +:1001D000504F4BC55052494ED4504C4FD45255CE2F +:1001E000534156C552414E444F4D495AC549C643E5 +:1001F0004CD3445241D7434C4541D25245545552B9 +:10020000CE434F50D942485936355447564E4A5539 +:1002100037345246434D4B4938334544580E4C4FC2 +:10022000393257535A200D5030315141E3C4E0E484 +:10023000B4BCBDBBAFB0B1C0A7A6BEADB2BAE5A558 +:10024000C2E1B3B9C1B87EDCDA5CB77B7DD8BFAEA2 +:10025000AAABDDDEDF7FB5D67CD55DDBB6D95BD75B +:100260000C07060405080A0B090FE22A3FCDC8CC8B +:10027000CB5EAC2D2B3D2E2C3B22C73CC33EC52F65 +:10028000C960C63AD0CEA8CAD3D4D1D2A9CF2E2F16 +:1002900011FFFF01FEFEED782FE61F280E677D148B +:1002A000C0D608CB3C30FA535F20F42DCB0038E6A3 +:1002B0007A3CC8FE28C8FE19C87B5A57FE18C9CD1B +:1002C0008E02C021005CCB7E200723352B20023616 +:1002D000FF7D21045CBD20EECD1E03D021005CBE5D +:1002E000282EEB21045CBE2827CB7E2004EBCB7E9E +:1002F000C85F77233605233A095C7723FD4E07FD57 +:100300005601E5CD3303E17732085CFDCB01EEC940 +:100310002336052335C03A0A5C77237E18EA421655 +:10032000007BFE27D0FE182003CB78C021050219E0 +:100330007E37C97BFE3A382F0DFA4F032803C64F8C +:10034000C921EB010428032105021600197EC921E9 +:100350002902CB4028F4CB5A280AFDCB305EC004DA +:10036000C0C620C9C6A5C9FE30D80DFA9D03201904 +:10037000215402CB6828D3FE383007D62004C8C6E3 +:1003800008C9D63604C8C6FEC9213002FE3928BACB +:10039000FE3028B6E607C68004C8EE0FC904C8CBF5 +:1003A0006821300220A4D610FE222806FE20C03E7E +:1003B0005FC93E40C9F37DCB3DCB3D2FE6034F06E1 +:1003C00000DD21D103DD093A485CE6380F0F0FF656 +:1003D00008000000040C0D20FD0E3F05C2D603EE00 +:1003E00010D3FE444FCB6720097AB32809794D1BFF +:1003F000DDE94D0CDDE9FBC9EF3127C00334EC6CBE +:10040000981FF504A10F3821925C7EA7205E234E31 +:10041000234678179FB9205423BE205078C63CF25B +:100420002504E26C0406FA04D60C30FBC60CC52188 +:100430006E04CD0634CDB433EF0438F18677EFC0C7 +:10044000023138CD941EFE0B3022EFE004E0348000 +:1004500043559F8001053435710338CD991EC5CDB4 +:10046000991EE150597AB3C81BC3B503CF0A89025C +:10047000D01286890A9760758912D5171F891B903B +:1004800041028924D053CA892E9D36B18938FF494B +:100490003E8943FF6A73894FA70054895C000000BE +:1004A000896914F6248976F11005CDFB243A3B5C6A +:1004B00087FA8A1CE1D0E5CDF12B626B0DF809CBF0 +:1004C000FEC9213F05E521801FCB7F280321980C21 +:1004D0000813DD2BF33E024710FED3FEEE0F06A4F9 +:1004E0002D20F50525F2D804062F10FED3FE3E0D73 +:1004F000063710FED3FE010E3B086FC307057AB323 +:10050000280CDD6E007CAD673E0137C325056C18F5 +:10051000F479CB7810FE3004064210FED3FE063E7E +:1005200020EF05AF3CCB15C214051BDD2306313E81 +:100530007FDBFE1FD07A3CC2FE04063B10FEC9F5ED +:100540003A485CE6380F0F0FD3FE3E7FDBFE1FFB01 +:100550003802CF0CF1C9140815F33E0FD3FE213F2A +:1005600005E5DBFE1FE620F6024FBFC0CDE70530F4 +:10057000FA21150410FE2B7CB520F9CDE30530EBF4 +:10058000069CCDE30530E43EC6B830E02420F106F9 +:10059000C9CDE70530D578FED430F4CDE705D07964 +:1005A000EE034F260006B0181F082007300FDD7538 +:1005B00000180FCB11ADC0791F4F131807DD7E0057 +:1005C000ADC0DD231B0806B22E01CDE305D03ECB26 +:1005D000B8CB1506B0D2CA057CAD677AB320CA7C09 +:1005E000FE01C9CDE705D03E163D20FDA704C83E5B +:1005F0007FDBFE1FD0A9E62028F3792F4FE607F610 +:1006000008D3FE37C9F13A745CD6E032745CCD8C05 +:100610001CCD3025283C0111003A745CA728020E3D +:1006200022F7D5DDE1060B3E20121310FCDD36016A +:10063000FFCDF12B21F6FF0B0903300F3A745CA7B5 +:100640002002CF0E78B1280A010A00DDE5E123EB94 +:10065000EDB0DFFEE420493A745CFE03CA8A1CE771 +:10066000CDB228CBF9300B2100003A745C3D28153F +:10067000CF01C28A1CCD30252818237EDD770B23BD +:100680007EDD770C23DD710E3E01CB7128013CDD50 +:100690007700EBE7FE2920DAE7CDEE1BEBC35A0724 +:1006A000FEAA201F3A745CFE03CA8A1CE7CDEE1B2B +:1006B000DD360B00DD360C1B210040DD750DDD74D1 +:1006C0000E184DFEAF204F3A745CFE03CA8A1CE739 +:1006D000CD4820200C3A745CA7CA8A1CCDE61C18B1 +:1006E0000FCD821CDFFE2C280C3A745CA7CA8A1C32 +:1006F000CDE61C1804E7CD821CCDEE1BCD991EDD86 +:10070000710BDD700CCD991EDD710DDD700E606911 +:10071000DD3600031844FECA2809CDEE1BDD360E77 +:100720008018173A745CA7C28A1CE7CD821CCDEEF4 +:100730001BCD991EDD710DDD700EDD3600002A59CE +:100740005CED5B535C37ED52DD750BDD740C2A4BB1 +:100750005CED52DD750FDD7410EB3A745CA7CA7066 +:1007600009E5011100DD09DDE5111100AF37CD56B6 +:1007700005DDE130F23EFECD0116FD3652030E805E +:10078000DD7E00DDBEEF20020EF6FE0430D911C082 +:1007900009C5CD0A0CC1DDE5D121F0FF19060A7E9D +:1007A0003C200379804F131ABE2320010CD710F68A +:1007B000CB7920B33E0DD7E1DD7E00FE03280C3A55 +:1007C000745C3DCA0808FE02CAB608E5DD6EFADDB3 +:1007D00066FBDD5E0BDD560C7CB5280DED52382630 +:1007E0002807DD7E00FE03201DE17CB52006DD6EBE +:1007F0000DDD660EE5DDE13A745CFE02372001A7EF +:100800003EFFCD5605D8CF1ADD5E0BDD560CE57CDC +:10081000B52006131313EB180CDD6EFADD66FBEB47 +:1008200037ED52380911050019444DCD051FE1DDA2 +:100830007E00A7283E7CB528132B462B4E2B0303A6 +:1008400003DD225F5CCDE819DD2A5F5C2A595C2B51 +:10085000DD4E0BDD460CC5030303DD7EFDF5CD55F6 +:100860001623F177D12373237223E5DDE1373EFFB1 +:10087000C30208EB2A595C2BDD225F5CDD4E0BDDE9 +:10088000460CC5CDE519C1E5C5CD5516DD2A5F5C21 +:1008900023DD4E0FDD461009224B5CDD660E7CE643 +:1008A000C0200ADD6E0D22425CFD360A00D1DDE17A +:1008B000373EFFC30208DD4E0BDD460CC503F7369D +:1008C00080EBD1E5E5DDE1373EFFCD0208E1ED5BF0 +:1008D000535C7EE6C020191A13BE2320021ABE1BE9 +:1008E0002B3008E5EBCDB819E118ECCD2C0918E256 +:1008F0007E4FFE80C8E52A4B5C7EFE802825B92805 +:1009000008C5CDB819C1EB18F0E6E0FEA02012D161 +:10091000D5E523131ABE20061730F7E11803E118B6 +:10092000E03EFFD1EB3C37CD2C0918C42010082243 +:100930005F5CEBCDB819CDE819EB2A5F5C0808D5F0 +:10094000CDB819225F5C2A535CE3C50838072BCD6C +:100950005516231803CD551623C1D1ED53535CED25 +:100960005B5F5CC5D5EBEDB0E1C1D5CDE819D1C970 +:10097000E53EFDCD0116AF11A109CD0A0CFDCB025C +:10098000EECDD415DDE5111100AFCDC204DDE106D9 +:10099000327610FDDD5E0BDD560C3EFFDDE1C3C29D +:1009A0000480537461727420746170652C207468C3 +:1009B000656E20707265737320616E79206B657946 +:1009C000AE0D50726F6772616D3AA00D4E756D621B +:1009D00065722061727261793AA00D43686172613B +:1009E000637465722061727261793AA00D42797404 +:1009F00065733AA0CD030BFE20D2D90AFE063869F2 +:100A0000FE183065210B0A5F1600195E19E5C30355 +:100A10000B4E57102954535237504F5F5E5D5C5B4D +:100A20005A54530C3E22B92011FDCB014E2009042B +:100A30000E023E18B82003050E21C3D90D3A915C71 +:100A4000F5FD3657013E20CD650BF132915CC9FDB5 +:100A5000CB014EC2CD0E0E21CD550C05C3D90DCD07 +:100A6000030B793D3DE610185A3E3F186C11870A7A +:100A7000320F5C180B116D0A180311870A320E5CD5 +:100A80002A515C732372C911F409CD800A2A0E5CC5 +:100A9000577DFE16DA11222029444A3E1F91380C58 +:100AA000C6024FFDCB014E20163E1690DA9F1E3C2B +:100AB0004704FDCB0246C2550CFDBE31DA860CC39D +:100AC000D90D7CCD030B813DE61FC857FDCB01C678 +:100AD0003E20CD3B0C1520F8C9CD240BFDCB014E9B +:100AE000201AFDCB02462008ED43885C22845CC9B5 +:100AF000ED438A5CED43825C22865CC9FD71452230 +:100B0000805CC9FDCB014E2014ED4B885C2A845CCF +:100B1000FDCB0246C8ED4B8A5C2A865CC9FD4E457A +:100B20002A805CC9FE80383DFE90302647CD380BC8 +:100B3000CD030B11925C184721925CCD3E0BCB1874 +:100B40009FE60F4FCB189FE6F0B10E0477230D20E0 +:100B5000FBC9D6A53009C615C5ED4B7B5C180BCD7E +:100B6000100CC3030BC5ED4B365CEB213B5CCB8615 +:100B7000FE202002CBC626006F29292909C1EB7966 +:100B80003D3E21200E054FFDCB014E2806D5CDCD93 +:100B90000ED179B9D5CC550CD1C5E53A915C06FF9B +:100BA0001F3801041F1F9F4F3E08A7FDCB014E2891 +:100BB00005FDCB30CE37EB081AA0AEA912083813CA +:100BC00014233D20F2EB25FDCB014ECCDB0BE1C124 +:100BD0000D23C9083E20835F0818E67C0F0F0FE63F +:100BE00003F65867ED5B8F5C7EABA2ABFDCB57760F +:100BF0002808E6C7CB572002EE38FDCB57662808F9 +:100C0000E6F8CB6F2002EE0777C9E52600E318046B +:100C1000119500F5CD410C38093E20FDCB0146CCA5 +:100C20003B0C1AE67FCD3B0C1A138730F5D1FE48FA +:100C30002803FE82D87AFE03D83E20D5D9D7D9D151 +:100C4000C9F5EB3CCB7E2328FB3D20F8EBF1FE20E1 +:100C5000D81AD641C9FDCB014EC011D90DD578FDAA +:100C6000CB0246C2020DFDBE31381BC0FDCB026671 +:100C70002816FD5E2D1D285A3E00CD0116ED7B3F46 +:100C80005CFDCB02A6C9CF04FD355220453E18902D +:100C9000328C5C2A8F5CE53A915CF53EFDCD011605 +:100CA000AF11F80CCD0A0CFDCB02EE213B5CCBDE84 +:100CB000CBAED9CDD415D9FE202845FEE22841F689 +:100CC00020FE6E283B3EFECD0116F132915CE12202 +:100CD0008F5CCDFE0DFD4631040E21C5CD9B0E7CF3 +:100CE0000F0F0FE603F6586711E05A1A4E0620EB75 +:100CF0001271132310FAC1C9807363726F6C6CBFD9 +:100D0000CF0CFE023880FD8631D619D0ED44C547A0 +:100D10002A8F5CE52A915CE5CD4D0D78F5216B5C61 +:100D200046783C7721895CBE3803340618CD000E26 +:100D3000F13D20E8E1FD7557E1228F5CED4B885CC9 +:100D4000FDCB0286CDD90DFDCB02C6C1C9AF2A8D20 +:100D50005CFDCB0246280467FD6E0E228F5C21915C +:100D60005C20027E0FAEE655AE77C9CDAF0D213CBB +:100D70005CCBAECBC6CD4D0DFD4631CD440E21C072 +:100D80005A3A8D5C0518070E202B770D20FB10F7C3 +:100D9000FD3631023EFDCD01162A515C11F409A742 +:100DA0007323722311A8103F38F6012117182A2146 +:100DB0000000227D5CFDCB3086CD940D3EFECD0142 +:100DC00016CD4D0D0618CD440E2A515C11F4097351 +:100DD0002372FD36520101211821005BFDCB014E2B +:100DE000201278FDCB02462805FD8631D618C5476E +:100DF000CD9B0EC13E21915F160019C3DC0A061778 +:100E0000CD9B0E0E08C5E578E60778200CEB21E0B7 +:100E1000F819EB0120003DEDB0EB21E0FF19EB47A5 +:100E2000E6070F0F0F4F780600EDB0060709E6F84A +:100E300020DBE124C10D20CDCD880E21E0FF19EB90 +:100E4000EDB00601C5CD9B0E0E08C5E578E6070F8F +:100E50000F0F4F7806000D545D360013EDB01101F1 +:100E600007193DE6F84720E5E124C10D20DCCD88D7 +:100E70000E626B133A8D5CFDCB024628033A485C48 +:100E8000770BEDB0C10E21C97C0F0F0F3DF65067F7 +:100E9000EB61682929292929444DC93E1890570F2B +:100EA0000F0FE6E06F7AE618F64067C9F306B02147 +:100EB0000040E5C5CDF40EC1E1247CE607200A7DA3 +:100EC000C6206F3F9FE6F8846710E7180DF32100F6 +:100ED0005B0608C5CDF40EC110F93E04D3FBFB211F +:100EE000005BFD7546AF47772310FCFDCB308E0EBF +:100EF00021C3D90D78FE039FE602D3FB57CD541FC3 +:100F0000380A3E04D3FBFBCDDF0ECF0CDBFB87F8AA +:100F100030EB0E205E230608CB12CB13CB1ADBFB83 +:100F20001F30FB7AD3FB10F00D20E9C92A3D5CE5A8 +:100F3000217F10E5ED733D5CCDD415F51600FD5E07 +:100F4000FF21C800CDB503F121380FE5FE1830317F +:100F5000FE07382DFE10383A01020057FE16380CF5 +:100F600003FDCB377ECA1E10CDD4155FCDD415D569 +:100F70002A5B5CFDCB0786CD5516C1237023711803 +:100F80000AFDCB07862A5B5CCD52161213ED535B2C +:100F90005CC95F160021990F195E19E52A5B5CC9CF +:100FA00009666A50B5707ECFD42A495CFDCB376E96 +:100FB000C29710CD6E19CD95167AB3CA9710E52356 +:100FC0004E2346210A0009444DCD051FCD97102A16 +:100FD000515CE3E53EFFCD0116E12BFD350FCD550C +:100FE00018FD340F2A595C23232323225B5CE1CDB7 +:100FF0001516C9FDCB376E200821495CCD0F191895 +:101000006DFD360010181DCD311018057EFE0DC87F +:1010100023225B5CC9CD3110010100C3E819CDD496 +:1010200015CDD415E1E1E1223D5CFDCB007EC0F998 +:10103000C937CD9511ED521923C1D8C5444D626B06 +:10104000231AE6F0FE102009231AD617CE0020013D +:1010500023A7ED4209EB38E6C9FDCB376EC02A491C +:101060005CCD6E19EBCD9516214A5CCD1C19CD9542 +:10107000173E00C30116FDCB377E28A8C3810FFDA4 +:10108000CB306628A1FD3600FF1600FD5EFE2190E4 +:101090001ACDB503C3300FE5CD90112BCDE5192244 +:1010A0005B5CFD360700E1C9FDCB025EC41D11A7E4 +:1010B000FDCB016EC83A085CFDCB01AEF5FDCB025D +:1010C0006EC46E0DF1FE203052FE10302DFE063043 +:1010D0000A47E6014F781FC612182A2009216A5CC8 +:1010E0003E08AE77180EFE0ED8D60D21415CBE77B5 +:1010F00020023600FDCB02DEBFC947E6074F3E1097 +:10110000CB5820013CFD71D3110D1118063A0D5C2E +:1011100011A8102A4F5C232373237237C9CD4D0DBC +:10112000FDCB029EFDCB02AE2A8A5CE52A3D5CE542 +:10113000216711E5ED733D5C2A825CE537CD9511A1 +:10114000EBCD7D18EBCDE1182A8A5CE3EBCD4D0D9C +:101150003A8B5C92382620067BFD9650301E3E204E +:10116000D5CDF409D118E91600FD5EFE21901ACD07 +:10117000B503FD3600FFED5B8A5C1802D1E1E12288 +:101180003D5CC1D5CDD90DE122825CFD362600C97A +:101190002A615C2BA7ED5B595CFDCB376EC8ED5B1C +:1011A000615CD82A635CC97EFE0E010600CCE8199A +:1011B0007E23FE0D20F1C9F33EFFED5BB25CD9ED5D +:1011C0004BB45CED5B385C2A7B5CD9473E07D3FEB1 +:1011D0003E3FED47000000000000626B36022BBC72 +:1011E00020FAA7ED52192330063528033528F32BB2 +:1011F000D9ED43B45CED53385C227B5CD9042819EB +:1012000022B45C11AF3E01A800EBEDB8EB23227BCA +:101210005C2B014000ED43385C22B25C21003C2293 +:10122000365C2AB25C363E2BF92B2B223D5CED5608 +:10123000FD213A5CFB21B65C224F5C11AF15011514 +:1012400000EBEDB0EB2B22575C2322535C224B5C6E +:1012500036802322595C360D2336802322615C229E +:10126000635C22655C3E38328D5C328F5C32485C58 +:1012700021230522095CFD35C6FD35CA21C615119D +:10128000105C010E00EDB0FDCB01CECDDF0EFD36C2 +:101290003102CD6B0DAF113815CD0A0CFDCB02EE2E +:1012A0001807FD363102CD9517CDB0163E00CD01A1 +:1012B00016CD2C0FCD171BFDCB007E2012FDCB30A1 +:1012C0006628402A595CCDA711FD3600FF18DD2A9B +:1012D000595C225D5CCDFB1978B1C25D15DFFE0D56 +:1012E00028C0FDCB3046C4AF0DCD6E0D3E19FD9626 +:1012F0004F328C5CFDCB01FEFD3600FFFD360A014E +:10130000CD8A1B76FDCB01AEFDCB304EC4CD0E3A5F +:101310003A5C3CF5210000FD7437FD7426220B5C1D +:1013200021010022165CCDB016FDCB37AECD6E0D7F +:10133000FDCB02EEF147FE0A3802C607CDEF153E9F +:1013400020D778119113CD0A0CAF113615CD0A0CA8 +:10135000ED4B455CCD1B1A3E3AD7FD4E0D0600CD38 +:101360001B1ACD97103A3A5C3C281BFE092804FE54 +:10137000152003FD340D01030011705C21445CCB8A +:101380007E280109EDB8FD360AFFFDCB019EC3ACF6 +:1013900012804FCB4E45585420776974686F75742E +:1013A00020464FD25661726961626C65206E6F741F +:1013B00020666F756EE45375627363726970742092 +:1013C00077726F6EE74F7574206F66206D656D6F75 +:1013D00072F94F7574206F66207363726565EE4E07 +:1013E000756D62657220746F6F206269E7524554B3 +:1013F00055524E20776974686F757420474F535566 +:10140000C2456E64206F662066696CE553544F5088 +:101410002073746174656D656EF4496E76616C69F4 +:101420006420617267756D656EF4496E74656765F9 +:1014300072206F7574206F662072616E67E54E6F63 +:101440006E73656E736520696E2042415349C342D5 +:101450005245414B202D20434F4E542072657065FC +:101460006174F34F7574206F6620444154C1496E16 +:1014700076616C69642066696C65206E616DE54E0D +:101480006F20726F6F6D20666F72206C696EE5530E +:10149000544F5020696E20494E5055D4464F52202B +:1014A000776974686F7574204E4558D4496E7661BB +:1014B0006C696420492F4F206465766963E5496E45 +:1014C00076616C696420636F6C6F75F242524541BE +:1014D0004B20696E746F2070726F677261ED5241BC +:1014E0004D544F50206E6F20676F6FE453746174DA +:1014F000656D656E74206C6F73F4496E76616C690E +:1015000064207374726561ED464E20776974686F6C +:101510007574204445C6506172616D6574657220B2 +:101520006572726FF254617065206C6F6164696EF0 +:1015300067206572726FF22CA07F2031393832201B +:1015400053696E636C616972205265736561726381 +:1015500068204C74E43E10010000C31313ED4349AE +:101560005C2A5D5CEB215515E52A615C37ED52E59F +:101570006069CD6E192006CDB819CDE819C1793D45 +:10158000B02828C5030303032BED5B535CD5CD5571 +:1015900016E122535CC1C5132A615C2B2BEDB82ADE +:1015A000495CEBC1702B712B732B72F1C3A212F447 +:1015B00009A8104BF409C41553810FC41552F4093E +:1015C000C4155080CF12010006000B00010001007D +:1015D00006001000FDCB026E2004FDCB02DECDE63E +:1015E00015D828FACF07D9E52A515C232318081EFD +:1015F0003083D9E52A515C5E2356EBCD2C16E1D918 +:10160000C987C6166F265C5E23567AB32002CF17B1 +:101610001B2A4F5C1922515CFDCB30A623232323C8 +:101620004E212D16CDDC16D016005E19E94B06535F +:1016300012501B00FDCB02C6FDCB01AEFDCB30E648 +:101640001804FDCB0286FDCB018EC34D0DFDCB01F1 +:10165000CEC9010100E5CD051FE1CD64162A655C08 +:10166000EBEDB8C9F5E5214B5C3E0E5E2356E3A7D2 +:10167000ED5219E33009D5EB09EB722B7323D1231B +:101680003D20E8EBD1F1A7ED52444D0319EBC90021 +:1016900000EB118F167EE6C020F756235EC92A6341 +:1016A0005C2BCD55162323C1ED43615CC1EB23C9EF +:1016B0002A595C360D225B5C2336802322615C2A2A +:1016C000615C22635C2A635C22655CE521925C229A +:1016D000685CE1C9ED5B595CC3E519237EA7C8B915 +:1016E0002320F837C9CD1E17CD011701000011E2E4 +:1016F000A3EB19380701D415094E2346EB7123706B +:10170000C9E52A4F5C092323234EEB211617CDDCB4 +:10171000164E060009E94B0553035001E1C9CD946B +:101720001EFE103802CF17C6030721105C4F0600BB +:10173000094E23462BC9EF0138CD1E1778B1281664 +:10174000EB2A4F5C092323237EEBFE4B2808FE5334 +:101750002804FE5020CFCD5D17732372C9E5CDF16B +:101760002B78B12002CF0EC51AE6DF4F217A17CDB4 +:10177000DC1630F14E060009C1E94B065308500A49 +:10178000001E0118061E0618021E100B78B120D587 +:1017900057E1C91890ED733F5CFD360210CDAF0DD7 +:1017A000FDCB02C6FD4631CD440EFDCB0286FDCBFE +:1017B00030C62A495CED5B6C5CA7ED52193822D526 +:1017C000CD6E1911C002EBED52E3CD6E19C1C5CD3E +:1017D000B819C109380EEB56235E2BED536C5C181B +:1017E000ED226C5C2A6C5CCD6E192801EBCD3318B0 +:1017F000FDCB02A6C93E0318023E02FD360200CD13 +:101800003025C40116DFCD70203814DFFE3B2804DC +:10181000FE2C2006E7CD821C1808CDE61C1803CD4F +:10182000DE1CCDEE1BCD991E78E63F676922495C30 +:10183000CD6E191E01CD5518D7FDCB026628F63A9C +:101840006B5CFD964F20EEABC8E5D5216C5CCD0FEF +:1018500019D1E118E0ED4B495CCD8019163E280501 +:10186000110000CB13FD732D7EFE40C1D0C5CD28E5 +:101870001A232323FDCB01867AA72805D7FDCB01A8 +:10188000C6D5EBFDCB3096213B5CCB96FDCB376EBE +:101890002802CBD62A5F5CA7ED5220053E3FCDC182 +:1018A00018CDE118EB7ECDB61823FE0D2806EBCD42 +:1018B000371918E0D1C9FE0EC02323232323237E2A +:1018C000C9D92A8F5CE5CBBCCBFD228F5C21915C12 +:1018D00056D53600CDF409E1FD7457E1228F5CD96D +:1018E000C92A5B5CA7ED52C03A415CCB072804C60D +:1018F000431816213B5CCB9E3E4BCB56280BCBDED0 +:101900003CFDCB305E28023E43D5CDC118D1C95E27 +:101910002356E5EB23CD6E19CD9516E1FDCB376E41 +:10192000C0722B73C97BA7F8180DAF093C38FCEDCA +:10193000423D28F1C3EF15CD1B2D3030FE21382C50 +:10194000FDCB0196FECB2824FE3A200EFDCB376E50 +:101950002016FDCB30562814180EFE22200AF53A28 +:101960006A5CEE04326A5CF1FDCB01D6D7C9E52A88 +:10197000535C545DC1CD8019D0C5CDB819EB18F4B6 +:101980007EB8C0237E2BB9C9232323225D5C0E00C1 +:1019900015C8E7BB2004A7C9237ECDB618225D5C1D +:1019A000FE2220010DFE3A2804FECB2004CB412864 +:1019B000DFFE0D20E31537C9E57EFE403817CB6FFB +:1019C000281487FAC7193F01050030020E121723A9 +:1019D0007E30FB180623234E23462309D1A7ED5260 +:1019E000444D19EBC9CDDD19C5782F47792F4F0329 +:1019F000CD6416EBE119D5EDB0E1C92A595C2B2273 +:101A00005D5CE721925C22655CCD3B2DCDA22D383B +:101A10000421F0D809DA8A1CC3C516D5E5AFCB7806 +:101A2000202060691EFF1808D556235EE5EB1E20B6 +:101A30000118FCCD2A19019CFFCD2A190EF6CD2ADA +:101A4000197DCDEF15E1D1C9B1CBBCBFC4AFB49303 +:101A5000919295989898989898987F812E6C6E702E +:101A60004894563F412B171F3777440F592B432D6E +:101A7000513A6D420D495C44155D013D0206006717 +:101A80001E06CB05F01C0600ED1E00EE1C00231FF9 +:101A9000043D06CC0605031D0400AB1D05CD1F0546 +:101AA000892005022C05B21B00B71103A11E05F900 +:101AB000170800801E034F1E005F1E03AC1E006B44 +:101AC0000D0900DC2206003A1F05ED1D05271E0347 +:101AD000421E0905822300AC0E05C91F05F5170B30 +:101AE0000B0B0B0800F8030905202307070707075E +:101AF0000708007A1E0600942205601F062C0A00C3 +:101B000036170600E5160A0093170A2C0A009317E9 +:101B10000A009317009317FDCB01BECDFB19AF321E +:101B2000475C3D323A5C1801E7CDBF16FD340DFA33 +:101B30008A1CDF0600FE0D287AFE3A28EB21761B70 +:101B4000E54FE779D6CEDA8A1C4F21481A094E09AB +:101B500018032A745C7E2322745C01521BC54FFE5D +:101B600020300C21011C0600094E09E5DF05C9DF04 +:101B7000B9C28A1CE7C9CD541F3802CF14FDCB0A65 +:101B80007E20712A425CCB7C281421FEFF22455C1A +:101B90002A615C2BED5B595C1B3A445C1833CD6EBB +:101BA000193A445C2819A72043477EE6C078280FDD +:101BB000CFFFC1CD3025C82A555C3EC0A6C0AFFEC0 +:101BC00001CE0056235EED53455C235E2356EB1990 +:101BD0002322555CEB225D5C571E00FD360AFF1583 +:101BE000FD720DCA281B14CD8B192808CF16CD30D5 +:101BF00025C0C1C1DFFE0D28BAFE3ACA281BC38A20 +:101C00001C0F1D4B09670B7B8E71B481CFCDDE1C81 +:101C1000BFC1CCEE1BEB2A745C4E2346EBC5C9CD8D +:101C2000B228FD3637003008FDCB37CE2018CF0163 +:101C3000CC9629FDCB0176200DAFCD3025C4F12BFC +:101C400021715CB677EBED43725C224D5CC9C1CD6E +:101C5000561CCDEE1BC93A3B5CF5CDFB24F1FD567D +:101C600001AAE6402024CB7AC2FF2AC9CDB228F5CA +:101C700079F69F3C2014F118A9E7CD821CFE2C2098 +:101C800009E7CDFB24FDCB0176C0CF0BCDFB24FDB6 +:101C9000CB0176C818F4FDCB017EFDCB0286C44D86 +:101CA0000DF13A745CD613CDFC21CDEE1B2A8F5C6E +:101CB000228D5C21915C7E07AEE6AAAE77C9CD305D +:101CC000252813FDCB0286CD4D0D21905C7EF6F8C4 +:101CD00077FDCB57B6DFCDE221189FC30506FE0D79 +:101CE0002804FE3A209CCD3025C8EFA038C9CF0883 +:101CF000C1CD3025280AEF0238EBCDE934DAB31B29 +:101D0000C3291BFECD2009E7CD821CCDEE1B180692 +:101D1000CDEE1BEFA138EFC00201E00138CDFF2A64 +:101D200022685C2B7ECBFE010600090738060E0DEB +:101D3000CD551623E5EF020238E1EB0E0AEDB02A8D +:101D4000455CEB732372FD560D142372CDDA1DD062 +:101D5000FD46382A455C22425C3A475CED44572AEE +:101D60005D5C1EF3C5ED4B555CCD861DED43555CAA +:101D7000C13811E7F620B82803E718E8E73E0192DA +:101D800032445CC9CF117EFE3A2818237EE6C03764 +:101D9000C046234EED43425C234E2346E509444DA5 +:101DA000E11600C5CD8B19C1D018E0FDCB374EC26E +:101DB0002E1C2A4D5CCB7E281F2322685CEFE0E2BC +:101DC0000FC00238CDDA1DD82A685C110F00195EE9 +:101DD00023562366EBC3731ECF00EFE1E0E236002B +:101DE00002010337000438A7C93837C9E7CD1F1CE3 +:101DF000CD30252829DF225F5C2A575C7EFE2C2807 +:101E0000091EE4CD861D3002CF0DCD7700CD561CC6 +:101E1000DF22575C2A5F5CFD362600CD7800DFFEAE +:101E20002C28C9CDEE1BC9CD3025200BCDFB24FEBF +:101E30002CC4EE1BE718F53EE447EDB9110002C3D0 +:101E40008B19CD991E6069CD6E192B22575CC9CDB7 +:101E5000991E78B12004ED4B785CED43765CC92A7D +:101E60006E5CFD5636180CCD991E606916007CFE1E +:101E7000F0302C22425CFD720AC9CD851EED79C975 +:101E8000CD851E02C9CDD52D38152802ED44F5CDDE +:101E9000991EF1C9CDD52D1803CDA22D3801C8CF7B +:101EA0000ACD671E010000CD451E1803CD991E788E +:101EB000B12004ED4BB25CC5ED5B4B5C2A595C2B49 +:101EC000CDE519CD6B0D2A655C11320019D1ED52AB +:101ED00030082AB45CA7ED523002CF15EB22B25C79 +:101EE000D1C1363E2BF9C5ED733D5CEBE9D1FD6602 +:101EF0000D24E333ED4B455CC5E5ED733D5CD5CD7D +:101F0000671E0114002A655C09380AEB215000198C +:101F10003803ED72D82E03C35500010000CD051F14 +:101F2000444DC9C1E1D17AFE3E280B3BE3EBED7392 +:101F30003D5CC5C3731ED5E5CF06CD991E760B78E3 +:101F4000B1280C78A13C200103FDCB016E28EEFDE9 +:101F5000CB01AEC93E7FDBFE1FD83EFEDBFE1FC9B4 +:101F6000CD302528053ECEC3391EFDCB01F6CD8DE3 +:101F70002C3016E7FE242005FDCB01B6E7FE282015 +:101F80003CE7FE292820CD8D2CD28A1CEBE7FE24CD +:101F90002002EBE7EB010600CD55162323360EFE9B +:101FA0002C2003E718E0FE292013E7FE3D200EE772 +:101FB0003A3B5CF5CDFB24F1FDAE01E640C28A1C44 +:101FC000CDEE1BCD3025E1C8E93E0318023E02CD1F +:101FD0003025C40116CD4D0DCDDF1FCDEE1BC9DF61 +:101FE000CD4520280DCD4E2028FBCDFC1FCD4E2009 +:101FF00028F3FE29C8CDC31F3E0DD7C9DFFEAC2094 +:102000000DCD791CCDC31FCD07233E161810FEAD94 +:102010002012E7CD821CCDC31FCD991E3E17D77964 +:10202000D778D7C9CDF221D0CD7020D0CDFB24CD2B +:10203000C31FFDCB0176CCF12BC2E32D78B10BC8C9 +:102040001A13D718F7FE29C8FE0DC8FE3AC9DFFEDD +:102050003B2814FE2C200ACD3025280B3E06D7182D +:1020600006FE27C0CDF51FE7CD45202001C1BFC921 +:10207000FE2337C0E7CD821CA7CDC31FCD941EFE23 +:1020800010D20E16CD0116A7C9CD302528083E0165 +:10209000CD0116CD6E0DFD360201CDC120CDEE1B5A +:1020A000ED4B885C3A6B5CB838030E2147ED4388F2 +:1020B0005C3E1990328C5CFDCB0286CDD90DC36E8F +:1020C0000DCD4E2028FBFE28200EE7CDDF1FDFFEC2 +:1020D00029C28A1CE7C3B221FECA2011E7CD1F1C0A +:1020E000FDCB37FEFDCB0176C28A1C180DCD8D2CA1 +:1020F000D2AF21CD1F1CFDCB37BECD3025CAB221BA +:10210000CDBF1621715CCBB6CBEE010100CB7E209A +:102110000B3A3B5CE64020020E03B677F7360D79AA +:102120000F0F30053E22122B77225B5CFDCB377EF2 +:10213000202C2A5D5CE52A3D5CE5213A21E5FDCBBA +:1021400030662804ED733D5C2A615CCDA711FD3635 +:1021500000FFCD2C0FFDCB01BECDB9211803CD2C36 +:102160000FFD362200CDD621200ACD1D11ED4B8268 +:102170005CCDD90D21715CCBAECB7ECBBE201CE1FA +:10218000E1223D5CE1225F5CFDCB01FECDB9212A5D +:102190005F5CFD362600225D5C18172A635CED5BF0 +:1021A000615C37ED52444DCDB22ACDFF2A1803CDE4 +:1021B000FC1FCD4E20CAC120C92A615C225D5CDFB4 +:1021C000FEE2280C3A715CCD591CDFFE0DC8CF0B26 +:1021D000CD3025C8CF102A515C232323237EFE4B0C +:1021E000C9E7CDF221D8DFFE2C28F6FE3B28F2C34A +:1021F0008A1CFED9D8FEDF3FD8F5E7F1D6C9F5CD68 +:10220000821CF1A7CDC31FF5CD941E57F1D77AD705 +:10221000C9D611CE00281DD602CE002856FE017A5E +:1022200006012004070706044F7AFE0230167921C2 +:10223000915C18387A0607380507070706384F7A81 +:10224000FE0A3802CF13218F5CFE08380B7E280768 +:10225000B02FE6242801784F79CD6C223E07BA9F33 +:10226000CD6C220707E650473E08BA9FAEA0AE7776 +:102270002378C99F7A0F068020030F06404F7AFE0D +:10228000082804FE0230BD79218F5CCD6C22790FC5 +:102290000F0F18D8CD941EFE0830A9D3FE070707EC +:1022A000CB6F2002EE0732485CC93EAF90DAF924CA +:1022B00047A71F371FA71FA8E6F8A86779070707D2 +:1022C000A8E6C7A807076F79E607C9CD0723CDAAF7 +:1022D0002247047E0710FDE601C3282DCD0723CD3C +:1022E000E522C34D0DED437D5CCDAA2247043EFEA1 +:1022F0000F10FD477EFD4E57CB412001A0CB512052 +:1023000002A82F77C3DB0BCD142347C5CD14235967 +:10231000C1514FC9CDD52DDAF9240E01C80EFFC920 +:10232000DFFE2CC28A1CE7CD821CCDEE1BEF2A3DBE +:10233000387EFE813005EF023818A1EFA3383683CE +:10234000EFC50238CD7D24C5EF31E104387EFE8033 +:102350003008EF020238C1C3DC22EFC201C0020321 +:1023600001E00FC00131E00131E0A0C10238FD34CD +:1023700062CD941E6FE5CD941EE167227D5CC1C3E2 +:102380002024DFFE2C2806CDEE1BC37724E7CD8268 +:102390001CCDEE1BEFC5A2041F3130300006023801 +:1023A000C37724C002C102312AE101E12A0FE0050E +:1023B0002AE0013D387EFE813007EF020238C37704 +:1023C00024CD7D24C5EF02E10105C1020131E10404 +:1023D000C2020131E104E2E5E003A204311FC502BB +:1023E00020C002C202C1E504E0E2040FE101C10223 +:1023F000E004E2E50403C22AE12A0F02381AFE8152 +:10240000C1DA7724C5EF01383A7D5CCD282DEFC0C5 +:102410000F01383A7E5CCD282DEFC50FE0E538C1BD +:1024200005283C1814EFE131E304E2E40403C1029F +:10243000E404E2E3040FC20238C5EFC002E10F3149 +:10244000383A7D5CCD282DEF03E0E20FC001E03883 +:102450003A7E5CCD282DEF0338CDB724C110C6EFEE +:10246000020201383A7D5CCD282DEF0301383A7E17 +:102470005CCD282DEF0338CDB724C34D0DEF3128A7 +:102480003432000105E501052A38CDD52D3806E6A0 +:10249000FCC60430023EFCF5CD282DEFE5010531E8 +:1024A0001FC40231A2041FC101C0023104310FA1B7 +:1024B000031BC30238C1C9CD072379B8300669D5DB +:1024C000AF5F1807B1C86841D5160060781F85381E +:1024D00003BC3807944FD9C1C518044FD5D9C12AB8 +:1024E0007D5C788447793C85380D280D3D4FCDE5DE +:1024F00022D97910D9D1C928F3CF0ADF0600C54FF8 +:10250000219625CDDC1679D2842606004E09E9CD28 +:10251000740003FE0DCA8A1CFE2220F3CD7400FE57 +:1025200022C9E7FE282006CD791CDFFE29C28A1CBD +:10253000FDCB017EC9CD07232A365C110001197934 +:102540000F0F0FE6E0A85F79E618EE40570660C56A +:10255000D5E51AAE28043C201A3D4F060714231A6D +:10256000AEA9200F10F7C1C1C13E8090010100F754 +:1025700012180AE111080019D1C110D348C3B22AB8 +:10258000CD0723790F0F0F4FE6E0A86F79E603EE32 +:1025900058677EC3282D221C284F2EF22B12A856D6 +:1025A000A557A784A68FC4E6AABFABC7A9CE00E7EC +:1025B000C3FF24DF23E5010000CD0F25201BCD0F35 +:1025C0002528FBCD30252811F7E1D57E231213FEF7 +:1025D0002220F87E23FE2228F20BD1213B5CCBB6D1 +:1025E000CB7EC4B22AC31227E7CDFB24FE29C28AC0 +:1025F0001CE7C31227C3BD27CD30252828ED4B7615 +:102600005CCD2B2DEFA10F34371604348041000030 +:10261000803202A1033138CDA22DED43765C7EA736 +:102620002803D610771809CD30252804EFA33834B5 +:10263000E7C3C326015A10E7FE23CA0D27213B5CDE +:10264000CBB6CB7E281FCD8E020E002013CD1E03ED +:10265000300E155FCD3303F5010100F7F1120E01C5 +:102660000600CDB22AC31227CD2225C43525E7C3E3 +:10267000DB25CD2225C48025E71848CD2225C4CBF3 +:1026800022E7183FCD882C3056FE41303CCD302516 +:102690002023CD9B2CDF010600CD551623360E23BB +:1026A000EB2A655C0E05A7ED4222655CEDB0EB2BD5 +:1026B000CD7700180EDF237EFE0E20FA23CDB43333 +:1026C000225D5CFDCB01F61814CDB228DA2E1CCCAD +:1026D00096293A3B5CFEC0380423CDB4331833014D +:1026E000DB09FE2D2827011810FEAE2820D6AFDA10 +:1026F0008A1C01F004FE142814D28A1C0610C6DCC1 +:102700004FFEDF3002CBB1FEEE3802CBB9C5E7C3D6 +:10271000FF24DFFE28200CFDCB01762017CD522AA6 +:10272000E718F006004F219527CDDC1630064E2124 +:10273000ED260946D17AB8383AA7CA1800C5213B18 +:102740005C7BFEED2006CB7620021E99D5CD302590 +:1027500028097BE63F47EF3B3818097BFDAE01E6D1 +:1027600040C28A1CD1213B5CCBF6CB7B2002CBB68E +:10277000C118C1D579FDCB01762015E63FC6084FBB +:10278000FE102004CBF1180838D7FE172802CBF929 +:10279000C5E7C3FF242BCF2DC32AC42FC55EC63D7A +:1027A000CE3ECC3CCDC7C9C8CAC9CBC5C7C6C80078 +:1027B0000608080A020305050505050506CD3025AE +:1027C0002035E7CD8D2CD28A1CE7FE24F52001E7C9 +:1027D000FE282012E7FE292810CDFB24DFFE2C2046 +:1027E00003E718F5FE29C28A1CE7213B5CCBB6F152 +:1027F0002802CBF6C31227E7E6DF47E7D6244F20AF +:1028000001E7E7E52A535C2B11CE00C5CD861DC13B +:102810003002CF18E5CDAB28E6DFB82008CDAB28D5 +:10282000D624B9280CE12B110002C5CD8B19C11893 +:10283000D7A7CCAB28D1D1ED535D5CCDAB28E5FE5D +:10284000292842237EFE0E164028072BCDAB2823D5 +:10285000160023E5D5CDFB24F1FDAE01E640202B8B +:10286000E1EB2A655C010500ED4222655CEDB0EB11 +:102870002BCDAB28FE29280DE5DFFE2C200DE7E14E +:10288000CDAB2818BEE5DFFE292802CF19D1EB22F7 +:102890005D5C2A0B5CE3220B5CD5E7E7CDFB24E112 +:1028A000225D5CE1220B5CE7C31227237EFE213808 +:1028B000FAC9FDCB01F6DFCD8D2CD28A1CE5E61FCF +:1028C0004FE7E5FE282828CBF1FE242811CBE9CDDF +:1028D000882C300FCD882C3016CBB1E718F6E7FDE9 +:1028E000CB01B63A0C5CA72806CD3025C251294150 +:1028F000CD3025200879E6E0CBFF4F18372A4B5C16 +:102900007EE67F282DB920221787F23F293830D163 +:10291000D5E5231A13FE2028FAF620BE28F4F68007 +:10292000BE20061ACD882C3015E1C5CDB819EBC1F3 +:1029300018CECBF8D1DFFE282809CBE8180DD1D16D +:10294000D1E5DFCD882C3003E718F8E1CB10CB7050 +:10295000C92A0B5C7EFE29CAEF287EF66047237EDB +:10296000FE0E28072BCDAB2823CBA878B92812233D +:1029700023232323CDAB28FE29CAEF28CDAB28186B +:10298000D9CB69200C23ED5B655CCDC033EB2265B0 +:102990005CD1D1AF3CC9AF47CB79204BCB7E200E69 +:1029A0003C234E234623EBCDB22ADFC3492A2323FF +:1029B0002346CB71280A0528E8EBDFFE282061EBCF +:1029C000EB1824E5DFE1FE2C2820CB792852CB71CF +:1029D0002006FE29203CE7C9FE29286CFECC2032C7 +:1029E000DF2B225D5C185E210000E5E7E179FEC087 +:1029F0002009DFFE292851FECC28E5C5E5CDEE2AC9 +:102A0000E3EBCDCC2A38190BCDF42A09D1C110B390 +:102A1000CB792066E5CB712013424BDFFE292802DB +:102A2000CF02E7E1110500CDF42A09C9CDEE2AE372 +:102A3000CDF42AC10923424BEBCDB12ADFFE292870 +:102A400007FE2C20DBCD522AE7FE2828F8FDCB011B +:102A5000B6C9CD3025C4F12BE7FE292850D5AFF5F6 +:102A6000C5110100DFE1FECC2817F1CDCD2AF550CC +:102A700059E5DFE1FECC2809FE29C28A1C626B18E9 +:102A800013E5E7E1FE29280CF1CDCD2AF5DF6069D9 +:102A9000FE2920E6F1E3192BE3A7ED5201000038EF +:102AA0000723A7FA202A444DD1FDCB01B6CD30250E +:102AB000C8AFFDCB01B6C5CDA933C12A655C77236C +:102AC000732372237123702322655CC9AFD5E5F5AA +:102AD000CD821CF1CD30252812F5CD991ED178B1CB +:102AE000372805E1E5A7ED427ADE00E1D1C9EB2305 +:102AF0005E2356C9CD3025C8CDA930DA151FC92AA5 +:102B00004D5CFDCB374E285E01050003237EFE2081 +:102B100028FA300BFE103811FE16300D2318EDCDBB +:102B2000882C38E7FE24CAC02B792A595C2BCD5556 +:102B3000162323EBD52A4D5C1BD606472811237E8E +:102B4000FE2138FAF620131210F4F680123EC02A45 +:102B50004D5CAEF620E1CDEA2BE5EF0238E1010550 +:102B600000A7ED421840FDCB01762806110600199A +:102B700018E72A4D5CED4B725CFDCB374620307870 +:102B8000B1C8E5F7D5C5545D233620EDB8E5CDF1E4 +:102B90002BE1E3A7ED42093002444DE3EB78B12885 +:102BA00002EDB0C1D1E1EB78B1C8D5EDB0E1C92BF0 +:102BB0002B2B7EE5C5CDC62BC1E1030303C3E8196A +:102BC0003EDF2A4D5CA6F5CDF12BEB09C52B224D3E +:102BD0005C0303032A595C2BCD55162A4D5CC1C5F5 +:102BE00003EDB8EB23C1702B71F12B772A595C2BC5 +:102BF000C92A655C2B462B4E2B562B5E2B7E2265FD +:102C00005CC9CDB228C28A1CCD30252008CBB1CDFD +:102C10009629CDEE1B3808C5CDB819CDE819C1CB22 +:102C2000F90600C5210100CB7120022E05EBE72635 +:102C3000FFCDCC2ADA202AE1C524E56069CDF42A4B +:102C4000EBDFFE2C28E8FE2920BBE7C179682600CF +:102C500023232919DA151FD5C5E5444D2A595C2BC4 +:102C6000CD55162377C10B0B0B23712370C178232D +:102C700077626B1B3600CB7128023620C1EDB8C1DC +:102C8000702B712B3D20F8C9CD1B2D3FD8FE413F45 +:102C9000D0FE5BD8FE613FD0FE7BC9FEC420191177 +:102CA0000000E7D631CE00200AEB3FED6ADAAD3105 +:102CB000EB18EF424BC32B2DFE2E280FCD3B2DFEE4 +:102CC0002E2028E7CD1B2D3822180AE7CD1B2DDA40 +:102CD0008A1CEFA038EFA1C00238DFCD222D380BBF +:102CE000EFE0A405C0040F38E718EFFE452803FE07 +:102CF00065C006FFE7FE2B2805FE2D200204E7CD68 +:102D00001B2D38CBC5CD3B2DCDD52DC1DAAD31A78F +:102D1000FAAD31042802ED44C34F2DFE30D8FE3AFF +:102D20003FC9CD1B2DD8D6304F0600FD213A5CAFF0 +:102D30005F514847CDB62AEF38A7C9F5EFA038F163 +:102D4000CD222DD8EF01A4040F38CD740018F1075F +:102D50000F30022F3CF521925CCD0B35EFA438F1FA +:102D6000CB3F300DF5EFC1E0000404330205E1383C +:102D7000F12808F5EF310438F118E5EF0238C923DE +:102D80004E237EA9915F237E89A957C90E00E5369F +:102D9000002371237BA99177237A89A977233600B1 +:102DA000E1C9EF387EA72805EFA20F2738EF0238D8 +:102DB000E5D5EB46CD7F2DAF90CB79424B7BD1E172 +:102DC000C957179F5F4FAF47CDB62AEF34EF1A2090 +:102DD0009A85042738CDA22DD8F505042803F137AC +:102DE000C9F1C9EF3136000B3137000D02383E30E2 +:102DF000D7C92A383E2DD7EFA0C3C4C50238D9E5BC +:102E0000D9EF3127C203E201C202387EA72047CDA5 +:102E10007F2D06107AA72006B32809530608D5D9B6 +:102E2000D1D91857EFE2387ED67ECDC12D573AACB6 +:102E30005C9232AC5C7ACD4F2DEF3127C103E13883 +:102E4000CDD52DE532A15C3D179F3C21AB5C7723AE +:102E50008677E1C3CF2ED680FE1C3813CDC12DD688 +:102E6000074721AC5C867778ED44CD4F2D1892EB67 +:102E7000CDBA2FD9CBFA7DD9D68047CB23CB12D967 +:102E8000CB13CB12D921AA5C0E057E8F27772B0D91 +:102E900020F810E7AF21A65C11A15C0609ED6F0ECA +:102EA000FFED6F20040D0C200A1213FD3471FD3468 +:102EB000720E00CB4028012310E73AAB5CD60938EC +:102EC0000AFD35713E04FDBE6F1841EF02E238EB9A +:102ED000CDBA2FD93E80952E00CBFAD9CDDD2FFD6E +:102EE0007E71FE083806D9CB12D918200100027B6A +:102EF000CD8B2F5F7ACD8B2F57C5D9C110F121A172 +:102F00005C79FD4E710977FD347118D3F521A15C10 +:102F1000FD4E7106000941F12B7ECE0077A72805F2 +:102F2000FE0A3F300810F1360104FD3472FD707165 +:102F3000EF0238D9E1D9ED4BAB5C21A15C78FE09F9 +:102F40003804FEFC3826A7CCEF15AF90FA522F4775 +:102F5000180C79A728037E230DCDEF1510F479A75F +:102F6000C8043E2ED73E3010FB4118E6501506012E +:102F7000CD4A2F3E45D74A79A7F2832FED444F3EE5 +:102F80002D18023E2BD70600C31B1AD56F26005DF5 +:102F9000542929192959194C7DD1C97E3600A7C851 +:102FA00023CB7ECBFE2BC8C501050009414F372B33 +:102FB0007E2FCE007710F879C1C9E5F54E2346770C +:102FC00023794EC5234E2346EB575ED52356235E09 +:102FD000D5D9D1E1C1D92356235EF1E1C9A7C8FEF5 +:102FE000213016C547D9CB2DCB1ACB1BD9CB1ACB49 +:102FF0001B10F2C1D0CD0430C0D9AF2E00575DD91F +:10300000110000C91CC014C0D91C200114D9C9EB7F +:10301000CD6E34EB1AB62026D523E5235E23562346 +:1030200023237E234E2346E1EB09EB8E0FCE0020B7 +:103030000B9F77237323722B2B2BD1C92BD1CD93CD +:1030400032D9E5D9D5E5CD9B2F47EBCD9B2F4FB896 +:1030500030037841EBF590CDBA2FCDDD2FF1E1773C +:10306000E5686119D9EBED4AEB7C8D6F1FADD9EBAB +:10307000E11F30083E01CDDD2F342823D97DE680C5 +:10308000D923772B281F7BED443F5F7A2FCE005743 +:10309000D97B2FCE005F7A2FCE0030071FD934CADC +:1030A000AD31D957D9AFC35531C506107C4D21007C +:1030B0000029380ACB1117300319380210F3C1C99F +:1030C000CDE934D823AECBFE2BC91AB62022D5E5E4 +:1030D000D5CD7F2DEBE341CD7F2D78A94FE1CDA953 +:1030E00030EBE1380A7AB320014FCD8E2DD1C9D112 +:1030F000CD9332AFCDC030D8D9E5D9D5EBCDC030E6 +:10310000EB385AE5CDBA2F78A7ED62D9E5ED62D953 +:1031100006211811300519D9ED5AD9D9CB1CCB1D70 +:10312000D9CB1CCB1DD9CB18CB19D9CB191F10E487 +:10313000EBD9EBD9C1E178812001A73D3F173F1FB3 +:10314000F246313068A73C20083806D9CB7AD9201E +:103150005C77D978D930157EA73E802801AFD9A2F7 +:10316000CDFB2F0777382E23772B18290620D9CBB4 +:103170007AD9201207CB13CB12D9CB13CB12D93566 +:1031800028D710EA18D717300CCD04302007D916ED +:1031900080D9342818E523D9D5D9C17817CB161F83 +:1031A00077237123722373E1D1D9E1D9C9CF05CD3A +:1031B0009332EBAFCDC03038F4EBCDC030D8D9E589 +:1031C000D9D5E5CDBA2FD9E56069D96168AF06DFF9 +:1031D000181017CB11D9CB11CB10D929D9ED6AD939 +:1031E0003810ED52D9ED52D9300F19D9ED5AD9A76F +:1031F0001808A7ED52D9ED52D93704FAD231F52883 +:10320000E15F51D95950F1CB18F1CB18D9C1E17810 +:1032100091C33D317EA7C8FE81300636003E20189E +:1032200051FE91201A2323233E80A62BB62B200388 +:103230003E80AE2B2036772336FF2B3E18183330D6 +:103240002CD52FC6912356235E2B2B0E00CB7A282C +:10325000010DCBFA0608908038045A160090280712 +:1032600047CB3ACB1B10FACD8E2DD1C97ED6A0F01C +:10327000ED44D5EB2B47CB38CB38CB38280536007F +:103280002B10FBE6072809473EFFCB2710FCA6774B +:10329000EBD1C9CD9632EB7EA7C0D5CD7F2DAF2324 +:1032A000772B7706917AA72008B342281053580647 +:1032B00089EB052930FCCB09CB1CCB1DEB2B732BE9 +:1032C000722B70D1C900B00040B000013000F1494C +:1032D0000FDAA240B0000A8F363C34A1330F30CA57 +:1032E00030AF3151381B3524353B353B353B353B11 +:1032F000353B353B3514302D353B353B353B353B88 +:10330000353B353B359C35DE35BC3445366E34694E +:1033100036DE357436B537AA37DA3733384338E214 +:10332000371337C436AF364A3892346A34AC34A5D2 +:1033300034B3341F36C9350135C033A0368636C69E +:10334000337A360635F9349B3683371432A2334F3D +:103350002D973249341B342D340F34CDBF3578329C +:10336000675CD9E3D9ED53655CD97E23E5A7F2808C +:103370003357E6600F0F0F0FC67C6F7AE61F180EEB +:10338000FE183008D901FBFF545D09D9076F11D72A +:10339000322600195E2356216533E3D5D9ED4B66FD +:1033A0005CC9F13A675CD918C3D5E5010500CD05C4 +:1033B0001FE1D1C9ED5B655CCDC033ED53655CC9E0 +:1033C000CDA933EDB0C9626BCDA933D9E5D9E3C539 +:1033D0007EE6C007074F0C7EE63F2002237EC650E4 +:1033E000123E059123130600EDB0C1E3D9E1D947A0 +:1033F000AF05C8121318FAA7C8F5D5110000CDC83B +:1034000033D1F13D18F24F0707814F060009C9D5A6 +:103410002A685CCD0634CDC033E1C9626BD9E521A1 +:10342000C532D9CDF733CDC833D9E1D9C9E5EB2AB7 +:10343000685CCD0634EBCDC033EBE1C906051A4E0E +:10344000EB1271231310F7EBC947CD5E33310FC078 +:1034500002A0C231E004E2C10338CDC633CD6233ED +:103460000F01C20235EEE10338C906FF1806CDE9A7 +:1034700034D806007EA7280B2378E680B6173F1FB6 +:10348000772BC9D5E5CD7F2DE178B12F4FCD8E2D8E +:10349000D1C9CDE934D8D511010023CB162B9F4FCC +:1034A000CD8E2DD1C9CD991EED781804CD991E0A67 +:1034B000C3282DCD991E212B2DE5C5C9CDF12B0B90 +:1034C00078B120231ACD8D2C3809D6903819FE15E5 +:1034D00030153C3D878787FEA8300CED4B7B5C8127 +:1034E0004F300104C32B2DCF09E5C5477E23B623FA +:1034F000B623B678C1E1C037C9CDE934D83EFF184C +:1035000006CDE9341805AF23AE2B07E53E0077233F +:10351000772317771F23772377E1C9EBCDE934EBC6 +:10352000D83718E7EBCDE934EBD0A718DEEBCDE9BF +:1035300034EBD0D51BAF121B12D1C978D608CB57AC +:1035400020013D0F3008F5E5CD3C34D1EBF1CB57F0 +:1035500020070FF5CD0F3018330FF5CDF12BD5C562 +:10356000CDF12BE17CB5E378200BB1C12804F13F0C +:103570001816F11813B1280D1A96380920ED0B13FF +:1035800023E32B18DFC1F1A7F5EFA038F1F5DC013B +:1035900035F1F5D4F934F10FD40135C9CDF12BD57E +:1035A000C5CDF12BE1E5D5C509444DF7CDB22AC112 +:1035B000E178B12802EDB0C1E178B12802EDB02A7E +:1035C000655C11FBFFE519D1C9CDD52D380E200C56 +:1035D000F5010100F7F112CDB22AEBC9CF0A2A5D3D +:1035E0005CE578C6E39FF5CDF12BD503F7E1ED530C +:1035F0005D5CD5EDB0EB2B360DFDCB01BECDFB24D4 +:10360000DFFE0D2007E1F1FDAE01E640C28A1C227B +:103610005D5CFDCB01FECDFB24E1225D5C18A001C9 +:103620000100F7225B5CE52A515CE53EFFCD011607 +:10363000CDE32DE1CD1516D12A5B5CA7ED52444DAB +:10364000CDB22AEBC9CD941EFE10D29F1E2A515C2A +:10365000E5CD0116CDE61501000030030CF712CDC3 +:10366000B22AE1CD1516C3BF35CDF12B78B12801B3 +:103670001AC3282DCDF12BC32B2DD9E521675C353D +:10368000E1200423D9C9D95E7B179F5719D9C913E3 +:10369000131A1B1BA720EFD923D9C9F1D9E3D9C924 +:1036A000EFC00231E00527E001C00403E038C9EFB4 +:1036B000313600043A38C9313AC003E00130000322 +:1036C000A10338C9EF3D34F138AA3B29043127C39F +:1036D00003310FA1038813365865669D786540A2B3 +:1036E0006032C9E721F7AF24EB2FB0B014EE7EBBF8 +:1036F0009458F13A7EF8CFE338CDD52D2007380322 +:10370000863009CF053807963004ED4477C9EF02BB +:10371000A038C9EF3D3137000438CF09A002387E08 +:103720003680CD282DEF34380003013134F04CCCF5 +:10373000CCCD0337000801A103013834EF0134F088 +:10374000317217F80401A203A2033134322004A21B +:10375000038C11AC140956DAA55930C55C90AA9EA9 +:10376000706F61A1CBDA96A4319FB4E7A0FE5CFC38 +:10377000EA1B43CA36EDA79C7E5EF06E238093045D +:103780000F38C9EF3D34EE22F9836E0431A20F27C2 +:1037900003310F310F312AA1033137C00004023841 +:1037A000C9A103013600021B38C9EF392AA103E081 +:1037B00000061B3303EF39313104310FA1038614A6 +:1037C000E65C1F0BA38F38EEE91563BB23EE920D69 +:1037D000CDEDF1235D1BEA0438C9EF311F0120054F +:1037E00038C9CD97327EFE81380EEFA11B0105311D +:1037F00036A30100061B3303EFA001313104310F62 +:10380000A1038C10B2130E55E48D5839BC5B98FDA2 +:103810009E003675A0DBE8B46342C4E6B50936BE47 +:10382000E936731B5DECD8DE63BEF061A1B30C0416 +:103830000F38C9EF313104A1031B28A10F05243132 +:103840000F38C9EF22A3031B38C9EF3130001EA285 +:1038500038EF0131300007250438C3C43602313057 +:103860000009A001370006A1010502A138C9FFFF28 +:10387000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:10388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:10389000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:1038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:1038B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:1038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:1038D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:1038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:1038F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:10390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:10391000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:10392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:10393000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:10394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:10395000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:10396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:10397000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:10398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:10399000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:1039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:1039B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:1039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:1039D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:1039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:1039F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:103A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:103A1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:103A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:103A3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:103A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:103A5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:103A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:103A7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:103A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:103A9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:103AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:103AB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:103AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:103AD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:103AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:103AF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:103B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:103B1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:103B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:103B3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:103B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:103B5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:103B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:103B7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:103B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:103B9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:103BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:103BB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:103BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:103BD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:103BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:103BF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:103C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:103C1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:103C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:103C3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:103C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:103C5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:103C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:103C7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:103C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:103C9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:103CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:103CB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:103CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:103CD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:103CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:103CF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:103D00000000000000000000001010101000100063 +:103D1000002424000000000000247E24247E2400CF +:103D200000083E283E0A3E0800626408102646004D +:103D3000001028102A443A0000081000000000007B +:103D400000040808080804000020101010102000CB +:103D5000000014083E081400000008083E0808008F +:103D60000000000000080810000000003E000000F5 +:103D700000000000001818000000020408102000D5 +:103D8000003C464A52623C000018280808083E00E1 +:103D9000003C42023C407E00003C420C02423C009F +:103DA00000081828487E0800007E407C02423C0043 +:103DB000003C407C42423C00007E0204081010009F +:103DC000003C423C42423C00003C42423E023C003D +:103DD0000000001000001000000010000010102073 +:103DE00000000408100804000000003E003E00002F +:103DF0000000100804081000003C420408000800FD +:103E0000003C4A565E403C00003C42427E4242003A +:103E1000007C427C42427C00003C424040423C00EC +:103E20000078444242447800007E407C40407E005E +:103E3000007E407C40404000003C42404E423C00FE +:103E40000042427E42424200003E080808083E000E +:103E50000002020242423C000044487048444200D2 +:103E60000040404040407E000042665A42424200CC +:103E7000004262524A464200003C424242423C00FA +:103E8000007C42427C404000003C4242524A3C009E +:103E9000007C42427C444200003C403C02423C00E8 +:103EA00000FE1010101010000042424242423C003E +:103EB000004242424224180000424242425A240038 +:103EC00000422418182442000082442810101000D8 +:103ED000007E040810207E00000E080808080E006E +:103EE0000000402010080400007010101010700036 +:103EF000001038541010100000000000000000FFF7 +:103F0000001C227820207E00000038043C443C0045 +:103F10000020203C22223C0000001C2020201C000D +:103F20000004043C44443C000000384478403C0019 +:103F3000000C10181010100000003C44443C0438E1 +:103F40000040407844444400001000301010380015 +:103F50000004000404042418002028303028240021 +:103F60000010101010100C0000006854545454003D +:103F7000000078444444440000003844444438007D +:103F8000000078444478404000003C44443C04062F +:103F900000001C2020202000000038403804780059 +:103FA0000010381010100C00000044444444380045 +:103FB00000004444282810000000445454542800B1 +:103FC000000044281028440000004444443C0438C5 +:103FD00000007C0810207C00000E083008080E004D +:103FE00000080808080808000070100C1010700085 +:103FF00000142800000000003C4299A1A199423C15 +:00000001FF diff --git a/Cobra_MiST/rtl/roms/spectrum.rom b/Cobra_MiST/rtl/roms/spectrum.rom new file mode 100644 index 00000000..4d6895e0 Binary files /dev/null and b/Cobra_MiST/rtl/roms/spectrum.rom differ diff --git a/Cobra_MiST/rtl/roms/turbo2_3.rom b/Cobra_MiST/rtl/roms/turbo2_3.rom new file mode 100644 index 00000000..6cecbfb4 Binary files /dev/null and b/Cobra_MiST/rtl/roms/turbo2_3.rom differ diff --git a/Cobra_MiST/rtl/roms/turbo4_4.rom b/Cobra_MiST/rtl/roms/turbo4_4.rom new file mode 100644 index 00000000..0496e4e0 Binary files /dev/null and b/Cobra_MiST/rtl/roms/turbo4_4.rom differ diff --git a/Cobra_MiST/rtl/scandoubler.v b/Cobra_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..adae2eba --- /dev/null +++ b/Cobra_MiST/rtl/scandoubler.v @@ -0,0 +1,195 @@ +// +// scandoubler.v +// +// Copyright (c) 2015 Till Harbaum +// Copyright (c) 2017 Sorgelig +// +// This source file is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This source file is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +// TODO: Delay vsync one line + +module scandoubler #(parameter LENGTH, parameter HALF_DEPTH) +( + // system interface + input clk_sys, + input ce_pix, + input ce_pix_actual, + + input hq2x, + + // shifter video interface + input hs_in, + input vs_in, + input line_start, + + input [DWIDTH:0] r_in, + input [DWIDTH:0] g_in, + input [DWIDTH:0] b_in, + input mono, + + // output interface + output reg hs_out, + output vs_out, + output [DWIDTH:0] r_out, + output [DWIDTH:0] g_out, + output [DWIDTH:0] b_out +); + + +localparam DWIDTH = HALF_DEPTH ? 2 : 5; + +`define BITS_TO_FIT(N) ( \ + N <= 2 ? 0 : \ + N <= 4 ? 1 : \ + N <= 8 ? 2 : \ + N <= 16 ? 3 : \ + N <= 32 ? 4 : \ + N <= 64 ? 5 : \ + N <= 128 ? 6 : \ + N <= 256 ? 7 : \ + N <= 512 ? 8 : \ + N <=1024 ? 9 : 10 ) + +assign vs_out = vs_in; + +reg [2:0] phase; +reg [2:0] ce_div; +reg [7:0] pix_len = 0; +wire [7:0] pl = pix_len + 1'b1; + +reg ce_x1, ce_x4; +reg req_line_reset; +wire ls_in = hs_in | line_start; +always @(negedge clk_sys) begin + reg old_ce; + reg [2:0] ce_cnt; + + reg [7:0] pixsz2, pixsz4 = 0; + + old_ce <= ce_pix; + if(~&pix_len) pix_len <= pix_len + 1'd1; + + ce_x4 <= 0; + ce_x1 <= 0; + + // use such odd comparison to place c_x4 evenly if master clock isn't multiple 4. + if((pl == pixsz4) || (pl == pixsz2) || (pl == (pixsz2+pixsz4))) begin + phase <= phase + 1'd1; + ce_x4 <= 1; + end + + if(~old_ce & ce_pix) begin + pixsz2 <= {1'b0, pl[7:1]}; + pixsz4 <= {2'b00, pl[7:2]}; + ce_x1 <= 1; + ce_x4 <= 1; + pix_len <= 0; + phase <= phase + 1'd1; + + ce_cnt <= ce_cnt + 1'd1; + if(ce_pix_actual) begin + phase <= 0; + ce_div <= ce_cnt + 1'd1; + ce_cnt <= 0; + req_line_reset <= 0; + end + + if(ls_in) req_line_reset <= 1; + end +end + +reg ce_sd; +always @(*) begin + case(ce_div) + 2: ce_sd = !phase[0]; + 4: ce_sd = !phase[1:0]; + default: ce_sd <= 1; + endcase +end + +localparam AWIDTH = `BITS_TO_FIT(LENGTH); +Hq2x #(.LENGTH(LENGTH), .HALF_DEPTH(HALF_DEPTH)) Hq2x +( + .clk(clk_sys), + .ce_x4(ce_x4 & ce_sd), + .inputpixel({b_in,g_in,r_in}), + .mono(mono), + .disable_hq2x(~hq2x), + .reset_frame(vs_in), + .reset_line(req_line_reset), + .read_y(sd_line), + .read_x(sd_h_actual), + .outpixel({b_out,g_out,r_out}) +); + +reg [10:0] sd_h_actual; +always @(*) begin + case(ce_div) + 2: sd_h_actual = sd_h[10:1]; + 4: sd_h_actual = sd_h[10:2]; + default: sd_h_actual = sd_h; + endcase +end + +reg [10:0] sd_h; +reg [1:0] sd_line; +always @(posedge clk_sys) begin + + reg [11:0] hs_max,hs_rise,hs_ls; + reg [10:0] hcnt; + reg [11:0] sd_hcnt; + + reg hs, hs2, vs, ls; + + if(ce_x1) begin + hs <= hs_in; + ls <= ls_in; + + if(ls && !ls_in) hs_ls <= {hcnt,1'b1}; + + // falling edge of hsync indicates start of line + if(hs && !hs_in) begin + hs_max <= {hcnt,1'b1}; + hcnt <= 0; + if(ls && !ls_in) hs_ls <= {10'd0,1'b1}; + end else begin + hcnt <= hcnt + 1'd1; + end + + // save position of rising edge + if(!hs && hs_in) hs_rise <= {hcnt,1'b1}; + + vs <= vs_in; + if(vs && ~vs_in) sd_line <= 0; + end + + if(ce_x4) begin + hs2 <= hs_in; + + // output counter synchronous to input and at twice the rate + sd_hcnt <= sd_hcnt + 1'd1; + sd_h <= sd_h + 1'd1; + if(hs2 && !hs_in) sd_hcnt <= hs_max; + if(sd_hcnt == hs_max) sd_hcnt <= 0; + + // replicate horizontal sync at twice the speed + if(sd_hcnt == hs_max) hs_out <= 0; + if(sd_hcnt == hs_rise) hs_out <= 1; + + if(sd_hcnt == hs_ls) sd_h <= 0; + if(sd_hcnt == hs_ls) sd_line <= sd_line + 1'd1; + end +end + +endmodule diff --git a/Cobra_MiST/rtl/spram.vhd b/Cobra_MiST/rtl/spram.vhd new file mode 100644 index 00000000..6d006211 --- /dev/null +++ b/Cobra_MiST/rtl/spram.vhd @@ -0,0 +1,89 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2016, Fabio Belavenuto (belavenuto@gmail.com) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +------------------------------------------------------------------------------- +-- +-- Generic single port RAM. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity spram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + port ( + clk_i : in std_logic; + we_i : in std_logic; + addr_i : in std_logic_vector(addr_width_g-1 downto 0); + data_i : in std_logic_vector(data_width_g-1 downto 0); + data_o : out std_logic_vector(data_width_g-1 downto 0) + ); + +end spram; + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of spram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t + -- pragma translate_off + := (others => (others => '0')) + -- pragma translate_on + ; + signal read_addr_q : unsigned(addr_width_g-1 downto 0); + +begin + + process (clk_i) + begin + if rising_edge(clk_i) then + if we_i = '1' then + ram_q(to_integer(unsigned(addr_i))) <= data_i; + end if; + + read_addr_q <= unsigned(addr_i); + end if; + end process; + + data_o <= ram_q(to_integer(read_addr_q)); + +end rtl; diff --git a/Cobra_MiST/rtl/sprom.vhd b/Cobra_MiST/rtl/sprom.vhd new file mode 100644 index 00000000..3ec3beb7 --- /dev/null +++ b/Cobra_MiST/rtl/sprom.vhd @@ -0,0 +1,77 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + numwords_a : natural := 0; -- not used any more + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + COMPONENT altsyncram + GENERIC ( + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone II", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + +END SYN; diff --git a/Cobra_MiST/rtl/t80/T80.vhd b/Cobra_MiST/rtl/t80/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Cobra_MiST/rtl/t80/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Cobra_MiST/rtl/t80/T80_ALU.vhd b/Cobra_MiST/rtl/t80/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Cobra_MiST/rtl/t80/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Cobra_MiST/rtl/t80/T80_MCode.vhd b/Cobra_MiST/rtl/t80/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Cobra_MiST/rtl/t80/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Cobra_MiST/rtl/t80/T80_Pack.vhd b/Cobra_MiST/rtl/t80/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Cobra_MiST/rtl/t80/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Cobra_MiST/rtl/t80/T80_Reg.vhd b/Cobra_MiST/rtl/t80/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Cobra_MiST/rtl/t80/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Cobra_MiST/rtl/t80/T80a.vhd b/Cobra_MiST/rtl/t80/T80a.vhd new file mode 100644 index 00000000..5e189020 --- /dev/null +++ b/Cobra_MiST/rtl/t80/T80a.vhd @@ -0,0 +1,253 @@ +-- +-- Z80 compatible microprocessor core, asynchronous top level +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80a is + generic( + Mode : integer := 0 -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + D : inout std_logic_vector(7 downto 0) + ); +end T80a; + +architecture rtl of T80a is + + signal CEN : std_logic; + signal Reset_s : std_logic; + signal IntCycle_n : std_logic; + signal IORQ : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal MREQ : std_logic; + signal MReq_Inhibit : std_logic; + signal Req_Inhibit : std_logic; + signal RD : std_logic; + signal MREQ_n_i : std_logic; + signal IORQ_n_i : std_logic; + signal RD_n_i : std_logic; + signal WR_n_i : std_logic; + signal RFSH_n_i : std_logic; + signal BUSAK_n_i : std_logic; + signal A_i : std_logic_vector(15 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector (7 downto 0); -- Input synchroniser + signal Wait_s : std_logic; + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + CEN <= '1'; + + BUSAK_n <= BUSAK_n_i; + MREQ_n_i <= not MREQ or (Req_Inhibit and MReq_Inhibit); + RD_n_i <= not RD or Req_Inhibit; + + MREQ_n <= MREQ_n_i when BUSAK_n_i = '1' else 'Z'; + IORQ_n <= IORQ_n_i when BUSAK_n_i = '1' else 'Z'; + RD_n <= RD_n_i when BUSAK_n_i = '1' else 'Z'; + WR_n <= WR_n_i when BUSAK_n_i = '1' else 'Z'; + RFSH_n <= RFSH_n_i when BUSAK_n_i = '1' else 'Z'; + A <= A_i when BUSAK_n_i = '1' else (others => 'Z'); + D <= DO when Write = '1' and BUSAK_n_i = '1' else (others => 'Z'); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + Reset_s <= '0'; + elsif CLK_n'event and CLK_n = '1' then + Reset_s <= '1'; + end if; + end process; + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 1) + port map( + CEN => CEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n_i, + HALT_n => HALT_n, + WAIT_n => Wait_s, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => Reset_s, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n_i, + CLK_n => CLK_n, + A => A_i, + DInst => D, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (CLK_n) + begin + if CLK_n'event and CLK_n = '0' then + Wait_s <= WAIT_n; + if TState = "011" and BUSAK_n_i = '1' then + DI_Reg <= to_x01(D); + end if; + end if; + end process; + + process (Reset_s,CLK_n) + begin + if Reset_s = '0' then + WR_n_i <= '1'; + elsif CLK_n'event and CLK_n = '1' then + WR_n_i <= '1'; + if TState = "001" then -- To short for IO writes !!!!!!!!!!!!!!!!!!! + WR_n_i <= not Write; + end if; + end if; + end process; + + process (Reset_s,CLK_n) + begin + if Reset_s = '0' then + Req_Inhibit <= '0'; + elsif CLK_n'event and CLK_n = '1' then + if MCycle = "001" and TState = "010" then + Req_Inhibit <= '1'; + else + Req_Inhibit <= '0'; + end if; + end if; + end process; + + process (Reset_s,CLK_n) + begin + if Reset_s = '0' then + MReq_Inhibit <= '0'; + elsif CLK_n'event and CLK_n = '0' then + if MCycle = "001" and TState = "010" then + MReq_Inhibit <= '1'; + else + MReq_Inhibit <= '0'; + end if; + end if; + end process; + + process(Reset_s,CLK_n) + begin + if Reset_s = '0' then + RD <= '0'; + IORQ_n_i <= '1'; + MREQ <= '0'; + elsif CLK_n'event and CLK_n = '0' then + + if MCycle = "001" then + if TState = "001" then + RD <= IntCycle_n; + MREQ <= IntCycle_n; + IORQ_n_i <= IntCycle_n; + end if; + if TState = "011" then + RD <= '0'; + IORQ_n_i <= '1'; + MREQ <= '1'; + end if; + if TState = "100" then + MREQ <= '0'; + end if; + else + if TState = "001" and NoRead = '0' then + RD <= not Write; + IORQ_n_i <= not IORQ; + MREQ <= not IORQ; + end if; + if TState = "011" then + RD <= '0'; + IORQ_n_i <= '1'; + MREQ <= '0'; + end if; + end if; + end if; + end process; + +end; diff --git a/Cobra_MiST/rtl/t80/T80sed.vhd b/Cobra_MiST/rtl/t80/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Cobra_MiST/rtl/t80/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Cobra_MiST/rtl/video_generator.vhd b/Cobra_MiST/rtl/video_generator.vhd new file mode 100644 index 00000000..134baf28 --- /dev/null +++ b/Cobra_MiST/rtl/video_generator.vhd @@ -0,0 +1,197 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.ALL; +--use IEEE.STD_LOGIC_ARITH.All; +--You only need *either* Numeric_std *or* std_logic_arith. You can't have +--both at the same time, as they both design a type UNSIGNED. +-- +--It's not clear to me which one you need as there's no arithmetic in your +--code. Numeric_std is the official IEEE standard, so you might prefer to +--use that. +use ieee.std_logic_unsigned.all; --przeciaza operator + dla std_logic_vector + +entity video_generator is + Port ( CLK_IN : in STD_LOGIC; + HSYNC_OUT : out STD_LOGIC; + VSYNC_OUT : out STD_LOGIC; + RGB_OUT : out STD_LOGIC_VECTOR (2 downto 0); + VIDEORAM_ADDR : OUT std_logic_VECTOR(9 downto 0); + VIDEORAM_DATA : IN std_logic_VECTOR(7 downto 0) + ); +end video_generator; + +architecture Behavioral of video_generator is + +component CharTable_ROM is + Port ( ADDR : in STD_LOGIC_VECTOR (8 downto 0); + DATA_OUT : out STD_LOGIC_VECTOR (7 downto 0)); +end component; + +signal char_rom_data : std_logic_vector(7 downto 0); +signal char_rom_addr : std_logic_vector(8 downto 0); + +signal line_count_reg : integer range 0 to 2**10-1 := 0; +signal line_count_next : integer range 0 to 2**10-1 := 0; +signal pixel_count_reg : integer range 0 to 2**10-1 := 0; +signal pixel_count_next : integer range 0 to 2**10-1 := 0; + +signal h_count_reg : integer range 0 to 1023 := 0; +signal h_count_next : integer range 0 to 1023 := 0; +signal v_count_reg : integer range 0 to 1023 := 0; +signal v_count_next : integer range 0 to 1023 := 0; + +signal bit_pos_reg : integer range 0 to 7; +signal bit_pos_next : integer range 0 to 7; + +signal ram_line_addr_reg : integer range 0 to 1023; +signal ram_line_addr_next : integer range 0 to 1023; +signal column_num_reg : integer range 0 to 31; +signal column_num_next : integer range 0 to 31; + +signal char_rom_line_reg : std_logic_vector(2 downto 0); +signal char_rom_line_next : std_logic_vector(2 downto 0); + + +type state_type is (s0, s1); +signal curr_state, next_state : state_type; + +begin + +--inst_rom : CharTable_ROM +-- port map ( +-- ADDR => char_rom_addr, +-- DATA_OUT => char_rom_data +-- ); + + inst_rom : entity work.inst_cg_rom + port map ( + address => char_rom_addr, + clock => CLK_IN, + q => char_rom_data + ); + + +process (CLK_IN) is +begin + if rising_edge(CLK_IN) then + curr_state <= next_state; + h_count_reg <= h_count_next; + v_count_reg <= v_count_next; + pixel_count_reg <= pixel_count_next; + line_count_reg <= line_count_next; + bit_pos_reg <= bit_pos_next; + ram_line_addr_reg <= ram_line_addr_next; + column_num_reg <= column_num_next; + char_rom_line_reg <= char_rom_line_next; + end if; +end process; + + +process (curr_state, h_count_reg, v_count_reg) is +begin + case curr_state is + when s0 => + v_count_next <= v_count_reg; + + if h_count_reg = 799 then --799@50MHz, 767@48 + h_count_next <= 0; + if v_count_reg = 520 then + v_count_next <= 0; + else + v_count_next <= v_count_reg + 1; + end if; + else + h_count_next <= h_count_reg + 1; + end if; + next_state <= s1; + + when s1 => + v_count_next <= v_count_reg; + h_count_next <= h_count_reg; + next_state <= s0; + + end case; +end process; + + +process (curr_state, h_count_reg, v_count_reg, pixel_count_reg, line_count_reg, ram_line_addr_reg) is +variable pixel : std_logic_vector (9 downto 0); +variable line : std_logic_vector (9 downto 0); +begin + ram_line_addr_next <= ram_line_addr_reg; + + case curr_state is + when s0 => + pixel_count_next <= pixel_count_reg; + line_count_next <= line_count_reg; + + if (h_count_reg >= 337) and (h_count_reg <= 591) then + pixel_count_next <= pixel_count_reg + 1; + else + pixel := std_logic_vector(to_unsigned(pixel_count_reg, 10)); + line := std_logic_vector(to_unsigned(line_count_reg, 10)); + if (pixel = 255) and (line(2 downto 0) = 7) then + ram_line_addr_next <= ram_line_addr_reg + 32; + end if; + + pixel_count_next <= 0; + if (v_count_reg >= 181) and (v_count_reg <= 371) then + line_count_next <= line_count_reg + 1; + else + line_count_next <= 0; + ram_line_addr_next <= 0; + end if; + end if; + + when s1 => + pixel_count_next <= pixel_count_reg; + line_count_next <= line_count_reg; +-- pixel := conv_std_logic_vector(pixel_count_reg, 10); +-- line := conv_std_logic_vector(line_count_reg, 10); +-- --border_next <= border_reg; +-- if (pixel = 255) and (line(2 downto 0) = 7) then +-- ram_line_addr_next <= ram_line_addr_reg + 32; +-- elsif (pixel = 255) and (line = 191) then +-- ram_line_addr_next <= 0; +-- end if; + + end case; + +end process; + + +process (curr_state, line_count_reg, pixel_count_reg, bit_pos_reg, column_num_reg, char_rom_line_reg) is +variable pixel : std_logic_vector (9 downto 0); +variable line : std_logic_vector (9 downto 0); +begin + + case curr_state is + when s0 => + pixel := std_logic_vector(to_unsigned(pixel_count_reg, 10)); + line := std_logic_vector(to_unsigned(line_count_reg, 10)); + + bit_pos_next <= 7 - to_integer(unsigned(pixel(2 downto 0))); + column_num_next <= to_integer(unsigned(pixel(8 downto 3))); + char_rom_line_next <= line(2 downto 0); + + when s1 => + bit_pos_next <= bit_pos_reg; + column_num_next <= column_num_reg; + char_rom_line_next <= char_rom_line_reg; + end case; + +end process; + + +VSYNC_OUT <= '0' when v_count_reg < 2 else '1'; +HSYNC_OUT <= '0' when h_count_reg < 96 else '1'; --96@50mhz, 92@48mhz + +char_rom_addr <= VIDEORAM_DATA(5 downto 0) & char_rom_line_reg; + +RGB_OUT <= --"010" when (border_reg /= "00") else + "111" when (char_rom_data(bit_pos_reg)='1') else + "000"; + +VIDEORAM_ADDR <= std_logic_vector(to_unsigned(ram_line_addr_reg + column_num_reg, 10)); + +end Behavioral; diff --git a/Cobra_MiST/rtl/video_mixer.sv b/Cobra_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Cobra_MiST/rtl/video_mixer.sv @@ -0,0 +1,242 @@ +// +// +// Copyright (c) 2017 Sorgelig +// +// This program is GPL Licensed. See COPYING for the full license. +// +// +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +`timescale 1ns / 1ps + +// +// LINE_LENGTH: Length of display line in pixels +// Usually it's length from HSync to HSync. +// May be less if line_start is used. +// +// HALF_DEPTH: If =1 then color dept is 3 bits per component +// For half depth 6 bits monochrome is available with +// mono signal enabled and color = {G, R} + +module video_mixer +#( + parameter LINE_LENGTH = 768, + parameter HALF_DEPTH = 0, + + parameter OSD_COLOR = 3'd4, + parameter OSD_X_OFFSET = 10'd0, + parameter OSD_Y_OFFSET = 10'd0 +) +( + // master clock + // it should be multiple by (ce_pix*4). + input clk_sys, + + // Pixel clock or clock_enable (both are accepted). + input ce_pix, + + // Some systems have multiple resolutions. + // ce_pix_actual should match ce_pix where every second or fourth pulse is enabled, + // thus half or qurter resolutions can be used without brake video sync while switching resolutions. + // For fixed single resolution (or when video sync stability isn't required) ce_pix_actual = ce_pix. + input ce_pix_actual, + + // OSD SPI interface + input SPI_SCK, + input SPI_SS3, + input SPI_DI, + + // scanlines (00-none 01-25% 10-50% 11-75%) + input [1:0] scanlines, + + // 0 = HVSync 31KHz, 1 = CSync 15KHz + input scandoubler_disable, + + // High quality 2x scaling + input hq2x, + + // YPbPr always uses composite sync + input ypbpr, + + // 0 = 16-240 range. 1 = 0-255 range. (only for YPbPr color space) + input ypbpr_full, + + // color + input [DWIDTH:0] R, + input [DWIDTH:0] G, + input [DWIDTH:0] B, + + // Monochrome mode (for HALF_DEPTH only) + input mono, + + // interlace sync. Positive pulses. + input HSync, + input VSync, + + // Falling of this signal means start of informative part of line. + // It can be horizontal blank signal. + // This signal can be used to reduce amount of required FPGA RAM for HQ2x scan doubler + // If FPGA RAM is not an issue, then simply set it to 0 for whole line processing. + // Keep in mind: due to algo first and last pixels of line should be black to avoid side artefacts. + // Thus, if blank signal is used to reduce the line, make sure to feed at least one black (or paper) pixel + // before first informative pixel. + input line_start, + + // MiST video output signals + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_VS, + output VGA_HS +); + +localparam DWIDTH = HALF_DEPTH ? 2 : 5; + +wire [DWIDTH:0] R_sd; +wire [DWIDTH:0] G_sd; +wire [DWIDTH:0] B_sd; +wire hs_sd, vs_sd; + +scandoubler #(.LENGTH(LINE_LENGTH), .HALF_DEPTH(HALF_DEPTH)) scandoubler +( + .*, + .hs_in(HSync), + .vs_in(VSync), + .r_in(R), + .g_in(G), + .b_in(B), + + .hs_out(hs_sd), + .vs_out(vs_sd), + .r_out(R_sd), + .g_out(G_sd), + .b_out(B_sd) +); + +wire [DWIDTH:0] rt = (scandoubler_disable ? R : R_sd); +wire [DWIDTH:0] gt = (scandoubler_disable ? G : G_sd); +wire [DWIDTH:0] bt = (scandoubler_disable ? B : B_sd); + +generate + if(HALF_DEPTH) begin + wire [5:0] r = mono ? {gt,rt} : {rt,rt}; + wire [5:0] g = mono ? {gt,rt} : {gt,gt}; + wire [5:0] b = mono ? {gt,rt} : {bt,bt}; + end else begin + wire [5:0] r = rt; + wire [5:0] g = gt; + wire [5:0] b = bt; + end +endgenerate + +wire hs = (scandoubler_disable ? HSync : hs_sd); +wire vs = (scandoubler_disable ? VSync : vs_sd); + +reg scanline = 0; +always @(posedge clk_sys) begin + reg old_hs, old_vs; + + old_hs <= hs; + old_vs <= vs; + + if(old_hs && ~hs) scanline <= ~scanline; + if(old_vs && ~vs) scanline <= 0; +end + +wire [5:0] r_out, g_out, b_out; +always @(*) begin + case(scanlines & {scanline, scanline}) + 1: begin // reduce 25% = 1/2 + 1/4 + r_out = {1'b0, r[5:1]} + {2'b00, r[5:2]}; + g_out = {1'b0, g[5:1]} + {2'b00, g[5:2]}; + b_out = {1'b0, b[5:1]} + {2'b00, b[5:2]}; + end + + 2: begin // reduce 50% = 1/2 + r_out = {1'b0, r[5:1]}; + g_out = {1'b0, g[5:1]}; + b_out = {1'b0, b[5:1]}; + end + + 3: begin // reduce 75% = 1/4 + r_out = {2'b00, r[5:2]}; + g_out = {2'b00, g[5:2]}; + b_out = {2'b00, b[5:2]}; + end + + default: begin + r_out = r; + g_out = g; + b_out = b; + end + endcase +end + +wire [5:0] red, green, blue; +osd #(OSD_X_OFFSET, OSD_Y_OFFSET, OSD_COLOR) osd +( + .*, + + .R_in(r_out), + .G_in(g_out), + .B_in(b_out), + .HSync(hs), + .VSync(vs), + + .R_out(red), + .G_out(green), + .B_out(blue) +); + +wire [5:0] yuv_full[225] = '{ + 6'd0, 6'd0, 6'd0, 6'd0, 6'd1, 6'd1, 6'd1, 6'd1, + 6'd2, 6'd2, 6'd2, 6'd3, 6'd3, 6'd3, 6'd3, 6'd4, + 6'd4, 6'd4, 6'd5, 6'd5, 6'd5, 6'd5, 6'd6, 6'd6, + 6'd6, 6'd7, 6'd7, 6'd7, 6'd7, 6'd8, 6'd8, 6'd8, + 6'd9, 6'd9, 6'd9, 6'd9, 6'd10, 6'd10, 6'd10, 6'd11, + 6'd11, 6'd11, 6'd11, 6'd12, 6'd12, 6'd12, 6'd13, 6'd13, + 6'd13, 6'd13, 6'd14, 6'd14, 6'd14, 6'd15, 6'd15, 6'd15, + 6'd15, 6'd16, 6'd16, 6'd16, 6'd17, 6'd17, 6'd17, 6'd17, + 6'd18, 6'd18, 6'd18, 6'd19, 6'd19, 6'd19, 6'd19, 6'd20, + 6'd20, 6'd20, 6'd21, 6'd21, 6'd21, 6'd21, 6'd22, 6'd22, + 6'd22, 6'd23, 6'd23, 6'd23, 6'd23, 6'd24, 6'd24, 6'd24, + 6'd25, 6'd25, 6'd25, 6'd25, 6'd26, 6'd26, 6'd26, 6'd27, + 6'd27, 6'd27, 6'd27, 6'd28, 6'd28, 6'd28, 6'd29, 6'd29, + 6'd29, 6'd29, 6'd30, 6'd30, 6'd30, 6'd31, 6'd31, 6'd31, + 6'd31, 6'd32, 6'd32, 6'd32, 6'd33, 6'd33, 6'd33, 6'd33, + 6'd34, 6'd34, 6'd34, 6'd35, 6'd35, 6'd35, 6'd35, 6'd36, + 6'd36, 6'd36, 6'd36, 6'd37, 6'd37, 6'd37, 6'd38, 6'd38, + 6'd38, 6'd38, 6'd39, 6'd39, 6'd39, 6'd40, 6'd40, 6'd40, + 6'd40, 6'd41, 6'd41, 6'd41, 6'd42, 6'd42, 6'd42, 6'd42, + 6'd43, 6'd43, 6'd43, 6'd44, 6'd44, 6'd44, 6'd44, 6'd45, + 6'd45, 6'd45, 6'd46, 6'd46, 6'd46, 6'd46, 6'd47, 6'd47, + 6'd47, 6'd48, 6'd48, 6'd48, 6'd48, 6'd49, 6'd49, 6'd49, + 6'd50, 6'd50, 6'd50, 6'd50, 6'd51, 6'd51, 6'd51, 6'd52, + 6'd52, 6'd52, 6'd52, 6'd53, 6'd53, 6'd53, 6'd54, 6'd54, + 6'd54, 6'd54, 6'd55, 6'd55, 6'd55, 6'd56, 6'd56, 6'd56, + 6'd56, 6'd57, 6'd57, 6'd57, 6'd58, 6'd58, 6'd58, 6'd58, + 6'd59, 6'd59, 6'd59, 6'd60, 6'd60, 6'd60, 6'd60, 6'd61, + 6'd61, 6'd61, 6'd62, 6'd62, 6'd62, 6'd62, 6'd63, 6'd63, + 6'd63 +}; + +// http://marsee101.blog19.fc2.com/blog-entry-2311.html +// Y = 16 + 0.257*R + 0.504*G + 0.098*B (Y = 0.299*R + 0.587*G + 0.114*B) +// Pb = 128 - 0.148*R - 0.291*G + 0.439*B (Pb = -0.169*R - 0.331*G + 0.500*B) +// Pr = 128 + 0.439*R - 0.368*G - 0.071*B (Pr = 0.500*R - 0.419*G - 0.081*B) + +wire [18:0] y_8 = 19'd04096 + ({red, 8'd0} + {red, 3'd0}) + ({green, 9'd0} + {green, 2'd0}) + ({blue, 6'd0} + {blue, 5'd0} + {blue, 2'd0}); +wire [18:0] pb_8 = 19'd32768 - ({red, 7'd0} + {red, 4'd0} + {red, 3'd0}) - ({green, 8'd0} + {green, 5'd0} + {green, 3'd0}) + ({blue, 8'd0} + {blue, 7'd0} + {blue, 6'd0}); +wire [18:0] pr_8 = 19'd32768 + ({red, 8'd0} + {red, 7'd0} + {red, 6'd0}) - ({green, 8'd0} + {green, 6'd0} + {green, 5'd0} + {green, 4'd0} + {green, 3'd0}) - ({blue, 6'd0} + {blue , 3'd0}); + +wire [7:0] y = ( y_8[17:8] < 16) ? 8'd16 : ( y_8[17:8] > 235) ? 8'd235 : y_8[15:8]; +wire [7:0] pb = (pb_8[17:8] < 16) ? 8'd16 : (pb_8[17:8] > 240) ? 8'd240 : pb_8[15:8]; +wire [7:0] pr = (pr_8[17:8] < 16) ? 8'd16 : (pr_8[17:8] > 240) ? 8'd240 : pr_8[15:8]; + +assign VGA_R = ypbpr ? (ypbpr_full ? yuv_full[pr-8'd16] : pr[7:2]) : red; +assign VGA_G = ypbpr ? (ypbpr_full ? yuv_full[y -8'd16] : y[7:2]) : green; +assign VGA_B = ypbpr ? (ypbpr_full ? yuv_full[pb-8'd16] : pb[7:2]) : blue; +assign VGA_VS = (scandoubler_disable | ypbpr) ? 1'b1 : ~vs_sd; +assign VGA_HS = scandoubler_disable ? ~(HSync ^ VSync) : ypbpr ? ~(hs_sd ^ vs_sd) : ~hs_sd; + +endmodule diff --git a/Cobra_MiST/snapshot/Cobra_MiST.rbf b/Cobra_MiST/snapshot/Cobra_MiST.rbf new file mode 100644 index 00000000..fcdf9eaa Binary files /dev/null and b/Cobra_MiST/snapshot/Cobra_MiST.rbf differ