From 516fea04375688fcb329f77fef6a3c7efcea0caf Mon Sep 17 00:00:00 2001 From: Gehstock Date: Thu, 17 May 2018 08:27:02 +0200 Subject: [PATCH] Release COBRA Sourcecode --- Cobra_MiST/Cobra_MiST.qpf | 31 + Cobra_MiST/Cobra_MiST.qsf | 178 +++ Cobra_MiST/README.md | 16 + Cobra_MiST/clean.bat | 37 + Cobra_MiST/rtl/Cobra_MiST.sv | 115 ++ Cobra_MiST/rtl/build_id.tcl | 35 + Cobra_MiST/rtl/build_id.v | 2 + Cobra_MiST/rtl/cobra_kbd.vhd | 161 +++ Cobra_MiST/rtl/cobra_top.vhd | 269 ++++ Cobra_MiST/rtl/dac.vhd | 48 + Cobra_MiST/rtl/dpram.vhd | 59 + Cobra_MiST/rtl/hq2x.sv | 454 +++++++ Cobra_MiST/rtl/inst_cg_rom.qip | 3 + Cobra_MiST/rtl/inst_cg_rom.vhd | 143 ++ Cobra_MiST/rtl/inst_ram.qip | 3 + Cobra_MiST/rtl/inst_ram.vhd | 156 +++ Cobra_MiST/rtl/inst_videoram.qip | 3 + Cobra_MiST/rtl/inst_videoram.vhd | 226 ++++ Cobra_MiST/rtl/mist_io.v | 491 +++++++ Cobra_MiST/rtl/multi74123.vhd | 36 + Cobra_MiST/rtl/osd.v | 179 +++ Cobra_MiST/rtl/pll.qip | 4 + Cobra_MiST/rtl/pll.v | 385 ++++++ Cobra_MiST/rtl/ps2_keyboard.vhd | 143 ++ Cobra_MiST/rtl/roms/1986es.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/48e.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/48turbo.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/BOOT.BIN | Bin 0 -> 2048 bytes Cobra_MiST/rtl/roms/BOOT_DISK.BIN | Bin 0 -> 2048 bytes Cobra_MiST/rtl/roms/OPUS.BIN | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/OPUS.hex | 1025 +++++++++++++++ Cobra_MiST/rtl/roms/UNKN.BIN | Bin 0 -> 2048 bytes Cobra_MiST/rtl/roms/boot64k_v1.bin | Bin 0 -> 2048 bytes Cobra_MiST/rtl/roms/boot64k_v2.bin | Bin 0 -> 2048 bytes Cobra_MiST/rtl/roms/bsrom118.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/bsrom140.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/charrom.vhd | 101 ++ Cobra_MiST/rtl/roms/cobra.bin | Bin 0 -> 2048 bytes Cobra_MiST/rtl/roms/cobra.hex | 129 ++ Cobra_MiST/rtl/roms/cobra_char | Bin 0 -> 512 bytes Cobra_MiST/rtl/roms/cobra_char.hex | 33 + Cobra_MiST/rtl/roms/cobra_rom.coe | 162 +++ Cobra_MiST/rtl/roms/deutsch.hex | 1025 +++++++++++++++ Cobra_MiST/rtl/roms/deutsch.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/groot.hex | 1025 +++++++++++++++ Cobra_MiST/rtl/roms/groot.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/gw03.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/hdt-iso.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/imc.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/iso8bm.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/isomoje.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/jgh.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/plus4.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/psycho.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/sc01.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/spectrum.hex | 1025 +++++++++++++++ Cobra_MiST/rtl/roms/spectrum.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/turbo2_3.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/roms/turbo4_4.rom | Bin 0 -> 16384 bytes Cobra_MiST/rtl/scandoubler.v | 195 +++ Cobra_MiST/rtl/spram.vhd | 89 ++ Cobra_MiST/rtl/sprom.vhd | 77 ++ Cobra_MiST/rtl/t80/T80.vhd | 1080 ++++++++++++++++ Cobra_MiST/rtl/t80/T80_ALU.vhd | 371 ++++++ Cobra_MiST/rtl/t80/T80_MCode.vhd | 1944 ++++++++++++++++++++++++++++ Cobra_MiST/rtl/t80/T80_Pack.vhd | 217 ++++ Cobra_MiST/rtl/t80/T80_Reg.vhd | 105 ++ Cobra_MiST/rtl/t80/T80a.vhd | 253 ++++ Cobra_MiST/rtl/t80/T80sed.vhd | 179 +++ Cobra_MiST/rtl/video_generator.vhd | 197 +++ Cobra_MiST/rtl/video_mixer.sv | 242 ++++ Cobra_MiST/snapshot/Cobra_MiST.rbf | Bin 0 -> 243834 bytes 72 files changed, 12651 insertions(+) create mode 100644 Cobra_MiST/Cobra_MiST.qpf create mode 100644 Cobra_MiST/Cobra_MiST.qsf create mode 100644 Cobra_MiST/README.md create mode 100644 Cobra_MiST/clean.bat create mode 100644 Cobra_MiST/rtl/Cobra_MiST.sv create mode 100644 Cobra_MiST/rtl/build_id.tcl create mode 100644 Cobra_MiST/rtl/build_id.v create mode 100644 Cobra_MiST/rtl/cobra_kbd.vhd create mode 100644 Cobra_MiST/rtl/cobra_top.vhd create mode 100644 Cobra_MiST/rtl/dac.vhd create mode 100644 Cobra_MiST/rtl/dpram.vhd create mode 100644 Cobra_MiST/rtl/hq2x.sv create mode 100644 Cobra_MiST/rtl/inst_cg_rom.qip create mode 100644 Cobra_MiST/rtl/inst_cg_rom.vhd create mode 100644 Cobra_MiST/rtl/inst_ram.qip create mode 100644 Cobra_MiST/rtl/inst_ram.vhd create mode 100644 Cobra_MiST/rtl/inst_videoram.qip create mode 100644 Cobra_MiST/rtl/inst_videoram.vhd create mode 100644 Cobra_MiST/rtl/mist_io.v create mode 100644 Cobra_MiST/rtl/multi74123.vhd create mode 100644 Cobra_MiST/rtl/osd.v create mode 100644 Cobra_MiST/rtl/pll.qip create mode 100644 Cobra_MiST/rtl/pll.v create mode 100644 Cobra_MiST/rtl/ps2_keyboard.vhd create mode 100644 Cobra_MiST/rtl/roms/1986es.rom create mode 100644 Cobra_MiST/rtl/roms/48e.rom create mode 100644 Cobra_MiST/rtl/roms/48turbo.rom create mode 100644 Cobra_MiST/rtl/roms/BOOT.BIN create mode 100644 Cobra_MiST/rtl/roms/BOOT_DISK.BIN create mode 100644 Cobra_MiST/rtl/roms/OPUS.BIN create mode 100644 Cobra_MiST/rtl/roms/OPUS.hex create mode 100644 Cobra_MiST/rtl/roms/UNKN.BIN create mode 100644 Cobra_MiST/rtl/roms/boot64k_v1.bin create mode 100644 Cobra_MiST/rtl/roms/boot64k_v2.bin create mode 100644 Cobra_MiST/rtl/roms/bsrom118.rom create mode 100644 Cobra_MiST/rtl/roms/bsrom140.rom create mode 100644 Cobra_MiST/rtl/roms/charrom.vhd create mode 100644 Cobra_MiST/rtl/roms/cobra.bin create mode 100644 Cobra_MiST/rtl/roms/cobra.hex create mode 100644 Cobra_MiST/rtl/roms/cobra_char create mode 100644 Cobra_MiST/rtl/roms/cobra_char.hex create mode 100644 Cobra_MiST/rtl/roms/cobra_rom.coe create mode 100644 Cobra_MiST/rtl/roms/deutsch.hex create mode 100644 Cobra_MiST/rtl/roms/deutsch.rom create mode 100644 Cobra_MiST/rtl/roms/groot.hex create mode 100644 Cobra_MiST/rtl/roms/groot.rom create mode 100644 Cobra_MiST/rtl/roms/gw03.rom create mode 100644 Cobra_MiST/rtl/roms/hdt-iso.rom create mode 100644 Cobra_MiST/rtl/roms/imc.rom create mode 100644 Cobra_MiST/rtl/roms/iso8bm.rom create mode 100644 Cobra_MiST/rtl/roms/isomoje.rom create mode 100644 Cobra_MiST/rtl/roms/jgh.rom create mode 100644 Cobra_MiST/rtl/roms/plus4.rom create mode 100644 Cobra_MiST/rtl/roms/psycho.rom create mode 100644 Cobra_MiST/rtl/roms/sc01.rom create mode 100644 Cobra_MiST/rtl/roms/spectrum.hex create mode 100644 Cobra_MiST/rtl/roms/spectrum.rom create mode 100644 Cobra_MiST/rtl/roms/turbo2_3.rom create mode 100644 Cobra_MiST/rtl/roms/turbo4_4.rom create mode 100644 Cobra_MiST/rtl/scandoubler.v create mode 100644 Cobra_MiST/rtl/spram.vhd create mode 100644 Cobra_MiST/rtl/sprom.vhd create mode 100644 Cobra_MiST/rtl/t80/T80.vhd create mode 100644 Cobra_MiST/rtl/t80/T80_ALU.vhd create mode 100644 Cobra_MiST/rtl/t80/T80_MCode.vhd create mode 100644 Cobra_MiST/rtl/t80/T80_Pack.vhd create mode 100644 Cobra_MiST/rtl/t80/T80_Reg.vhd create mode 100644 Cobra_MiST/rtl/t80/T80a.vhd create mode 100644 Cobra_MiST/rtl/t80/T80sed.vhd create mode 100644 Cobra_MiST/rtl/video_generator.vhd create mode 100644 Cobra_MiST/rtl/video_mixer.sv create mode 100644 Cobra_MiST/snapshot/Cobra_MiST.rbf 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 0000000000000000000000000000000000000000..ffef8e1f9789fec90c38e6886a0c12d414ef2ddb GIT binary patch literal 16384 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 F{{_&fUF!e< literal 0 HcmV?d00001 diff --git a/Cobra_MiST/rtl/roms/48e.rom b/Cobra_MiST/rtl/roms/48e.rom new file mode 100644 index 0000000000000000000000000000000000000000..ceae22689ba711dd027ef8e47e9a4116e656b24d GIT binary patch literal 16384 zcmd^m`$H2~_V`TR0rKKGfQ1QzIwqn4Axseh;VD%K1(d4equo!nuhrUiOAt+Ich}bL zqqe)--F|mJtG3^>|phGiT_LO{!mW~m%EyZsYVK2=!Z9~3q-1KwclHW%DH^%E@GQO5fGsZyKiX@EX}Ao0t= zShNOkQ#pX26V0bYU7u(?FB0YFDKVA7sbZ+$K5J??R^PC+X4RXGTEiI>=XIq>{S2~xyS>>wsuXLVRR&%ns{$!QwOpEiRv-za6>Ws7H`E+wj)0-%i>uOr=JiFYr(qGf$Z1%evYZ}Nms+PH$Ysfd2*EH4nSJpJu z*9IzUYED(vH&re3*EjHu&c>S4wac8%eU(l1bxY3HHvkZ{U0HM5wc_lu#wMU_*|PfP zv&}88Q%yC_W7W(H)>sR~hd#je6 zscv$ft6Em$Jl#~&vZ4w2))=T3ZwP2Os`5^p~T-k3RJt_Iz<+&i{1mIRDxHci$WS za^#s$hGq{^pC1ZToJ&xv6iQ88yw-5hQZDqJ;McvMXDwSWe{s$~OMMRiLT+tu$*GfX zA3t+;;PgBF3l@Sj;-VOJFAQhX`b|5MdxkW8sqI$tdh&W6k1^qGrF|mZC#LsxtZo$v zPWZK~$BePOhg4HVR#Il4-eFd-{~)gjS@Kg*afDtFfr2CSTmVr-cu(K@Hp;G~O0;Yn zHPxV=T8W2*Me<-7HV)Lo8ty z>TbE@w7l2FnIpJ@mP1u4mhR!q^JIJleVt!T$4&9Jbv=rnUXttm3n$vn>u&wGoJ=>j z$oPloGa_SC50Q$#UJW;7hnL8iZ8Gt0`mdsmJ``5>b}IU=7&t{A{}7auZ<;&g#Gdu$ zHM#8e4Rh&v-|XPa__Bpzxl4r&n+N2>+L9$~m@ya(lNt=e6bU+VN?)!#IwZehJR?@S z_)VmC+efsveR<~a<>d*(mv3|9`Ez^Zh5!55AF?MD`wWcv71q;5uA>^LT6fx>PstYQ z2-)cFExk5daq%&Q>Xu?C!FIbh!EfHI5LAW2$BV`lOl)V{c#kZf5q_H`#@lknM-`)m zomDILbmGdwqOEd9crD8h|AURIwtdu>>H9?9AGb?(DsktoxZiL1$*#n~wCr7(yPdLK zxu=?s?^^KR_Jg~a>3YYms_93b+~w-RT6VE8mR%1gPv-7=I%ZS~w{uGtv(MjpaaQnD zNQhY&%LC)el_7IyHvbIF!XFYeNyFA}9I`s2ct*TpP`#N)PAF$zJFieJL?sTL zsu;a-{bJ1)pIQk_Nf_RYZU11C126W?Rz5~tZ|B`c(WX#UA~=a@QP8b%4m$kZPM@ z_$L@);7uR&v}e1L2=%ZB`=Do-%G9VnTz~_fQx5(xpQ1W&`nVE?wCyAE_;wLT7*9D; z%gCuNMc)kl?}SPEoA!mSuzFH+Ml9xHB~P(KqXkc~!Y^kDw%K$kZo;6biVu#>!)@{Ckw6V^)jM#0D~*>9w_%YnaUOYLOt_L6@vT;i z?~>X7L3Sl`*dC7!+Y>U)SjF&9bi+^SiREH9>G}`I5|T`STo-gMgl7>3;kj8O;(Ypt zWr{H<1pFYJ!&~ErA5V}Hy5Yz58y+6EV{)QeJWgu?VA!tjB+?KzAo_=m5G+7qmQ`$Y zO*2~@Z5sYb{P0r=mZdC88it=TMkFF0*M@+X!`k7H$%J(m3oDhwLEANlDB!76_9nT$ z6Q*$Z$T%s}Pl^g#z|^Dl3vmhF;n0Bj>U6p)&QnUt+dExJ8Am7*PdI0sX==3B!XZx64FA6}WT{S#UjZDQuoNJvCEc~=lbPBpw)H@s0F z8V(|U$%;w5%P|c!o$t?>X%#|1Nl8f&0+t0r7J;ELT9Xn>uU;-Fvr)HQv;&YQS!=Bg zR=He03}%Dyb^5SnJqz5h4mZRP*CzN;g=cC)SdmJ_+6Jg6sV6Atwb(K3lW8In95lNF zD}>U$AwPg39Mo`wVYt?)%~{FEkQ^`)*nnAB0sA^bSI!0WRd2g1PTD?bE_MPw}!V!r7D=;Si20V5Jp2ZJe5! z3&-?u(05eP+1OOm=xnMXmpRF*`i2%Kxr%IDu?(z_nueB|rv19cCRbgPbGfr*uWq@s zrKx^3*|1{yg8$^IoK4QE7F1BVs->p6gxo90<3;jxAWl><4~vBDL34cEdf2_zrH6d- z_=Z;Fyq4ys;zrl{b!*u*t6Q2A966toCfFStNUcIIa}b9~xl(WT1#~4ZvlCPHR@^}f z55~s|US>H2byU#n&BBTVB|tz|?PXkcvXf+>fbSACBo`(-AfSLTv>PIaX2zOW~&v`zs`t3A3RVd_Z!g`Ek| z#dhf9*|KnUUn>Ci0x63VQplT}kQ*;G%s}v@CR+6ZoAWc4i&nkJMysA!Uk761@CnKE&=ZBCuQ#6xGMS6HGBHcY`0&l7vX z1{Zo>J*Zc-Q9ANA=i9Rw>rL@Tmv+EN1!Ds66f$-;VqVPhJ4KR|@x61fE%WBh(|RNA zWezi`S4v}~RfB?{A87w{@WhIQ0e=X%tD4Sca7A|Z9+yMYg@!{b!K^r09MNR#-TzLa zhDl1M%E)Vx*{JTs=kY9@~7)HM0h*c17Z2(eVd|dUSd7(z5d=5-}*GI3ICIC zC1qC_$Zdq&O@0gH)NNd74t9x9n0|*%2+jmX>mUJV?TN(+8R2Jur5Q=j+a?CYCA3_8 z?))}Ue%?V22F?WrxQR$9@1f}1W#r9BOeD`|3^^q!=rIL!gKlZEWIC8ECbI`J8|l=k zb$NHus~s3DgJ?%NV)$EJzhbJWiL7xDy9<8FT3%w&*eC9+l$!~6Rtn+4+Qd;1ea8PhqnGk+-kRJ7V(hdQ^s%!Y*JI`@S6QMT4y+GgIx9%1B#Dnh{Yu`=@O z;M7lAQBO!@fc%|8KnJg0FV}7Pl_Ws4V$;-SJwTXWW=WaHus^(Fe;X%s>&&Grzn|{~ zZ*26R*SkGFtDxFXB{bkk@Pc zA$M5qCKDp&(VOWJoW#na2OvG29;pkfL5f^%6&5|9QftFE$<^ z?;yDYtZP|o$C9E4Ot?C|EPS($3`woNfL0GYngl}ze$~=)FrM1tqX)ctGlwRsY_f4v znjN8#mZYkdrzWK9F z#xX+o4GdZZ8XfA5-#Qd$Zr?^+_(^SdT^nWm4!HJfNo~1B`JS-s%i*qko>E_K^S z$A51OA%ooRCW zX9Yt#@#85wW+d(s@{NSj1I{>t;vk3PnD6U!pcwuIgTb6K=pFO)e9ILJzcWRf(kbtG zfA#VQ9;GtES4AVKr80)nPGTfZbww++5hg74(gQ>TwGklKd=D$k0=m;2m=A0pU<&=V z?^y%P$wqn~&@hddDVld@05g3yLrBjcVyEl=rkXrL2tV6TEjnIqw^FunblReS~E+PiazWj^> z(RMkE{Cy-|I<@tTNoOKdB{~+?n#Bd|f`wGfp>@j3{tW;3TV4dcfaZUbNt%Dlb8HB) zA|mV{B0`XW`b!ajFZl)g3NwdPbxgh5Xv+d6DO}eM5SM>2IyBhmnip9@HX!j841<6! znDZPAbPmQrc*WWkU9(D>?7rxl``PoBAF-TA)Z;4b#MkK_O4N}t?i&Z-_>c`mmwpU3 z2E$r9*g%~_4PHojv<}=R_&xBbU1t3|d8-S}mQ7Ve%Zuo5tbu41v}k779B84S({ny% zP2CRsZ7dQ!9HF4lidSIKDyaXEHDjeYcGmJCYj;?`wOT<2qARD&CG2hUAvVVa?Naa* zXm=oD&1r>*PBRNeo4u3DS;g9Q6iVFB=KP4wd60E51;1hoUSbQDux3h`qh+UxdZ&tx zn|o7CMi$qDZh>h%32P8(KjBebw~0x)qx1>2RQ9_x;XtaiX9)8RLRuygMlw;7o(d3e zq05BWN(@690!YH`boardYg0x<9SysVt@c>APS~t-q))x-f(-^b6A?I=l(_I>=F^bh z4^R!q1bs;fTRH(scIv6(si)@T#It4`%SmOSa}e46fCFUVN~}(dV`RN*VLZh_o^zXi zn*_uPix*??iY~2Th0F{`$+@WpoeF~_tV)EH&J?w@LQFx?G950*OpmkXY6x7=xHfti zD47N-{_J}{5oWH_#X~5kg>0^GAR+9t(%Dq+tXx(@);B;$y|;D+1gXgC8nV#|rsA??Ua$pgnq1`a6{|?+vX*`+=F=cyu5&>g3D6-=|RM+1C)%Vpy#0>0FveMaH z@2iA>*3yM2dIkN|t?<`E$4=JjIOb! zsT#Ognh>wRp04xG-}?-ie>YP=Hb1=i zM~~hA@DpUygHJwq{}VrYh+Ov6R}LeNVZNlKXjMH6!On!uP0vDzHMB3U3)C0 z`B}rUlqQsF?Cej(F%=e%;qa%zj7Yz2CXt=|r4UXzPv7cS2STthP!yrbvi(#_ucKB* zg!!q#0QY=v>XtbyrcxB?U$Z&FRT&UTWHg0Fz2NTU!iH&Y}&zyHu8k^ zNooMB*RLZ3F(|HHE>Dke7#16YrJ}sis{2`QgyLX<+jX!j+|e(< zCQvZ|23jTrHhIoNY>-3h(-%soJY9XCQshn0<5_6}o(6Mby7)#Uol)awQ?#&gMz&Iq zb0HY877a9FPECW6HmES|<)zAIc_SX=P-x2tA)T~dx!P=GA>4-AS-EkX0h|!`NR8ZS z?um#?X^q$nOT3Zn7uKdBuLgyw+y_yJ#Ger!ahbQF4s0>hg%>eX(-?$!w#$rQF-p9aY{eNq+j>DHqH7*w5hs}(h`OhndSsDk(9Yqa?>mWbv&##$ajyD*JMghd2kd5d$%37JC%Jzx;+Ifkc>2#=FY@`$(?sGm=& zP^5#ATpZ~ucKv-szK;$fCCu~MJV7Fm@Gj= zPY;MG*U@#8&~NWpvCpo+4!C*=(YjnGZvFRpjYhv4qqkcoH@W+e$haY>pf< zZldH7_KKq55jF;JL+3!)n%S1MUf>Pz;&6I|xb8XJLwT&9axfOyxb#>`-`L+sMHfe* zF+&Mp!F6H@Obkydcqa{88hI(DmWt~(+43SftHdLdKg2?=0R3ioF}}V$0*EK&ucHdI1A2h z21DJvn15tcEMwtA7Ap@mE}%rT6S?;wPBUDD(~KsA6M$?+3J+Fc$rLvZOT&d%B!=$y~x6@ z%)+Q_MVab^N-4iffxUN^Qpi^BB9*fF$`3QK|1rt;WhuW+(_o!ha#t3%K1=?77WSx4 zi+z!!!b-B0(Yus$v*eXoTIF*T_P$=pWh*Dr;^C*kZpyVvl2S`Q4Yn;yh5a^1xglFM zKMu2}sjyIL9QK>EILN^h{=+|*t|MSYbQjdIWd$WHfsYBFrNYJy(dQ8r2BNqP<|JZ% zIy2-NYacoZ40D;6WM~_-gxvBJ>!EUFhDCZG>95R^YL-|8f(UOqy^E}>1EuJu4gJ$zShIbW6|AG@ zt)6ZXKZ(K2M4M|^3hDH8DrW^7fmvA>L(yxAA{qScf%EAF2C*Qv;`rXXrJ6u zN+!pMcaV|+WuqMfIE1mMKmJatkGKv69;EM%E!Ro0=_KJhGvI}#p7Sf@RD0C>!|x)O z8iLhH2oNl9^KRBNd9w||8iz)Ni)LbvPpN{5Qozdm6Jpu;UWV(}Anws|<1!{9TrRxu zQKoNRrYImPq=+z~f?me=F>tPdkAjY$w!nsB_3$DX-&!@J((6!YFElQbF~NvFE_%RH z!$y$Ly;7G(o>&17#4eEU9Co)vd7mXMF?VpB1dI^R8&s3f9Y*#wN+bw0w;C zddz{pQc%ru{U#4c69mM=J;gn>R713?l0_>x1a4h074yU7c~23eFa-@q7tFFOM^4D4cx=u$UC*`8)O%Vu_JrJX<#_6-lGV%x>5w)rTS`$QZk z{5&h#j-E137|df*Xj!y+0^njO3p)=eBfPIaPS}(M8@EuC1x4Q@|B&@Z*DRId&EO+~ z!vKbcsQ^nKh&I_YmXDFbhY_Vjz=s*|BIm`AT=vN2fvJtU+)Im)jqaDcxIu(H8H46p zCN5%b#L^jg^ojEer0}cxw$w2(mxM4LerQaj$x=A&ph+k{ z{o*V*`N$<@k+BF!8B1vOn8L1!p_sZIjhbz!g3LInDW(WH&&+O@t zhW#8?gD{ef=50i%A!(h^K+?B`@3PVR8*yHr;LC@lE&#J!(!B30ajdgwx(BJ1k3J{6)BT@s@-4jj_R%d*RG z!ArsjP>c~c@Tt_;J5lU-5p!02>85=NCKL$e{5$7TO>if_v9w$vm-eJ** zh+-%vbcoH}=9$tXK;rQa&7jsnh4F{@D`2<68F4%?7&MklFF(|F!>(&L7;H*MPNKC9 zMIs<-LC%LIJrfBiF^6EU-$*NvRDj;TgGN$o~hg0irt}T0j{ALTM6@dr1^10H_fN zf+mz~WrbC6%BAZA9SWMRABBM=>quM*i~gGVJX*(-FgMpg;fsOu;z;@ViLuxaHvuyd zLsKyUbI}?*x9uD^WIBn_cMZwlxl+Wpsc=%EhBJKEHc@6vZ3o>;FxymWMhTm#ih)w_ zg!_}sFR`MAiTBXz0}I2sH12k_3y!lO1$g>fI9hYCVD;FmFLo^tt>O4~ot-O=O z_wx6WvbPtu`96;qlBqgBJXU${bs_x&J?Zg2{WM7Qd?Zmb+rzk}jPZ!i+LW+=5c|g8 zVC+8~_k;f3k?SAN4=SLp)22b2gV*;(&iGNhM<&Nd4Lx}NDE!;&l`&I=55VBIgy0d} z1c6+ykIY4LgSH)CTkiMW_+M9K=i6+UO2$BGkIXB}w*>K^#W1S0jN&sis8K&qD|Idl z;!3X!2O5q_&x@f^`Rj`OY`=``ksXzJLyFOh3PTY0%0?9zLkjs(3m}s*8RE0v3vEC= z&XfR$=)CbB10+3C(r*|IFSUQ!s2${0WFkwHWL_YLJ} zE5b*=Zw#mZ|C8%A_5zXr#x4IhYN;0HWjvoQEWmJO2v=Gdv+5y8W5l_L&hIk6Ivael_R~L`qrw`rm*KjT zT-3qYG1%STKt{~rkd{_~mYmTouueUwcZ;1hVR$+c*zoAv>)XS`m5Nr?2LE6vV?V7Z zB{RxgDs?iIvHu;?V7%e=dL5m+LBrfgB;tZ54Qy3jm)5SIz4g+u@VlSA_s@4uVq?DP+z~2-_9nw@G7}!4*g@BtZUhHC zRALg4eG@{2IrO#o0p#Z#;yuScwD=O|A~Wlba!j1-`^Q|=h>k9OniZ^h()?;K6 zT)MI8AK7qy>OGH6SP+ic!kTd&O(d;qb=d)3&bM_dq1SR;KF``^}VZLpp=(LqW zFC-=WasJ4i4bZNqBCt2>l@L@07X?Kc!Ac?YBNW6#$y*fMLjfHKQ!+^;gK>Fb!7MOO zL4k`si~>~>i}262VjevghplZtO%8Q~p^jfwh{<#^?6)do?-wp{#3thpidPsJ|EXVM zFU&Wb%z}-ZCNx>bh^s2hW&Yh<#Xn8TvR)fR zT+()g%j?D$GlaHd>dqc5&BP?%0VjWlyo7hKUBaFcF7MU2Aa<_cV}yn|C#He#`>jNR zwLi~iIkwQhuD9%@<3y?OPpA*a*|THg%@EX0Gw^FWuZ0%JyoK~NUfmZ@cTWQO2w$qAoLxR22WapXad1I z{m%rxM?)iB2oa|n3ql*>2xR8bvi|e|zz=*P_5f|CGz za%5)Ap>VcqEF{u2&Bw%C+QeT*qGUjiRQ})?F*ydnhe{IQCJW-#(R=4P5z92~;Zc6t zMHHiJ0O4ooyiduTwCAst&tq)p{68ZJP8V-Yl1J$4lbvuCAOqn`2}%yTmpIAa92kKv zwfxtFZeU;_G=i#u%{PO*k$;>6@;&0bWJ}}T-%5~SlJ&&bej_6AzS3UxZXv9}R+vz5LE2#oov2=_BhCU{qAPYv2i%+aGV_0Y`*e>>vTEy#n#S?VM9}=!u z;LzfPg-MSWu3NOAlRkoeH--RBQsvT_Ns)~O;ra)v21meh2@+l{Rk<`G9JC++HB95@ zXq^B{ZX#|YLk|2xB!i8E-4lKjjsblq=(Lz1SSA`*A!<+1T1h4!c$7#2vH&zesvX(z zFi;1GLp@hIRN*F6}L3>pBV z6Ok)1;67MPD}y0WAKSjfAW9KIPBNmfPk6_6AtjpwX9~Gh^g0kxIm{MJye%F=ekL*1 zrlW``%q;^e>v)f~9feCIt2{CYtulvHb+l5QJ2p6tl5ftsXc4?X`M?5HyApI>!j$dusw3Mznq__~1}{hf=8U`sL_Y2St!$ z);3hm0oSCfJ1ed0tRBQQP@Kq*KgC^atj!Bi7z$>|>!#Ws zcr?=v=xCXp^hOU$v2D0Iz(GK*{JiKaKP9d?FWwKY4o*BqrbGB}Y$zWN7ULr2(MK+P zkRKt&E0_ALdEx@v03j=J0ZETRTPBByLvPUU;OCF;1Fv{Q$jM{k$4B2(_9zU@7%?u^ zz~zMpdsNe7qLo&Pd87<3fk78egd0s%@b?bwC1@c6Ft~|K2DVCHY%FYkjAoPol zzPi`nyQEGyWElsKdIEZiK_}%r& zyRdTnb;Dc+T7(88wZb!b-Mjhr%B39xL9R7z&w5w4L{s5-2Kj$}u9%B<@ADH%xRx4& zyM1ug(~iaG7h^gZb~zqKPU)LF+GqOA_a z)R8TOb6j>2qB?-z(fPXt7=J4u3@@DWYz4xC-v*CXf52;unfI~n zQw>|SZGf9NGXYu1L8!+WvwBWqZNPUiuH2?E#_YHP`ks1xD@;Kk2*kBAwTwdi zj+xVSVmzgL_pPRdbwolt*i0Tu2Vqg;_4cklg=4`vhs}7~NrW3yRJd@@LPyQHd)m9M z{d8fp+U3ZDNWAr&3iD-V3~rf&t!Z8C<6s>)J&?H)?tJvyU z2y_{5wtKnI1cZp%sP+aw+9D#Y>jokAvkqn~=nbG$EXZ~BiDp}>zb?S%@fmz(06mP? zyr%?(ttZgE0BcPhYi%p&pR02dK97e+D;k#h#A5Ym;f;dl`GARO5I+5qb? zevhPcK@SaZ)&b!+1t3C$A>oe;>mu-Q9k$8c&d9`WmGITBzjL|`>(cS ze-MZSvu()BA6{5UQ-K}f&H&YBrL#Mt)#dBA!O&U*9q^QrHg$HO@c0M$f!08`Z$-Xe zW!%0Twy}9k9B)dq$#L1BA1--bid;Yf|id2nK(Gw z!d=3z^9DFXaktQ8JCDeYKqA7d4gs<5uIK}S5d2q}36o8k9*C|E1o&C}U3VS?pB~`T zvyERx0+E0>=zbQiPL`FYm1ke8&9^<&RZ2=iwk<%iZ2@<{mg4DhbkcZt;C12lLUkLn z07gm7Q;`84KoZrG&`XaZ`ke7!#JMzE0?Y}i4y1Ml3TYxl1;BT4r}3%TZJ-aHpq>m4 zfYfpQN+3Ui=x44Y;-yg_@&llZ1NT4Ftr{VWX}l@Gn|NbjULg8NfH6j!0`SjfkjB(S zXkcSS1;vV6r}HQ1;QD(5s~TfG0sqjzUiOvc!?_taxhgy6Ac=d$mq~PHT&!9hAX~(R_+hH}Wt#eHCbB*7<)fO4xgjWk9o~|A=lik3#Hr30ZkTf4v z(#GcdRJ$U|dA9F(Et;DMIu*4(KEPoIu!;j1Zo^{rh6}GlGVUdNY2m&_2HSC4cmBOh zW>Id@;vf7a+wy*pTU_*~qA!d7URYz_T==m4%c7_3pA^4ae4%&|Q^i~?PAWcT@3!B= zyi)i`;roSuDg3A~+s+l?MLmo5+IQM}7j3hvioPxUqy4AF$px=3a^?NLpuRA(Ft5;1 zD127rF4)8dE(M~^53&Id73#Xyxu`X~0sK8f?{>J=lntjugiRB`Z%?&b zNI_ilgNrT=f|}XL!sTqhLHGv28%6<1uww35iwG+RhEVhX_rRm@29dtxhZwS2?Mm>3 z%SjpK>1|AOC|{IIaaAOg`A^8hMW~xE<7Da-bN}16B7wV`a$2erFcLR|JNepIoCuSxNaBlcCrIp0X3^vU~NGL5Fh{PbTHcSWx8?gvp zG3%foS#;Y!x#T9}4|-`utei-V5lIJWUB;`7mW;+HQJ1X5h&R?H850v<;6<^Cv)>lR z3}^8oG`<-Gp+P?!1>68909NRXO?c-G)|~0~bO=fL7@O{I0a01n>^u0BG7@reV-M?P*O9a7jrSnVDVWcmN7xuyQzvGUbmd=Z@k%3i&7_*)oa}hRZMMk&nWH zm+u3~8ZRr1G4C#(r^uh{lcN~X3rY6-9^Clf?guMg-%!AfnQwIGMiw48kbK4Sx8L3u zEAiayzl01IQq9PB+O+*jM*XTy5v^|H#$|9wG+qYAl7i{i?gg93-iabng$yRg^9!#o zJ8?pQ^Aruf4}w{R<9OlK{3p_GD)86kugmib3rNN5@?V?Z z{(by~SKrLv^YPeTk^SypnN`Q_(XKyv)?M99b^ZqIMnwLVoNs@+S&lQ-*}0+ayjKkf1|Fvq7$MqYHjAf z6ab%}jgv}-6MkO+F-t~2zAqEvY4$hZjtD}r7r%q!m&Om1^eevl)qQvWea#=H{*2jw zviI|^KmJkWvG6Ba`;p7`Co|Xn@A)r(bmZ#&`#wsL=!J$5hokoyl)3qc{+u`Dh`xLq zmi0O_j>B6$Tfz8_*=3N_?!}8S)jnJ)+sAOj5HZI$(sH4)MEFcL9OU# z4p4JYc^9Li;2rZCk8v?C6n7WAu%@&ayn<(#k{8y5JIPjP3;lluxh^uk6sjG|3U;j_ zDob{)DT4%gH);Zjf*02ybY|4~A=E*xaDt)VM`Z@#5F?B*h;|mTz4+z4Aa-LI!oMa7>)^qy?6J_ ze2bUh5!Zm{{=*OQE(`lhdOD;p@+>o7@UbF9Np&bns*$3kzScPiO4Ltq>ZQ zIRiet^ap(TeA|l?#^Mkxie$W_2j}o4AVGhN1Q{0J@8)|uJa?E!6RWvP^hr$Z*qHWZ@n z&5PlKy73f9aGyPRo<^umvb~VfoWQbgVf3BLA;5>+}Kqm|i zepo3s(;v(&DUHX-v`BD>6&N-R?3hVmjH0v}`XkBGoE&&#vq+Mh1?+=jRE{y#Zp5bq zBQet+6)PARpS!xc8nN4EG%^4WEfhc?N!x5R&uqGCy@5lcpGAXoX?zJ0G%mi}K?^&p)9 literal 0 HcmV?d00001 diff --git a/Cobra_MiST/rtl/roms/48turbo.rom b/Cobra_MiST/rtl/roms/48turbo.rom new file mode 100644 index 0000000000000000000000000000000000000000..cd44e9229b7961b7488b9c267c9b10c5cb9a09f6 GIT binary patch literal 16384 zcmaibdq5Lc_V7&J0rKKGfQ3nh>X?WI#4sX6-bhh`pwjA8t6jBjEhuVvs44C4+O_+r zc6YnmZ}+!8wp;oX?Zcnlhb6|ajB!L%9UxoR$HalR{Y z8P~Et=bsZNe8v`*GPJO}J|V^7oI+PW|Cy-I;SD|Dyba+USa4?n>vSbfI+^*-4<*Ds z<57U5@oU~tuncfh2Efk=`tyRSN6-!l#KIv;NMvv-7hZ6m)mERbtgb41;>{Ya{9KK# zviee8No`qK^_xY@mR%^iw5;gVilW7Dme@*ND~ir8E<0COd9K8Eaaqy1qPlZMB^Qg9 zom+ga?D6xc-O>wn73YeIFV>Wmxhu~tue(sUtoF^4MYV5M+b$JXp0iyjsy?0nPwPMP zPcE*kb}d^}c5Yd3-LkUtrDf%0`MHv!OXarOB}JE(*jBj8YK!VzwwkhP@-HQeZFObj zUzU{BR=8G_)mD~!ip$E*msHl4EOu2^yK9PS$}W^IE~@J(uC1(Cbg8l$fS~P)vJ1B5 zmloI50%waCSJqvsTV^|7TUK5whT(OuIjSEVq0x#*@Y5Y^|H$9<*w37zP5}n zw_T{Pk;{7FQn&n6WpxeUu@#+0NEVk}swrAt2Q44JRAZ}hMbOtQwq2@Sey*-)g{!ux zy41F$a;2-XyJYdj(%PcIlEr037i!CvEw2T+)p&{*Jz<%*tYSs=W6N`MYRgNOR8=x_ z%SspC9+E8jO+4BvM6Gv{G}$xRCET>t6kSrm0}|tObUD z!xbw~T>(-FBGu;^D zZ_Doy=pG@tXXna#f#CRGi@Nj}>$a0}YMzM{StfVuCG0=R>wKE{JiItb&kjJvNqPo= zNCIwq&zfe+BBk<_Y%>+EmWNm1K7Ov)+nlXn!*2XKhhEO>%8P>6cH-Z~iP%nI#(9At z#qO3ay;PKJ&*gRsdCVNueVdpTciT990GH5Wc$J7H+d2JAk-Lz-?OsVoh27@WU6QVD zlI#8}Czyv+_y0#sChM1p+|SS#1;#8NASFHB3U0sxH-XceMZ$dgZ-SXV?w5DBOM0$r zI7yHD8K@`U9MB2|S|*TP)-{~9kh`_pUEnU5;}_dx*s#7&Jgm%H#QGVHMsr7jVVERF zMTXT2rKbkO*R>agQk#1tscid*R<U zQ#fxhtU3FO>T9U&Xp#fKm8Ej3RE>bc@IHwZcW=x<>Y9 zCOIK}^yZL6HV4&MRkB=k$JGlIjZV1~gc38{fbIHVqZQ9}J}TWz+-`NZXa%!GR*c|e zR&re0neR?G6)#O4res;x7l4WLZTY7JiEM#Z;3mEkJm5yJ9x$Tbm=G7QNVsLyToe#* zQ0pi8#{AE^_%W&ZzJ3#?6-;0?zu~V+%>mh;(CsU0_X+c81{soZ2&lhBxMaQ!Pv={& zi*3^}*-;{0LCVdV;T;&EaqB+lYE8Gr5%OU>_CeP$m8y_^I2#8%=dJD&?gZJ<3umOz zrM8dAGrI&FVLWe5EFi-jlAbC4-|>_5t=2gjtt*n&^;A(Q^jWVBLj)*uj4)T?eeMn~aM*s#w_1%gLM zgs;d-cqNF>yfST!|B!ZnV~*Bi2w?%8(2JjXB|?Ls?8D8`=n_K>Z&h1y_f{IuA8y71 zW5P`G@)&aZmm8@9xx>aoJ%9jf8&YGR4dN!tDkvWO&Opwt1x zdH*y*!@o3bM3_bYuud`tm4F|Vb9ig?@Rpd!gKBt-`l(IB7EDZ(3TJ2~01R8y?L-p7 z2279fUw+>R!2%>^e1Z+Gs$+A5wZl82hquQVt621?8Q!i9M3~s3^nomgmBT)r4(rV2 zS4fAw=9^Z5#}mVrTCutvhH&`gI4M%!5hP}hu1o3SqhcJxzCQhp$z)lSJ)ab}w%g)T zPEsTuGpN18pIv}iRfAq=Cx|1xDmbH12%FG)%+Q(Zl62F7(14p5T`!QlaKPY8%x= z0o7dVq*J5_MBt#=Ls;II?C`k&6yczTt2M*rTBV_i1x|PQyT~YD+EC1fEm2tCcPPH2 za@W!x=<`is=0yrG8VozMNlu9afr(O1rkczOUw}W6>?Qug&r%Xs>^7mj#|PtN7uxAZ zKcy8ecl?@|P3yO9BiA;xlFzPh zJ)){{lZy4u_t+nUu+va41utBbK3J|%UqI#!cPiCSb$ zK0%75YQ58=%G=LQge~>BmE;%1gtGUu9D+Kt2q^ z*04mh?zt#Jj0$SjxReFu;B>c@e0!8p&DQT05-;lv)REP07F>;Y!CmKoZocqZe6RX=BqKLsa1RNfP;dWAJ2fa)?M00`|&fw0d!y@F?= zftc>Q%jmD75RW0_^Vmjo!|;q?S!84+8B^26fA5&zkqe` z5lB+x?w*b{&YU?@=?JtISoNe@8tEe~>*slOU+bs+XP3wHxqKj9* zS6Taehu;gk>z}6;{(rgaNzru%N*kbb&)ofV>w73FJ`9Kv6^sx^x~@ ze@kSrL@F38CbbI+8|cLF>dZ&zl~xRwI_GSN)HNMKCzE3=y zDfeO?&J-lSFWpBxFk?IdNtX#%=%PEM&_FMU*i)o`Uc;*_FQ~%hSrWD0#s5+Ly$p1t zD^sdvWFU5H9HqVQ;M%u6-PE{w^Jl#=f{1Ak@5vfSJ|8S~RUqQV{j85)qH3AYKg*W4 zFP0rvOs9u?fW9bBjJR}lrGB^$#HYJkx1XGxJ= zbHu;=NHfQGs`UA+`-r<6kOPZ+saoH)GVfQcl#r`QQ!^-!_HNjcC5m($CI(E34rDoX zZ)+DacW`|YVT5(mup4NY_wc_}MY;{RfU#2b6g+^#x`N|+LXWMA=znZv3_x$7i-fBJ zWa6;u_oMml{31%01ZB0tiDw8Yy z_sGw^84eZ6^FLQd0H7L2f_{kPA+T!MlNKy4cvOeWlMDR!Do9_X)fdoe-LrAfWsp}n zEe7YQIXZaMq1JO~pbGBPYz(Y@24=?0nWalO(1v=X!lR9Ce&SByM(&pEC@lN1RNPiO zycxUvax!XnH`%!GfdAf4H)_WS)h+0>3@kdl*M4J_Tzv2VNnuBMXGJrm{T8J5>xkKE z5yS`lqKgme`DN)$R0NJ6QTN7t{@~?%=71X9V41=l>yC4$eEuNa{GjdP1MLkJd5tp` zus;0@T3>Km0Sihvk%)y?PwIOx{u6OX&uDyLOS1$ylPPGKJY0m;LqHoN4!d*hXVSC) zzXtyMjjN#V@;$IZIH)buRszBV`5vg`YZGJRf_1A{4u(emh6Y(QFI!D3~A@kgk1@rM}THURAE zA7lAxz;}`rbAs;!LZRPwzNmpQ*+3rx9ww161^vDh5T?_t@$vg~CU6XZo3KTWc>$eh z_31}+$Oty{J^p{^+n_gj)6zzHM|5JosMykUNLn9S3MCK?4IDNwd|1bX_m7KYFvh${W{rB z2`Vzg-Le9X4_QyJ>SORR7}mIx_1vnkE(}(zd)6W{{e!&UfdE};i1tdO0e!5e|H>j-1 z;n!`jzyL7;frCql^RJ{L;zt0g`ZTZ3%VYB=z{rNT=Z3dWH$<~~95W=cKpa%|2;cx+ zxE`tyq8L%PoF7lHl7lU}{c*r-r_O?S4px=1d}@j{Z!lb~l40-&vl3yYQw1e05fV_g zOofXv-4<3~3W*CER|Zc2CzHU%pPlc=w%gp0$5}=;Z`%G$OcLd;$fosM*00@u>mfrZ#q}Ld zpa#8J`y3!3n;ILRgI+a}n>RH~u>i;-`7Ox2ea|b(ZGG3ea*mDs(fa2%J?;Ch=IO@G zjXQ2m5#Q9Xy%Bt55V4iwl-ivXJZy=$9w>U}8fo<$G!q7(`Mw6+<{$3y#t>3YNqs6uR`o zvfzbz=WxX#J75Z)0IMHxY%y&$Z8J56oQGp?E8o^u-BzAXsC!X!I-wRl)wK7<;+PDJ z#&GzRVOnJ08c5_Pf64n3hUojfa*q!d28tpSY383qo>x;V0{pB*uZMfNJF#&(3uQKRyEMLimcLAv$8*+3^bXxQGMXOejVrwL3Qa8adLpe zuz>E>L=?i^T|uqp!1P5zD#{ToS<5;C6bBRBqJl~P&>n%9z$5_}SS26$S#cpm;^nomSM_k zRnj_f4esSoYD)_#ouqEDT(4yz-G|Y_4uJ4X!Me>X5j1ROjhk6` zN#g;2E&*8H;;dpqWEBAg46;3^@x&2+3(3Tf2n&GwS)>f5M+gPVo`}ECd9?T!Zro(3 zM2OOGemOA+h&Ir7@}6bErjpm+>+$vLfs7`(4`SwE6#%v;Ct7K#4#V7W;cc0Aq0n*O z#nUMuY7A@Zpyj*+n8CaI1E6ZJ>%q5w9XTen$UOjN9ePJftqTDL*4BWXKTg29N6P|y zZZa|2#|i2#q?{CG=RC+`cmKm3o^rQW^jk1ka=qd05f|OVffEJDy7G!xx15%Amk^1F z)}O6a?iF;j`^$WwzM2+UOZtIU9|t<>3sBHWa9O;FpDs{SZfD0mLe;6vXTA*<7tkT+ zcmkiAX*LT6W)^heb-_(%2zjI$!IQ91m{-v8;By$rsENEEv)3irKW0M!H!ujwR>v-T z(gCsoS)51?5V!3ox+uHpQx5t93zr&8=o$MvDe2%S)MuyxEVxR@gMo3A5_b^|OB#7K zA(!)kK$#?WBOU+p{eLAd#HE;7q>fFZ?B)lA478alr<8q>X$7;2A5M0)%&CBkpBQFk zz?<9;2?;cnOh91_O`G*BzaW!8oXJS^H-?m#UzrAbH~qd&cMC~AwJB|qQ1pXF`2uMq zPJGK7lkq=I!c~0-F1ukB^!9Pb-2eFObmzyv+5g(_{xJ3P!i%#vH*8t-+Z79oOiAgv z&83?NGf0hUf_x)F zBD;_5S884&jRP+4N+} zu$&FRsMe=p$f-yOH>u9hsqy?Tl4(V6A~fxCIFMWPHz5z|ov%#OJW{3H7`^k?TR(oW z7iRlsjg+3tr=;9!K8@A+PW(DZ>Ig;qb&%QnrWb-_!>O`gka=}~KW z!g3CN1E()n3SsjM}!SmMdW9@hDHA7nC z_y~VRPaJScWzbOx%*;O_k&Pc@xLyU49vw9-#zi8=8&F3Dj~dI^0E)R+sN$(6{_-Q|!{rRr zLB2Atf(@3|!|I=Q3(`N!S$@wW!II^ygVBxMAy3faG2-hnEB;z`Da-Zh?4V7M5chZG zc9m1r!IEMY&0rsdb>2kG1%u}}PmID4RG*qX&A0@4jp-C{Ha>bq(&3>sqgO1L2p8vK5~hP=a=9@+J(7B#If7D_^^gLcMJv<30?y2$UKQVr z!RU>E>ksx9#UgwQhBD_I8c>iLiN;5mb^3bh7%^e}sv`KQ4ihUqx8K(*18$y&C7X_EIh0T05a;6!^mVu%;Ub$XLy`Teh=xk7 z=bZD?;ME=eSF_BCV?qWAX*~S+m_U>Hu-ieCP=Dc-X|VH=L5c!n0nj$2XOu+^GXykc z6m~@7#)JY=J@);~I)eKP(N+pbW=$Gw9c&ro_?!Ck;31rc z@dr@g{Q0vX)2XYOEytpJQsM@QyMPky{9EE0Cv{g1p$b=bP{6zW~@Im5^ z&p3g~?Lrhf5K-h^T~H@NwxS~tMp% z$KBV#Z-qVLXb>=1ERkA#y!oz0)vD2$rB*|%sTq7uz-1?A!IYlL1mx*`u-0#&B}gm4 zZa)k{AwUI!C;3nHpt105F<|_F9z^npE?D&v3&B1jc*JdYpCqS6G5}tfj?hGaCJ(0` z7;qv9yjm3hL(~A-oezy*i~wO|5YISBlqdkG5lDi@$9G_CZi2xVJVV0B!l8+=&;U09BN0MFF#%&y9~x{M?p$r&jurZNUf_}hUa2ahyUE!=@NjjWv%Yh;DcTmc4JWd3I>U;t1Mw}u!(dZ94C zb5Q^qQ`u=qEO6G&eV4z;2vkp4f=!1)QBP4PiPBH_H4O(`b%^Ba3aUGVVXPM2I zOvFHKm&hT?GJ0{ZQ8Owvj^a~1$PpcQ8zC<8;!=kQ2OdsEu2+1c;=_`xbeD+i5}gt` ze3H>C5{(ykh(;w>d=l{~BOntoDZ-16%gw+%&g6lF=*;mh4LsT-k1oxqk8w!pd?J3_ zn{`!k$hmC#*B^zLto6cAr^~QvE4q0g#Sjj2d0`t_4 zs2eS;4#Sg?!um(wUeoF)t{2wJo^tj3QjXA)d@`lLCX>fgDM#KRHQKulhr`;w4=l{x zSR%@+Q@~Q?&|X}`O-`bY01g`<0VNh+e|)1IG}kbVw#~k2ihX;G(?Rm_VIT&3H(GPKRSSYK)A7LpNqMB{oHwi8TV#~A{1fdF<2K~m;^o)o3M(T}90-05FfF}{Eylsm%@*XYPd+;Q)O zoxkG_!qMLv!Jgn>*sZWZ?p)#y5ejBdNP^h+n+OZ0-b|gf?t*jHv-$kLxSlhd z+x4&R9!#cCM2W=G$d3%kYu?zD^8miX1c@VMjYTen7RDPa3-TT&rp7%oSRtTs2dRU9 zq+)C!!v-zJP*7?DtM39w&;foE;p5+<{Uaw}kKjFeAmdXy#%lssFXDz0gB@qzqx)cQ z`$-nw`hZd~8jQq38aBV*qp3uU^7RAlP^9yu$%_UMqSOBl;CnPQQuz>bsxdFLAx=VJ zCN1hs?n9A_F`B&!iP!!yq_SS9@Iq+}cm_Ip=05BM;CDu*`t0+k+s1qXP1Ej>kU{I* z*N`e{&?V7*Y>c=w2EfPjV&EhTlGUlDGmDVO6s`VI_oR);MaKaAFVLBvl7^(0Z!Vn4 zn9=@!N*wGi-oHbhq;KD8hob-~2w#FX60kdnbMAY6BS2E={+dwr_4WBi&}$I$J+E8q z-ogR*8yOHTpI`w8NLxOEFq-3m9BMfC1v0% z=8th8(9ObGGJ6Dt_{3^GhWW<4twI;6M6zBgoTYs(AAj8ln-*t{OmZ}T+o%Ma^byeA z-~%*q#Z^;-A{z6;@elMG0s-SycyK7G;;I0D%!mNwFpQt0c>*H2hop@hIfx694%YN{ zPPlY92K=3+lR`XioTzyMaeJ0lMs#xBvqT)Q1)wpJw+JVM92x+lV^Jv4*K#bEmU?|)KH9#- zAWIQIK{Dd7hkwU>IU${cUr9ua6{Sle zUU{G&TBQ!iDrnu5O5P#kVzrEz`-cWMT|J zf>lk3Y&mIeIo9L5+wWTTBxNCkCs4l73q3DZnnk5ct_C2w5W)6npBJ8bA~_qA$z+EO z&~B5%3rS^Sw4wo41@1P8F$kdGLIgnc9=*|k$YLgvF z4GbrWBhb8XALC!239bkeITZuvRUGbbV3E{=XS|gZ&6WnnrcZ*pTqccPR|ZOD-!_68 z&Z57DQTzLtqxG5T7)8xY2Eq2be5FgilUTC@vM>~klB0!cUiWOO1<=tV3+V`+h~&26 z=l}-^wS_}M(Zch>sv%)5+;(!pX)+nohhqa-u(22wSQz~AqKdhO-Knq`gpqzgp zvvZ%jwYX|$pO>poI#8}OP zoRP6+4vrsmo(9j=njqRBT*0XKOg8NsYk)Tb$C4<-NxaK-3q(!y2TRVCr*4cwrv-Uv|;jc-M;rwHBtYw3bwRYV6$(&%R&6)|Bc+;Q^bEc;B zH%`Z%TsCuN^2{fa7w_)l>=vw}hk`g!F!i{=k|>L8xhDG@;7fb2)xr5DAVt(nwN|^( z5)r6h-4D5+)i7dShX*}{yj(|*pf@MFDm?B?cZxgJgD%>ej`O_4+~w(x%F4Oe67l4;SDYasnyG$?5%+57|msaO?=Z7dC8ut$}$MeSm*7n`#0()W@0n_}^rM z3ibQ=KhCKLz{PgLEN&?ZOzeYU0O^Ok&Aw;WCVK+G#{#>4)tLT)C*VytqbPrPP7Y0Z zcKh2sRI`ar-x(}jxTX!dR`1yf*T|z;p6BhcP)WsY$g-s)+L$6 z$&5&Q3j%>_IYZPD5D^Dl8~VZbcp)=zwFs^)@7TOx~SZjYrhJ30v?CA}m0s6YL$BYNUS`f z^pVRvdQkgsVlc@Z17kwUJ&Em}9GdV^9*A99lH7^u&0r6jsBPXp&^oSH3hW0E|IBT~ ze54nMeGeF8&)R1?Wg~<($*uFab#AR^rYHDg52Fp%df?BjiS((1P{6{9Dsm}zKvD-*GOw7kNd2Re5@B7FP6!5hKS{(z~%&7fae zYQap}2YxxNtgueHXK25Dt2xle@vmnG>>XWbBs)QF&9ePqkQ5&k)7rYnWqSkCndWcZ zN;EbBv@2@b(#K&(vBIMmZpK2Dn#+gbG3r%Ie$Jt}8uJ-*XVy|Cbza821wZ(WH)sB! zv|!$!=6yNuA30@~hMY~7FXwHye3JWa?&aLMObK%(H!kY3|jk>|?>5(L^e*N65{a|J` zuy8mVa1hRZh=x%@61M-pMYOre^+O&R9q{j(>jk79pWc=2 z;qT4`IHZ5Rz|?Edy}1D|CzGaB!+|;~PJ1`NRq(6lW6xq?Z;vMG@CduA1`EjTaL|{nxY7%AG}7&ooG7nu2wRn=*Z{IT12J0+yswAR1tl1N)d{A;FxGU-0tFFAHy*;V8yV_C=c+ zmw>y_tMs`l?9_4e+v4zc!JaUXu}-l>NIR(`Cb`dwHB-%0Qgb?7o4sHQujK@Wa*46X z!}$*4%c+O{)Xvz{*gmcWK2517@dAxmG2!F$bNT`yD9beyyv9t-gx_~NM#oWCO~i;J)DdweCcePug(fb2lM~Wh!sns>O(F30 zyI?EeE(8HEL#KSghj;MibPpzdaIhGqPt;`0!@wIr16*$u%2l>>Up)}vMSRzb!Zz?D z111aFtA`yfh!It!+&dMmfg3m#P74nsFXA8y;|;4I;klHZI#$MC%|wUD`lhy3BZ*1a zUyLMj52PU|l)&{Tfa`7+$J~ttJ`lL`vw6@NU>#3E0~j*FkbrV+WaoKF3FYBDt9K?H zs89BAad9cBsU76F2P#7_b2!K{WsOQ_jN)Aq@hB7VWh8kFmzCEg9)$@nJ_MRIUXT-F z-d!+Lk~PCAMmeIN$5|dfVo6uDJZyC(JH(-@AX_(zy1J`||5=W*zu= z?4ZDY`|s3}GnQb-pX{q|G*Ioo0lyKkf8FrSPZ}gy;Nt=R@N0w|Ol}t@0S^%6QB0OPS3EvHYbqJGC*IGdNB`wj=K8gSr~gh}e@(>)L)4S0|CRuJRys~f8IJ#b zHsmZB_4uJw$fsHU0%t@Jii7w=9KY0l7^hzT)vq3(|BqFF2>%(g>^S)O*B?J!eA@qs z(sJ^eWn1c#{~7x7>616s9{MOI!Y?$0JRE&UBhAP{{2TrvM*L-&v9!a?I1YFDqY}n> z+9HBSz-45T~sm9S9=d7(Xw`s){yHS}=npV(@&t}dcY+du zQb;`9ADQpY8=56>@By`R@p7$W$R24<-{dCJ;fFuNg#4PRQ(4{M<9dbVq;3Q4P~D zb}tuvu72RmPEvt1a|aoN-xxwW??hz({j>Qlm&<8MfiEt@mgNjLVWkE`9i*gu{abh zu$acr2kYKvxztqnwk{~lg+0uL3j)UXBi|edYf%5Y956;9h_Mx(kOFR=VQ<*W;ozxX zQK6LC2De}Tsf3J@$?fg@=kqD;y|CpR_I%iWu7m!Do51x602msyTH*YNUR21>T_C97 zY%Co`H4j>~AQ6hxF}iMw+^K46AZt5JbqBNc2k1+=~Z3{-$a zMjJ4JDYlv+GDRsc2E=S~hIkjx*)c10V zd|5)|dpWf%b?SS$6!=~)H~;_rUT%5*55AYvN4}SPLzr815Vox38>MAASt?6#{~f;r;_3!`;q@kKu6iG2GDq z?_)R*d<=IZ|Gd?QK872-Fqr?tkKq81RSF-&Vb1?Zq5E(=dg@0DKX7&q%gC52XV^2~ z55p8z+8Sk5VC#OQ&`vMMFfFY$mgYe{z@i_C0)8YIMj`|xRKzQ+ig>sy;Euk=j66nw zty3ioBhaaAkwk&u^UEKrU6&7aG~fY<{9;jlp&i|0M8#0AAm~MQz+*4m6)EQz?kYz0 zcGMow<`?Hj%5b%cpdL7k{6%hv0DvL>Fw6?S@B<~pdw#J*fdSt9$5yN^gm%#0UR;b} zyNUt-E>tcoM08q8i;GKJBJ>LpU%*FUVPWKbHF_Uu2JN7;5&lIYQG}n;MOzk?LOlRS z+7)kDS&Z-(ud98m9PU6b0*9y-M(`EaJ_h(u8MVtV%oid20+K86i@>Mo6&GiK{7`Wv zj1Lru41j;Bl#amJkywFGHR4AN{VjygwxIu85SlH}eP&q%4&K1eBsR?eXPf{YVd zK#wHz4F2I7NiRF5&GEl5r=T4Jg_s+KU&zn0R{QY3P-R?7f9w2%OUByBd+ zz#jl>wK35CnPu<;cLWabfUmR^;8D3HA^?O>Hbs|2?+Y0T$X&}kY>%2D_|j6E26c*&43KVr(N0)`dF;+Sh_ft@&#ZDG>&gBY;i#8{Cu}9*;vZGB6lseA6y|YW^}S4+62A>I+j9+>ePsEG%-Dp(4f|>cDp8a8XJ;L zfMQ0V(ee`yTYzMhE@JG>B)K)bmMdHHdmeanDe8%_^7fA8Y%)WcM>YmM6_sou=+V!_*iRq> zYzHU#8>AYkrXc_$U)JNAXfnDcmKahXN>(6Z^YQNBSINQ8ZI><9Dsiv+bPa3SFdCjTFJV#6*2!hTNNn3dC2-oHJ7gq$onWkvSm!>_=<29O~Cn=mpzBX~$MB^X#F? zlY2V*JIB0@jCqHIp|^cbpL+I#@ycy`CwW16?+)vgE_RTMyIXHx-RmRnw*0=q@|4tAxPbn# zF!Ldkr(xg{418o98%6ox1{fHF0on43^uc20_2B+R^n;#NWy|8v6dwK0?FHtMw}>%$ z(4dZH22$6#`D2J zgf`SPNFTpOIEky6wk&ds2MOmi;iOcXw^4cq`_}a9%=nukFFSfdu*$9IC>d~rGzs@@P{9z;nSDsGBOE?70GYIjY+%V;UocH zN|NxcBuNLV00>(EcooYumbVa1S+NV#%M<{|uuNl8v7SeCfB+!E05DYsz)S@IH*qu> zF1hG1n6ZNJziPtaTL=J%|1ki9Ix0*ru{%B9=GGJsfDLeh=2wOc*x69CcyfoNexp{&Iwy30hxOAi6y zWyGMC8-2s54L6ed@jk=iY{mvosF7xHB9_^wp~eavozW4CClr=;T*nDpuIG7XMrccD zYWodrSA$MIMb-whFvY({F7g*i=mb)V-;ecobv+LC7Q#GeQzJz+&4VY^2<{T!T^PfU zdkhzQR34@$0KjG%n|?tn*~5P~{C@;k4{YE#KaVdSj93C2z^B{(2j*k3^(3|iidd6) zoU`-Ub#ifaRs;UvWUZ_@w1Futq48(7y0_ZhW1HONhutXZ-D>xaZSs~M_M&Lkr8&7t zDByHqey34S7j{1wzBdCry42T4cW-LFc!K78qx+lDab0f%-;@@S&)|aNyj6TqfGy=> zTrpDuod_x4r|>irq34T^@~<5FhPAX&eCox=wT&u$6O_$V9Ft)9M*LK$=p>6yp}!<* z5~281SJuVlr@Cn0LOiEF!2_{Z-MBAtO_;_66W6?DqR^R`>rKpIk=vKZEyVGMN7+W< z_XU@ZGj$ii>Jp(!D|ZK%R!4D5Lb&RwuH!?eDGIRKtQUwL{5mvJ8NNz%FqxG>EW127 zcq-K8(L-<enH)=o-pYAq|R5@ig;?PYs40- zs1Z?N6PBexjwl(U@|iKVv~1)GZ=jVhH6D}dxz9=&su+7tC{Jipnk&oQA=(F{$`#s| z=j{eoTiN?Q_k}V}`{tS9K?c+Qtz#?9m5;-D+t+Q+_ISi9VFlWcDQRK($8INDd9 zdJZ_sW!u?kkE^}XL8pS?Y&7M$kD=aaf*9wrAfJ=%RAk~D-Fx=wJ@0a(y&BXJFALRc fxy924NeJO`F29-O8go4lv}fr%OhWU=zmfmH^@L4X literal 0 HcmV?d00001 diff --git a/Cobra_MiST/rtl/roms/BOOT_DISK.BIN b/Cobra_MiST/rtl/roms/BOOT_DISK.BIN new file mode 100644 index 0000000000000000000000000000000000000000..d3867aac97ff89ad39787e34fbebc4caa727d085 GIT binary patch literal 2048 zcmY*Z4^R}>8GrBXvb)FMJ>l>`^mgwMFK0BTZ3@H42FeJTOw3IQ>evb-W+ryhv7}o6 zpyZ%2sm{cxF||<>CF*DzjRR?-#@NUm6uZZA3Y?^_c!3kSYROuiQzCzMU*DnAKl9%A z=e_s6@B7~O&HG7PHP3=|x(Iw`=z}=>CqQcv0WgC`2so`pqC!KVkx(o&(HzpHJ)wcn zfK(DPtg}Q=JY`d?wW$AR6f!i=ZOQ02lv?3O&Hct`@f{&#h$oiXms;#y&)d^>*|E>H z)Z*%T-j%k?g?&*xQ}fy%M$BvCPq@MihrK&3!}3R%T>k#jd0mjBkEw`7B)L=as5T zby$rsNgd^0$Fy{Q((8!d@$>%@2PyN8Ymg&v&txG0(x!gH)>{p1w%&>aTW>z0i?prx z1DYRB5pGz70Y>Nuu7Dz(O4SA`t7c|vEz_RN@$+}dzMqd+&oXp}h%b|;kXc#92>D9p zTz;Z}$}XDbKWiQYS_S_PILMm(eAv%l3E)9&`&?dp&W>zHGN;&Vi)nr7?7yI_II%NT zc4qPcnLV}}Z^y$JFJP13lrhF@8cggD>;N`($y@edJc99G`DS?%{dXkAl9+9>5975s zsZ9RuuZt>nHW^|3rg?|FYN-%;edo2Kn`@eCx?D~!X_ZV|ulRvI_WGHg^d1=@xILep zzx$bE@3f*Zj1l5`Iydar4$QyBnz{m8e!pqYNYk9jq|an~Qfv~BU{9aQQjqA ztfcg{1rM%oaifO|kLM-7Dmy37ILI<+^!^xq;Uvmw*3Yf?IYHbt$d1)){FHQ$5PwCty@gX_temVm}|khl^)DhgPKQ z>YPL$e8?fw1Cwjjd164{?R*&i6KW4MWc)!!DRybJV9{xoV-GRS|qgrQk`GVpApz_kE&u*WIB!d4OrL+BkuA zr-j!8Ynoy{<*T!K(yeUR3r_jMju{;D=lPKM>6VnQ6bsYRyOORywR-axLT9}J;~u-E z%pyVmgqEcSl1}%hQNbCjd&(1KN1qKD`2h(M%xI>~U=U6xzcP+FB6!J~9VXZm9uB6w zL==I%NHX$+ZFGR_4l^9VBwf7AhQ%G%!U`}t%z#tLiRvZa)T6+rnm3}w-@>MoHT6;W zSaOeLV_dR|Makg5RUI?piK==v(3e5op*xzj3V|jrFN7VcpFbK=F$v$8AG}4mIih_W z*LrEtyt=miXP{p<8rx_fzMLSHkmb}%;(+>a3Q*hE=~}gT3)gGqZ-j;Gf@6liun!Xi%@p_IAM>|jT3NGJF492qPvI+Mr_73RZ~=zTJ-$M2M14-P z_!&0u$1pJt!u^<_(JUw+h7VTa9DbY>#omoYaDO<$6noDK86CrB6UZ77zrzfb z9c{SaOpN%=0?6WTSl>!_@Za}{JjgPG$v(&vw?p3HJWvZUrOYPv8h2>FXu`=_g?l1v zDir7B7&K2QQi`6G(C?O4ZC-cVKd#ILDQZ0aBdcmqy!hy)LA` z;NW8c^Ij|-j@!Aqv6aeB_dGsM)wMeQ?uPycQ9&4cg7vzmFjf(H)k~TTVqE|^4L^m2`>%)#d(w0o% zI*hZt3-@6ru_Im=$e5f+xfi@-G=J_FQpLYx@7yy2GuIov>P+CTlLTD7n6#zG9{>PA zWO88ya={S{6HGKmv4{cLY$I&U2B$G(Q_`~%lFZX7QFsTtW!@-!=*$Y+B4;65s; vSW=Rg>nW>zam9-T?qAhfTBpBn95Rj*+HiFJ&Na#VA}^RWJbiTQ49~v-!jGDr literal 0 HcmV?d00001 diff --git a/Cobra_MiST/rtl/roms/OPUS.BIN b/Cobra_MiST/rtl/roms/OPUS.BIN new file mode 100644 index 0000000000000000000000000000000000000000..ea5666ee7584bc24854c937423d47abac0e13537 GIT binary patch literal 16384 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 C_aLzV literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..deb4cb3dbfebcc20e2be9f76ee929bcf5b3903e9 GIT binary patch literal 2048 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 literal 0 HcmV?d00001 diff --git a/Cobra_MiST/rtl/roms/boot64k_v2.bin b/Cobra_MiST/rtl/roms/boot64k_v2.bin new file mode 100644 index 0000000000000000000000000000000000000000..a74b5883f33a7173abcc412713c00b5cf8b6070d GIT binary patch literal 2048 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 literal 0 HcmV?d00001 diff --git a/Cobra_MiST/rtl/roms/bsrom140.rom b/Cobra_MiST/rtl/roms/bsrom140.rom new file mode 100644 index 0000000000000000000000000000000000000000..1a68699637d8ffdcd18840b7a968b02e602951a3 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/Cobra_MiST/rtl/roms/hdt-iso.rom b/Cobra_MiST/rtl/roms/hdt-iso.rom new file mode 100644 index 0000000000000000000000000000000000000000..93817b0fb000a0e590a74df03169feb9d5426623 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/Cobra_MiST/rtl/roms/imc.rom b/Cobra_MiST/rtl/roms/imc.rom new file mode 100644 index 0000000000000000000000000000000000000000..9b6322776d08fbf06b32d9e1dce101a2fe0ef496 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/Cobra_MiST/rtl/roms/iso8bm.rom b/Cobra_MiST/rtl/roms/iso8bm.rom new file mode 100644 index 0000000000000000000000000000000000000000..cdd3677b8e23ed4c558003fd909aeef51a465800 GIT binary patch literal 16384 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 K;K45z(+u=TR?3}_u+2) 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 literal 0 HcmV?d00001 diff --git a/Cobra_MiST/rtl/roms/psycho.rom b/Cobra_MiST/rtl/roms/psycho.rom new file mode 100644 index 0000000000000000000000000000000000000000..65b3badc69353a0b03a6d517d9ba79fcaa1d5b99 GIT binary patch literal 16384 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 Ay8r+H literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4d6895e0bbf3fa543f192a66a297192b3c969ac9 GIT binary patch literal 16384 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

5RYmg65FY9s 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 literal 0 HcmV?d00001 diff --git a/Cobra_MiST/rtl/roms/turbo2_3.rom b/Cobra_MiST/rtl/roms/turbo2_3.rom new file mode 100644 index 0000000000000000000000000000000000000000..6cecbfb437e55bed62508be47f9a110a8f6c9278 GIT binary patch literal 16384 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 AI{*Lx literal 0 HcmV?d00001 diff --git a/Cobra_MiST/rtl/roms/turbo4_4.rom b/Cobra_MiST/rtl/roms/turbo4_4.rom new file mode 100644 index 0000000000000000000000000000000000000000..0496e4e0ed4249c4e2b40dd05b96e6737eefbb31 GIT binary patch literal 16384 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 C2x(>j literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fcdf9eaa882fc8b973e74fdda61b6cc9bf74e479 GIT binary patch literal 243834 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 literal 0 HcmV?d00001