From 5abd32abac383aa4131d7dd7d3b56bad24bc061e Mon Sep 17 00:00:00 2001 From: Gehstock Date: Sun, 22 Dec 2019 23:30:33 +0100 Subject: [PATCH] Add Project Files --- Arcade_MiST/NinjaKun_MiST/NinjaKun_MiST.qpf | 30 + Arcade_MiST/NinjaKun_MiST/NinjaKun_MiST.qsf | 265 +++ .../NinjaKun_MiST/Snapshot/NINJAKUN.ROM | Bin 0 -> 73728 bytes .../NinjaKun_MiST/Snapshot/NinjaKun_MiST.rbf | Bin 0 -> 316580 bytes Arcade_MiST/NinjaKun_MiST/clean.bat | 41 + .../NinjaKun_MiST/mister/Arcade-NinjaKun.sv | 358 +++ Arcade_MiST/NinjaKun_MiST/mister/LICENSE | 674 ++++++ Arcade_MiST/NinjaKun_MiST/mister/README.txt | 74 + .../NinjaKun_MiST/mister/build_rom.bat | 45 + .../NinjaKun_MiST/mister/build_rom.ini | 4 + Arcade_MiST/NinjaKun_MiST/mister/build_rom.sh | 100 + .../NinjaKun_MiST/mister/ninjakun_romarb.v | 80 + Arcade_MiST/NinjaKun_MiST/mister/rommap.txt | 7 + Arcade_MiST/NinjaKun_MiST/mister/roms.v | 103 + Arcade_MiST/NinjaKun_MiST/rtl/DPRAM1024.v | 246 +++ .../NinjaKun_MiST/rtl/NinjaKun_MiST.sv | 289 +++ .../NinjaKun_MiST/rtl/YM2149_linmix_sep.vhd | 574 +++++ Arcade_MiST/NinjaKun_MiST/rtl/build_id.tcl | 35 + Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80.vhd | 1073 +++++++++ Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_ALU.vhd | 351 +++ .../NinjaKun_MiST/rtl/cpu/T80_MCode.vhd | 1934 +++++++++++++++++ .../NinjaKun_MiST/rtl/cpu/T80_Pack.vhd | 208 ++ Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_Reg.vhd | 105 + Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80s.vhd | 190 ++ .../NinjaKun_MiST/rtl/dataselector_3D_8B.v | 19 + .../NinjaKun_MiST/rtl/dataselector_4D_9B.v | 26 + .../NinjaKun_MiST/rtl/dataselector_5D_8B.v | 23 + Arcade_MiST/NinjaKun_MiST/rtl/dpram.vhd | 130 ++ Arcade_MiST/NinjaKun_MiST/rtl/dpram_1r1w.vhd | 101 + Arcade_MiST/NinjaKun_MiST/rtl/hvgen.v | 42 + Arcade_MiST/NinjaKun_MiST/rtl/mems.v | 116 + Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_adec.v | 28 + Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_bg.v | 44 + .../NinjaKun_MiST/rtl/ninjakun_clkgen.v | 35 + .../NinjaKun_MiST/rtl/ninjakun_cpumux.v | 53 + Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_fg.v | 41 + .../NinjaKun_MiST/rtl/ninjakun_input.v | 57 + .../NinjaKun_MiST/rtl/ninjakun_io_video.v | 115 + .../NinjaKun_MiST/rtl/ninjakun_irqgen.v | 33 + Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_main.v | 155 ++ Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_psg.v | 94 + .../NinjaKun_MiST/rtl/ninjakun_sadec.v | 19 + Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_sp.v | 216 ++ Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_top.v | 124 ++ .../NinjaKun_MiST/rtl/ninjakun_video.v | 142 ++ Arcade_MiST/NinjaKun_MiST/rtl/pll.v | 337 +++ .../NinjaKun_MiST/rtl/rom/make_rom.bat | 13 + .../NinjaKun_MiST/rtl/rom/make_vhdl_prom.exe | Bin 0 -> 119861 bytes .../NinjaKun_MiST/rtl/rom/ninjakun.zip | Bin 0 -> 47075 bytes Arcade_MiST/NinjaKun_MiST/rtl/sdram.sv | 348 +++ Arcade_MiST/NinjaKun_MiST/rtl/spram.vhd | 55 + Arcade_MiST/NinjaKun_MiST/rtl/z80ip.v | 51 + 52 files changed, 9203 insertions(+) create mode 100644 Arcade_MiST/NinjaKun_MiST/NinjaKun_MiST.qpf create mode 100644 Arcade_MiST/NinjaKun_MiST/NinjaKun_MiST.qsf create mode 100644 Arcade_MiST/NinjaKun_MiST/Snapshot/NINJAKUN.ROM create mode 100644 Arcade_MiST/NinjaKun_MiST/Snapshot/NinjaKun_MiST.rbf create mode 100644 Arcade_MiST/NinjaKun_MiST/clean.bat create mode 100644 Arcade_MiST/NinjaKun_MiST/mister/Arcade-NinjaKun.sv create mode 100644 Arcade_MiST/NinjaKun_MiST/mister/LICENSE create mode 100644 Arcade_MiST/NinjaKun_MiST/mister/README.txt create mode 100644 Arcade_MiST/NinjaKun_MiST/mister/build_rom.bat create mode 100644 Arcade_MiST/NinjaKun_MiST/mister/build_rom.ini create mode 100644 Arcade_MiST/NinjaKun_MiST/mister/build_rom.sh create mode 100644 Arcade_MiST/NinjaKun_MiST/mister/ninjakun_romarb.v create mode 100644 Arcade_MiST/NinjaKun_MiST/mister/rommap.txt create mode 100644 Arcade_MiST/NinjaKun_MiST/mister/roms.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/DPRAM1024.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/NinjaKun_MiST.sv create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/YM2149_linmix_sep.vhd create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80.vhd create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_ALU.vhd create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_MCode.vhd create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_Pack.vhd create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_Reg.vhd create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80s.vhd create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/dataselector_3D_8B.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/dataselector_4D_9B.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/dataselector_5D_8B.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/dpram.vhd create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/dpram_1r1w.vhd create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/hvgen.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/mems.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_adec.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_bg.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_clkgen.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_cpumux.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_fg.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_input.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_io_video.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_irqgen.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_main.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_psg.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_sadec.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_sp.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_top.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_video.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/pll.v create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/rom/make_rom.bat create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/rom/make_vhdl_prom.exe create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/rom/ninjakun.zip create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/sdram.sv create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/NinjaKun_MiST/rtl/z80ip.v diff --git a/Arcade_MiST/NinjaKun_MiST/NinjaKun_MiST.qpf b/Arcade_MiST/NinjaKun_MiST/NinjaKun_MiST.qpf new file mode 100644 index 00000000..2c69d2f2 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/NinjaKun_MiST.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2013 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.0 Build 162 10/23/2013 SJ Web Edition +# Date created = 20:17:38 December 19, 2019 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "20:17:38 December 19, 2019" + +# Revisions + +PROJECT_REVISION = "NinjaKun_MiST" \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/NinjaKun_MiST.qsf b/Arcade_MiST/NinjaKun_MiST/NinjaKun_MiST.qsf new file mode 100644 index 00000000..e83daba9 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/NinjaKun_MiST.qsf @@ -0,0 +1,265 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 19:13:36 October 04, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# NinjaKun_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.0.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "19:48:06 MAY 24,2017" +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files + +# 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_90 -to SPI_SS4 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PIN_49 -to SDRAM_A[0] +set_location_assignment PIN_44 -to SDRAM_A[1] +set_location_assignment PIN_42 -to SDRAM_A[2] +set_location_assignment PIN_39 -to SDRAM_A[3] +set_location_assignment PIN_4 -to SDRAM_A[4] +set_location_assignment PIN_6 -to SDRAM_A[5] +set_location_assignment PIN_8 -to SDRAM_A[6] +set_location_assignment PIN_10 -to SDRAM_A[7] +set_location_assignment PIN_11 -to SDRAM_A[8] +set_location_assignment PIN_28 -to SDRAM_A[9] +set_location_assignment PIN_50 -to SDRAM_A[10] +set_location_assignment PIN_30 -to SDRAM_A[11] +set_location_assignment PIN_32 -to SDRAM_A[12] +set_location_assignment PIN_83 -to SDRAM_DQ[0] +set_location_assignment PIN_79 -to SDRAM_DQ[1] +set_location_assignment PIN_77 -to SDRAM_DQ[2] +set_location_assignment PIN_76 -to SDRAM_DQ[3] +set_location_assignment PIN_72 -to SDRAM_DQ[4] +set_location_assignment PIN_71 -to SDRAM_DQ[5] +set_location_assignment PIN_69 -to SDRAM_DQ[6] +set_location_assignment PIN_68 -to SDRAM_DQ[7] +set_location_assignment PIN_86 -to SDRAM_DQ[8] +set_location_assignment PIN_87 -to SDRAM_DQ[9] +set_location_assignment PIN_98 -to SDRAM_DQ[10] +set_location_assignment PIN_99 -to SDRAM_DQ[11] +set_location_assignment PIN_100 -to SDRAM_DQ[12] +set_location_assignment PIN_101 -to SDRAM_DQ[13] +set_location_assignment PIN_103 -to SDRAM_DQ[14] +set_location_assignment PIN_104 -to SDRAM_DQ[15] +set_location_assignment PIN_58 -to SDRAM_BA[0] +set_location_assignment PIN_51 -to SDRAM_BA[1] +set_location_assignment PIN_85 -to SDRAM_DQMH +set_location_assignment PIN_67 -to SDRAM_DQML +set_location_assignment PIN_60 -to SDRAM_nRAS +set_location_assignment PIN_64 -to SDRAM_nCAS +set_location_assignment PIN_66 -to SDRAM_nWE +set_location_assignment PIN_59 -to SDRAM_nCS +set_location_assignment PIN_33 -to SDRAM_CKE +set_location_assignment PIN_43 -to SDRAM_CLK +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + + + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name TIMEQUEST_DO_CCPP_REMOVAL ON +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS ON + +# 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 NinjaKun_MiST +set_global_assignment -name VERILOG_INPUT_VERSION SYSTEMVERILOG_2005 +set_global_assignment -name VERILOG_SHOW_LMF_MAPPING_MESSAGES OFF + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# SignalTap II Assignments +# ======================== +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE output_files/druaga.stp + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# ----------------------------------- +# start ENTITY(TheTowerofDruaga_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(TheTowerofDruaga_mist) +# --------------------------------- +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[*] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[*] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_BA[0] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_BA[1] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQMH +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQML +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nRAS +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nCAS +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nWE +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nCS +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[*] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[*] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[*] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[*] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_BA[*] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQML +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQMH +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nRAS +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nCAS +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nWE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nCS +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_CKE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_CLK +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_R[*] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_G[*] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_B[*] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_HS +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_VS +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to AUDIO_L +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to AUDIO_R +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SPI_DO +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top +set_global_assignment -name SYSTEMVERILOG_FILE rtl/NinjaKun_MiST.sv +set_global_assignment -name VERILOG_FILE rtl/ninjakun_top.v +set_global_assignment -name VERILOG_FILE rtl/ninjakun_main.v +set_global_assignment -name VERILOG_FILE rtl/ninjakun_io_video.v +set_global_assignment -name VERILOG_FILE rtl/ninjakun_video.v +set_global_assignment -name VERILOG_FILE rtl/hvgen.v +set_global_assignment -name VERILOG_FILE rtl/ninjakun_bg.v +set_global_assignment -name VERILOG_FILE rtl/ninjakun_fg.v +set_global_assignment -name VERILOG_FILE rtl/ninjakun_sp.v +set_global_assignment -name VERILOG_FILE rtl/ninjakun_psg.v +set_global_assignment -name VHDL_FILE rtl/YM2149_linmix_sep.vhd +set_global_assignment -name VERILOG_FILE rtl/ninjakun_cpumux.v +set_global_assignment -name VERILOG_FILE rtl/ninjakun_irqgen.v +set_global_assignment -name VERILOG_FILE rtl/ninjakun_clkgen.v +set_global_assignment -name VERILOG_FILE rtl/ninjakun_input.v +set_global_assignment -name VERILOG_FILE rtl/ninjakun_sadec.v +set_global_assignment -name VERILOG_FILE rtl/ninjakun_adec.v +set_global_assignment -name VERILOG_FILE rtl/dataselector_3D_8B.v +set_global_assignment -name VERILOG_FILE rtl/dataselector_4D_9B.v +set_global_assignment -name VERILOG_FILE rtl/dataselector_5D_8B.v +set_global_assignment -name VHDL_FILE rtl/rom/bg4_rom.vhd +set_global_assignment -name VHDL_FILE rtl/rom/bg3_rom.vhd +set_global_assignment -name VHDL_FILE rtl/rom/bg2_rom.vhd +set_global_assignment -name VHDL_FILE rtl/rom/bg1_rom.vhd +set_global_assignment -name VHDL_FILE rtl/rom/fg4_rom.vhd +set_global_assignment -name VHDL_FILE rtl/rom/fg3_rom.vhd +set_global_assignment -name VHDL_FILE rtl/rom/fg2_rom.vhd +set_global_assignment -name VHDL_FILE rtl/rom/fg1_rom.vhd +set_global_assignment -name VERILOG_FILE rtl/z80ip.v +set_global_assignment -name VHDL_FILE rtl/cpu/T80s.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VERILOG_FILE rtl/pll.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv +set_global_assignment -name QIP_FILE ../../common/mist/mist.qip +set_global_assignment -name VERILOG_FILE rtl/mems.v +set_global_assignment -name VHDL_FILE rtl/dpram_1r1w.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name VERILOG_FILE rtl/DPRAM1024.v +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/Snapshot/NINJAKUN.ROM b/Arcade_MiST/NinjaKun_MiST/Snapshot/NINJAKUN.ROM new file mode 100644 index 0000000000000000000000000000000000000000..44fbd53ce6e57d704f621515c67dc2626b331404 GIT binary patch literal 73728 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 G|Nr0Q5ViFH literal 0 HcmV?d00001 diff --git a/Arcade_MiST/NinjaKun_MiST/Snapshot/NinjaKun_MiST.rbf b/Arcade_MiST/NinjaKun_MiST/Snapshot/NinjaKun_MiST.rbf new file mode 100644 index 0000000000000000000000000000000000000000..56878c7006d892d4cc81cc020ab630183e2e192d GIT binary patch literal 316580 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

xf}hdAMobKAwk8qPZN>jEJrQjh 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 hps_io +( + .clk_sys(clk_sys), + .HPS_BUS(HPS_BUS), + + .conf_str(CONF_STR), + + .buttons(buttons), + .status(status), + .forced_scandoubler(forced_scandoubler), + + .ioctl_download(ioctl_download), + .ioctl_wr(ioctl_wr), + .ioctl_addr(ioctl_addr), + .ioctl_dout(ioctl_dout), + + .joystick_0(joystk1), + .joystick_1(joystk2), + .ps2_key(ps2_key) +); + +wire pressed = ps2_key[9]; +wire [8:0] code = ps2_key[8:0]; +always @(posedge clk_sys) begin + reg old_state; + old_state <= ps2_key[10]; + + if(old_state != ps2_key[10]) begin + casex(code) + 'hX75: btn_up <= pressed; // up + 'hX72: btn_down <= pressed; // down + 'hX6B: btn_left <= pressed; // left + 'hX74: btn_right <= pressed; // right + 'h029: btn_trig1 <= pressed; // space + 'h014: btn_trig2 <= pressed; // ctrl + 'h005: btn_one_player <= pressed; // F1 + 'h006: btn_two_players <= pressed; // F2 + + // JPAC/IPAC/MAME Style Codes + 'h016: btn_start_1 <= pressed; // 1 + 'h01E: btn_start_2 <= pressed; // 2 + 'h02E: btn_coin_1 <= pressed; // 5 + 'h036: btn_coin_2 <= pressed; // 6 + 'h02D: btn_up_2 <= pressed; // R + 'h02B: btn_down_2 <= pressed; // F + 'h023: btn_left_2 <= pressed; // D + 'h034: btn_right_2 <= pressed; // G + 'h01C: btn_trig1_2 <= pressed; // A + 'h01B: btn_trig2_2 <= pressed; // S + endcase + end +end + +reg btn_up = 0; +reg btn_down = 0; +reg btn_right = 0; +reg btn_left = 0; +reg btn_trig1 = 0; +reg btn_trig2 = 0; +reg btn_one_player = 0; +reg btn_two_players = 0; + +reg btn_start_1 = 0; +reg btn_start_2 = 0; +reg btn_coin_1 = 0; +reg btn_coin_2 = 0; +reg btn_up_2 = 0; +reg btn_down_2 = 0; +reg btn_left_2 = 0; +reg btn_right_2 = 0; +reg btn_trig1_2 = 0; +reg btn_trig2_2 = 0; + + +wire m_up2 = btn_up_2 | joystk2[3]; +wire m_down2 = btn_down_2 | joystk2[2]; +wire m_left2 = btn_left_2 | joystk2[1]; +wire m_right2 = btn_right_2 | joystk2[0]; +wire m_trig21 = btn_trig1_2 | joystk2[4]; +wire m_trig22 = btn_trig2_2 | joystk2[5]; + +wire m_start1 = btn_one_player | joystk1[6] | joystk2[6] | btn_start_1; +wire m_start2 = btn_two_players | joystk1[7] | joystk2[7] | btn_start_2; + +wire m_up1 = btn_up | joystk1[3] | (bCabinet ? 1'b0 : m_up2); +wire m_down1 = btn_down | joystk1[2] | (bCabinet ? 1'b0 : m_down2); +wire m_left1 = btn_left | joystk1[1] | (bCabinet ? 1'b0 : m_left2); +wire m_right1 = btn_right | joystk1[0] | (bCabinet ? 1'b0 : m_right2); +wire m_trig11 = btn_trig1 | joystk1[4] | (bCabinet ? 1'b0 : m_trig21); +wire m_trig12 = btn_trig2 | joystk1[5] | (bCabinet ? 1'b0 : m_trig22); + +wire m_coin1 = btn_one_player | btn_coin_1 | joystk1[8]; +wire m_coin2 = btn_two_players| btn_coin_2 | joystk2[8]; +wire m_coin = m_coin1|m_coin2; + + +/////////////////////////////////////////////////// + +wire hblank, vblank; +wire ce_vid; +wire hs, vs; +wire [3:0] r,g,b; + +reg ce_pix; +always @(posedge clk_hdmi) begin + reg old_clk; + old_clk <= ce_vid; + ce_pix <= old_clk & ~ce_vid; +end + +arcade_rotate_fx #(256,192,12) arcade_video +( + .*, + + .clk_video(clk_hdmi), + + .RGB_in({r,g,b}), + .HBlank(hblank), + .VBlank(vblank), + .HSync(~hs), + .VSync(~vs), + + .fx(0), + .no_rotate(1'b1) +); + +wire PCLK; +wire [8:0] HPOS,VPOS; +wire [11:0] POUT; +HVGEN hvgen +( + .HPOS(HPOS),.VPOS(VPOS),.PCLK(PCLK),.iRGB(POUT), + .oRGB({b,g,r}),.HBLK(hblank),.VBLK(vblank),.HSYN(hs),.VSYN(vs) +); +assign ce_vid = PCLK; + + +wire [15:0] AOUT; +assign AUDIO_L = AOUT; +assign AUDIO_R = AOUT; +assign AUDIO_S = 1'b0; // unsigned + + +/////////////////////////////////////////////////// + +wire [7:0] iDSW1 = {`DIFFICULTY,`DEMOSOUND,`EXTEND2ND,`EXTEND1ST,`LIVES, `CABINET}; // 8'b1_0_01_1_10_0; +wire [7:0] iDSW2 = {`ENDLESS,`FREEPLAY,1'b0,`ALLOW_CONTINUE,`NAMELETTERS,`COINAGE}; // 8'b1_1_0_0_1_111; + +wire [7:0] iCTR1 = ~{ 2'b11, m_start1, 1'b0, m_trig11, m_trig12, m_right1, m_left1 }; +wire [7:0] iCTR2 = ~{ ~m_coin,1'b1, m_start2, 1'b0, m_trig21, m_trig22, m_right2, m_left2 }; + +wire iRST = RESET | status[0] | buttons[1] | ioctl_download; + +wire [7:0] oPIX; +assign POUT = {{oPIX[7:6],oPIX[1:0]},{oPIX[5:4],oPIX[1:0]},{oPIX[3:2],oPIX[1:0]}}; + + +FPGA_NINJAKUN GameCore +( + .RESET(iRST),.MCLK(clk_49M), + + .CTR1(iCTR1),.CTR2(iCTR2), + .DSW1(iDSW1),.DSW2(iDSW2), + + .PH(HPOS),.PV(VPOS), + .PCLK(PCLK),.POUT(oPIX), + .SNDOUT(AOUT), + + .ROMCL(clk_sys),.ROMAD(ioctl_addr),.ROMDT(ioctl_dout),.ROMEN(ioctl_wr) +); + +endmodule + + +module HVGEN +( + output [8:0] HPOS, + output [8:0] VPOS, + input PCLK, + input [11:0] iRGB, + + output reg [11:0] oRGB, + output reg HBLK = 1, + output reg VBLK = 1, + output reg HSYN = 1, + output reg VSYN = 1 +); + +reg [8:0] hcnt = 0; +reg [8:0] vcnt = 0; + +assign HPOS = hcnt-16; +assign VPOS = vcnt-16; + +always @(posedge PCLK) begin + case (hcnt) + 15: begin HBLK <= 0; hcnt <= hcnt+1; end + 272: begin HBLK <= 1; hcnt <= hcnt+1; end + 311: begin HSYN <= 0; hcnt <= hcnt+1; end + 342: begin HSYN <= 1; hcnt <= 471; end + 511: begin hcnt <= 0; + case (vcnt) + 15: begin VBLK <= 0; vcnt <= vcnt+1; end + 207: begin VBLK <= 1; vcnt <= vcnt+1; end + 226: begin VSYN <= 0; vcnt <= vcnt+1; end + 233: begin VSYN <= 1; vcnt <= 483; end + 511: begin vcnt <= 0; end + default: vcnt <= vcnt+1; + endcase + end + default: hcnt <= hcnt+1; + endcase + oRGB <= (HBLK|VBLK) ? 12'h0 : iRGB; +end + +endmodule + + diff --git a/Arcade_MiST/NinjaKun_MiST/mister/LICENSE b/Arcade_MiST/NinjaKun_MiST/mister/LICENSE new file mode 100644 index 00000000..94a9ed02 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/mister/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Arcade_MiST/NinjaKun_MiST/mister/README.txt b/Arcade_MiST/NinjaKun_MiST/mister/README.txt new file mode 100644 index 00000000..1dca0244 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/mister/README.txt @@ -0,0 +1,74 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Ninja-Kun port to MiSTer by MiSTer-X +-- 20 October 2019 +-- +--------------------------------------------------------------------------------- +-- FPGA Ninja-Kun for Spartan-6 +------------------------------------------------ +-- Copyright (c) 2011 MiSTer-X +--------------------------------------------------------------------------------- +-- T80/T80s - Version : 0242 +----------------------------- +-- Z80 compatible microprocessor core +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +--------------------------------------------------------------------------------- +-- YM2149 (AY-3-8910) +-- Copyright (c) MikeJ - Jan 2005 +--------------------------------------------------------------------------------- +-- +-- +-- Keyboard inputs : +-- +-- F2 : Coin + Start 2 players +-- F1 : Coin + Start 1 player +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- SPACE : Shot +-- CTRL : Jump +-- +-- MAME/IPAC/JPAC Style Keyboard inputs: +-- 5 : Coin 1 +-- 6 : Coin 2 +-- 1 : Start 1 Player +-- 2 : Start 2 Players +-- R,F,D,G : Player 2 Movements +-- A : Player 2 Shot +-- S : Player 2 Jump +-- +-- Joystick support. +-- +-- +-- known bug: Sometimes BG screen glitches. +-- +--------------------------------------------------------------------------------- +-- 23 October 2019 +--------------------------------------------------------------------------------- +-- FIXED: Analog video is shifted to right. +--------------------------------------------------------------------------------- + + *** Attention *** + +ROM is not included. In order to use this arcade, you need to provide a correct ROM file. + +Find this zip file somewhere. You need to find the file exactly as required. +Do not rename other zip files even if they also represent the same game - they are not compatible! +The name of zip is taken from M.A.M.E. project, so you can get more info about +hashes and contained files there. + +To generate the ROM using Windows: +1) Copy the zip into "releases" directory +2) Execute bat file - it will show the name of zip file containing required files. +3) Put required zip into the same directory and execute the bat again. +4) If everything will go without errors or warnings, then you will get the a.*.rom file. +5) Copy generated a.*.rom into root of SD card along with the Arcade-*.rbf file + +To generate the ROM using Linux/MacOS: +1) Copy the zip into "releases" directory +2) Execute build_rom.sh +3) Copy generated a.*.rom into root of SD card along with the Arcade-*.rbf file + +To generate the ROM using MiSTer: +1) scp "releases" directory along with the zip file onto MiSTer:/media/fat/ +2) Using OSD execute build_rom.sh +3) Copy generated a.*.rom into root of SD card along with the Arcade-*.rbf file + diff --git a/Arcade_MiST/NinjaKun_MiST/mister/build_rom.bat b/Arcade_MiST/NinjaKun_MiST/mister/build_rom.bat new file mode 100644 index 00000000..4237b880 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/mister/build_rom.bat @@ -0,0 +1,45 @@ +@powershell -NoProfile -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((gc \"%~f0\"|?{$_.readcount -gt 1})-join\"`n\");&$s" %*&goto:eof +#============================================================== +$zip="ninjakun.zip" + +$ifiles=` + "ninja-6.7n","ninja-7.7p","ninja-8.7s","ninja-9.7t",` + "ninja-10.2c","ninja-11.2d","ninja-12.4c","ninja-13.4d",` + "ninja-1.7a","ninja-2.7b","ninja-3.7d","ninja-4.7e",` + "ninja-5.7h","ninja-2.7b","ninja-3.7d","ninja-4.7e" + +$ofile="a.ninjakun.rom" +$ofileMd5sumValid="99e80f22f7a77cf1d574ce89486b385f" + +if (!(Test-Path "./$zip")) { + echo "Error: Cannot find $zip file." + echo "" + echo "Put $zip into the same directory." +} +else { + Expand-Archive -Path "./$zip" -Destination ./tmp/ -Force + + cd tmp + Get-Content $ifiles -Enc Byte -Read 512 | Set-Content "../$ofile" -Enc Byte + cd .. + Remove-Item ./tmp -Recurse -Force + + $ofileMD5sumCurrent=(Get-FileHash -Algorithm md5 "./$ofile").Hash.toLower() + if ($ofileMD5sumCurrent -ne $ofileMd5sumValid) { + echo "Expected checksum: $ofileMd5sumValid" + echo " Actual checksum: $ofileMd5sumCurrent" + echo "" + echo "Error: Generated $ofile is invalid." + echo "" + echo "This is more likely due to incorrect $zip content." + } + else { + echo "Checksum verification passed." + echo "" + echo "Copy $ofile into root of SD card along with the rbf file." + } +} +echo "" +echo "" +pause + diff --git a/Arcade_MiST/NinjaKun_MiST/mister/build_rom.ini b/Arcade_MiST/NinjaKun_MiST/mister/build_rom.ini new file mode 100644 index 00000000..b6428ae3 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/mister/build_rom.ini @@ -0,0 +1,4 @@ +zip=ninjakun.zip +ifiles=(ninja-6.7n ninja-7.7p ninja-8.7s ninja-9.7t ninja-10.2c ninja-11.2d ninja-12.4c ninja-13.4d ninja-1.7a ninja-2.7b ninja-3.7d ninja-4.7e ninja-5.7h ninja-2.7b ninja-3.7d ninja-4.7e) +ofile=a.ninjakun.rom +ofileMd5sumValid=99e80f22f7a77cf1d574ce89486b385f diff --git a/Arcade_MiST/NinjaKun_MiST/mister/build_rom.sh b/Arcade_MiST/NinjaKun_MiST/mister/build_rom.sh new file mode 100644 index 00000000..2b1f85f7 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/mister/build_rom.sh @@ -0,0 +1,100 @@ +#!/bin/bash + +exit_with_error() { + echo -e "\nERROR:\n${1}\n" + exit 1 +} + +check_dependencies() { + if [[ $OSTYPE == darwin* ]]; then + for j in unzip md5 cat cut; do + command -v ${j} > /dev/null 2>&1 || exit_with_error "This script requires\n${j}" + done + else + for j in unzip md5sum cat cut; do + command -v ${j} > /dev/null 2>&1 || exit_with_error "This script requires\n${j}" + done + fi +} + +check_permissions () { + if [ ! -w ${BASEDIR} ]; then + exit_with_error "Cannot write to\n${BASEDIR}" + fi +} + +read_ini () { + if [ ! -f ${BASEDIR}/build_rom.ini ]; then + exit_with_error "Missing build_rom.ini" + else + source ${BASEDIR}/build_rom.ini + fi +} + +uncompress_zip() { + if [ -f ${BASEDIR}/${zip} ]; then + tmpdir=tmp.`date +%Y%m%d%H%M%S%s` + unzip -qq -d ${BASEDIR}/${tmpdir}/ ${BASEDIR}/${zip} + if [ $? != 0 ] ; then + rm -rf ${BASEDIR}/$tmpdir + exit_with_error "Something went wrong\nwhen extracting\n${zip}" + fi + else + exit_with_error "Cannot find ${zip}" + fi +} + +generate_rom() { + for i in "${ifiles[@]}"; do + # ensure provided zip contains required files + if [ ! -f "${BASEDIR}/${tmpdir}/${i}" ]; then + rm -rf ${BASEDIR}/$tmpdir + exit_with_error "Provided ${zip}\nis missing required file:\n\n${i}" + else + cat ${BASEDIR}/${tmpdir}/${i} >> ${BASEDIR}/${tmpdir}/${ofile} + fi + done +} + +validate_rom() { + + if [[ $OSTYPE == darwin* ]]; then + ofileMd5sumCurrent=$(md5 -r ${BASEDIR}/${tmpdir}/${ofile}|cut -f 1 -d " ") + else + ofileMd5sumCurrent=$(md5sum ${BASEDIR}/${tmpdir}/${ofile}|cut -f 1 -d " ") + fi + + if [[ "${ofileMd5sumValid}" != "${ofileMd5sumCurrent}" ]]; then + echo -e "\nExpected checksum:\n${ofileMd5sumValid}" + echo -e "Actual checksum:\n${ofileMd5sumCurrent}" + mv ${BASEDIR}/${tmpdir}/${ofile} . + rm -rf ${BASEDIR}/$tmpdir + exit_with_error "Generated ${ofile}\nis invalid.\nThis is more likely\ndue to incorrect\n${zip} content." + else + mv ${BASEDIR}/${tmpdir}/${ofile} ${BASEDIR}/. + rm -rf ${BASEDIR}/$tmpdir + echo -e "\nChecksum verification passed\n\nCopy the ${ofile}\ninto root of SD card\nalong with the rbf file.\n" + fi +} + +BASEDIR=$(dirname "$0") + +echo "Generating ROM ..." + +## verify dependencies +check_dependencies + +## verify write permissions +check_permissions + +## load ini +read_ini + +## extract package +uncompress_zip + +## build rom +generate_rom + +## verify rom +validate_rom diff --git a/Arcade_MiST/NinjaKun_MiST/mister/ninjakun_romarb.v b/Arcade_MiST/NinjaKun_MiST/mister/ninjakun_romarb.v new file mode 100644 index 00000000..d6e4cd78 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/mister/ninjakun_romarb.v @@ -0,0 +1,80 @@ +// Copyright (c) 2011 MiSTer-X + +module NINJAKUN_ROMARB +( + input CLK, + + input [12:0] FGCAD, + output [31:0] FGCDT, + + input [12:0] BGCAD, + output [31:0] BGCDT, + + input [12:0] SPCAD, + output [31:0] SPCDT, + + output reg [2:0] PHASE, + + input [14:0] CP0AD, + output [7:0] CP0DT, + + input [14:0] CP1AD, + output [7:0] CP1DT +); + +wire CL = ~CLK; + +always @( posedge CL ) PHASE <= PHASE+1; + +NJFGROM sprom( CL, SPCAD, SPCDT ); +NJFGROM fgrom( CL, FGCAD, FGCDT ); +NJBGROM bgrom( CL, BGCAD, BGCDT ); + +NJCPU0I cpu0i( CL, CP0AD, CP0DT ); +NJCPU1I cpu1i( CL, {(CP1AD[14]|CP1AD[13]),CP1AD[12:0]}, CP1DT ); + +endmodule + +module NINJAKUN_CPUMUX +( + input CLK24M, + input [2:0] PHASE, + + input [15:0] CP0AD, + input [7:0] CP0OD, + output [7:0] CP0ID, + input CP0RD, + input CP0WR, + + input [15:0] CP1AD, + input [7:0] CP1OD, + output [7:0] CP1ID, + input CP1RD, + input CP1WR, + + output [15:0] CPADR, + output [7:0] CPODT, + input [7:0] CPIDT, + output CPRED, + output CPWRT +); + +reg CSIDE; +reg [7:0] CP0D, CP1D; +always @( posedge CLK24M ) begin + case (PHASE) + 4: begin CP1D <= CPIDT; CSIDE <= 0; end + 0: begin CP0D <= CPIDT; CSIDE <= 1; end + default:; + endcase +end + +assign CPADR = CSIDE ? CP1AD : CP0AD; +assign CPODT = CSIDE ? CP1OD : CP0OD; +assign CPRED = CSIDE ? CP1RD : CP0RD; +assign CPWRT = CSIDE ? CP1WR : CP0WR; + +assign CP0ID = CSIDE ? CP0D : CPIDT; +assign CP1ID = CSIDE ? CPIDT : CP1D; + +endmodule diff --git a/Arcade_MiST/NinjaKun_MiST/mister/rommap.txt b/Arcade_MiST/NinjaKun_MiST/mister/rommap.txt new file mode 100644 index 00000000..ea7c701c --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/mister/rommap.txt @@ -0,0 +1,7 @@ + +00000-07FFF GFX1-0,1,2,3 +08000-0FFFF GFX2-0,1,2,3 +10000-17FFF CPU0-0,1,2,3 +18000-1FFFF CPU1-0,CPU0-1,2,3 + +[EOF] diff --git a/Arcade_MiST/NinjaKun_MiST/mister/roms.v b/Arcade_MiST/NinjaKun_MiST/mister/roms.v new file mode 100644 index 00000000..dcda9151 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/mister/roms.v @@ -0,0 +1,103 @@ +// Copyright (c) 2019 MiSTer-X + +module DLROM #(parameter AW,parameter DW) +( + input CL0, + input [(AW-1):0] AD0, + output reg [(DW-1):0] DO0, + + input CL1, + input [(AW-1):0] AD1, + input [(DW-1):0] DI1, + input WE1 +); + +reg [(DW-1):0] core[0:((2**AW)-1)]; + +always @(posedge CL0) DO0 <= core[AD0]; +always @(posedge CL1) if (WE1) core[AD1] <= DI1; + +endmodule + + +module NJFGROM +( + input CL, + input [12:0] AD, + output [31:0] DT, + + input ROMCL, + input [16:0] ROMAD, + input [7:0] ROMDT, + input ROMEN +); + +wire ROME = ROMEN & (ROMAD[16:15]==2'b00); +wire ROME0 = ROME & ~ROMAD[13]; +wire ROME1 = ROME & ROMAD[13]; + +DLROM #(13,8) R0(CL,AD,DT[ 7: 0], ROMCL,{ROMAD[14],ROMAD[12:1]},ROMDT,ROME0 & ~ROMAD[0]); +DLROM #(13,8) R1(CL,AD,DT[15: 8], ROMCL,{ROMAD[14],ROMAD[12:1]},ROMDT,ROME1 & ~ROMAD[0]); +DLROM #(13,8) R2(CL,AD,DT[23:16], ROMCL,{ROMAD[14],ROMAD[12:1]},ROMDT,ROME0 & ROMAD[0]); +DLROM #(13,8) R3(CL,AD,DT[31:24], ROMCL,{ROMAD[14],ROMAD[12:1]},ROMDT,ROME1 & ROMAD[0]); + +endmodule + + +module NJBGROM +( + input CL, + input [12:0] AD, + output [31:0] DT, + + input ROMCL, + input [16:0] ROMAD, + input [7:0] ROMDT, + input ROMEN +); + +wire ROME = ROMEN & (ROMAD[16:15]==2'b01); +wire ROME0 = ROME & ~ROMAD[13]; +wire ROME1 = ROME & ROMAD[13]; + +DLROM #(13,8) R0(CL,AD,DT[ 7: 0], ROMCL,{ROMAD[14],ROMAD[12:1]},ROMDT,ROME0 & ~ROMAD[0]); +DLROM #(13,8) R1(CL,AD,DT[15: 8], ROMCL,{ROMAD[14],ROMAD[12:1]},ROMDT,ROME1 & ~ROMAD[0]); +DLROM #(13,8) R2(CL,AD,DT[23:16], ROMCL,{ROMAD[14],ROMAD[12:1]},ROMDT,ROME0 & ROMAD[0]); +DLROM #(13,8) R3(CL,AD,DT[31:24], ROMCL,{ROMAD[14],ROMAD[12:1]},ROMDT,ROME1 & ROMAD[0]); + +endmodule + + +module NJC0ROM +( + input CL, + input [14:0] AD, + output [7:0] DT, + + input ROMCL, + input [16:0] ROMAD, + input [7:0] ROMDT, + input ROMEN +); + +DLROM #(15,8) r(CL,AD,DT,ROMCL,ROMAD,ROMDT,ROMEN & (ROMAD[16:15]==2'b10)); + +endmodule + + +module NJC1ROM +( + input CL, + input [14:0] AD, + output [7:0] DT, + + input ROMCL, + input [16:0] ROMAD, + input [7:0] ROMDT, + input ROMEN +); + +DLROM #(15,8) r(CL,AD,DT,ROMCL,ROMAD,ROMDT,ROMEN & (ROMAD[16:15]==2'b11)); + +endmodule + diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/DPRAM1024.v b/Arcade_MiST/NinjaKun_MiST/rtl/DPRAM1024.v new file mode 100644 index 00000000..e5a0fec0 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/DPRAM1024.v @@ -0,0 +1,246 @@ +// megafunction wizard: %RAM: 2-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: DPRAM1024.v +// Megafunction Name(s): +// altsyncram +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 17.1.0 Build 590 10/25/2017 SJ Lite Edition +// ************************************************************ + + +//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 FPGA IP 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. + + +// synopsys translate_off +`timescale 1 ps / 1 ps +// synopsys translate_on +module DPRAM1024 ( + address_a, + address_b, + clock_a, + clock_b, + data_a, + data_b, + wren_a, + wren_b, + q_a, + q_b); + + input [9:0] address_a; + input [9:0] address_b; + input clock_a; + input clock_b; + input [7:0] data_a; + input [7:0] data_b; + input wren_a; + input wren_b; + output [7:0] q_a; + output [7:0] q_b; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock_a; + tri0 wren_a; + tri0 wren_b; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [7:0] sub_wire0; + wire [7:0] sub_wire1; + wire [7:0] q_a = sub_wire0[7:0]; + wire [7:0] q_b = sub_wire1[7:0]; + + altsyncram altsyncram_component ( + .address_a (address_a), + .address_b (address_b), + .clock0 (clock_a), + .clock1 (clock_b), + .data_a (data_a), + .data_b (data_b), + .wren_a (wren_a), + .wren_b (wren_b), + .q_a (sub_wire0), + .q_b (sub_wire1), + .aclr0 (1'b0), + .aclr1 (1'b0), + .addressstall_a (1'b0), + .addressstall_b (1'b0), + .byteena_a (1'b1), + .byteena_b (1'b1), + .clocken0 (1'b1), + .clocken1 (1'b1), + .clocken2 (1'b1), + .clocken3 (1'b1), + .eccstatus (), + .rden_a (1'b1), + .rden_b (1'b1)); + defparam + altsyncram_component.address_reg_b = "CLOCK1", + altsyncram_component.clock_enable_input_a = "BYPASS", + altsyncram_component.clock_enable_input_b = "BYPASS", + altsyncram_component.clock_enable_output_a = "BYPASS", + altsyncram_component.clock_enable_output_b = "BYPASS", + altsyncram_component.indata_reg_b = "CLOCK1", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 1024, + altsyncram_component.numwords_b = 1024, + altsyncram_component.operation_mode = "BIDIR_DUAL_PORT", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_aclr_b = "NONE", + altsyncram_component.outdata_reg_a = "CLOCK0", + altsyncram_component.outdata_reg_b = "CLOCK1", + altsyncram_component.power_up_uninitialized = "FALSE", + altsyncram_component.ram_block_type = "M9K", + altsyncram_component.read_during_write_mode_port_a = "NEW_DATA_NO_NBE_READ", + altsyncram_component.read_during_write_mode_port_b = "NEW_DATA_NO_NBE_READ", + altsyncram_component.widthad_a = 10, + altsyncram_component.widthad_b = 10, + altsyncram_component.width_a = 8, + altsyncram_component.width_b = 8, + altsyncram_component.width_byteena_a = 1, + altsyncram_component.width_byteena_b = 1, + altsyncram_component.wrcontrol_wraddress_reg_b = "CLOCK1"; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: ADDRESSSTALL_B NUMERIC "0" +// Retrieval info: PRIVATE: BYTEENA_ACLR_A NUMERIC "0" +// Retrieval info: PRIVATE: BYTEENA_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE_A NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE_B NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "1" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_B NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_B NUMERIC "0" +// Retrieval info: PRIVATE: CLRdata NUMERIC "0" +// Retrieval info: PRIVATE: CLRq NUMERIC "0" +// Retrieval info: PRIVATE: CLRrdaddress NUMERIC "0" +// Retrieval info: PRIVATE: CLRrren NUMERIC "0" +// Retrieval info: PRIVATE: CLRwraddress NUMERIC "0" +// Retrieval info: PRIVATE: CLRwren NUMERIC "0" +// Retrieval info: PRIVATE: Clock NUMERIC "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 "2" +// 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: RAM_BLOCK_TYPE STRING "M9K" +// 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 DPRAM1024.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL DPRAM1024.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL DPRAM1024.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL DPRAM1024.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL DPRAM1024_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL DPRAM1024_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/NinjaKun_MiST.sv b/Arcade_MiST/NinjaKun_MiST/rtl/NinjaKun_MiST.sv new file mode 100644 index 00000000..7ab26955 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/NinjaKun_MiST.sv @@ -0,0 +1,289 @@ +module NinjaKun_MiST ( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27, + output [12:0] SDRAM_A, + inout [15:0] SDRAM_DQ, + output SDRAM_DQML, + output SDRAM_DQMH, + output SDRAM_nWE, + output SDRAM_nCAS, + output SDRAM_nRAS, + output SDRAM_nCS, + output [1:0] SDRAM_BA, + output SDRAM_CLK, + output SDRAM_CKE + +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "NINJAKUN;ROM;", + "O2,Rotate Controls,Off,On;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "O8,Difficulty,Normal,Hard;", + "O9A,Lives,4,3,2,5;", + "OB,1st Extra,30000,40000;", + "OCD,2nd Extra (Every),50000,70000,90000,None;", + "OF,Allow Continue,No,Yes;", + "OG,Free Play,No,Yes;", + "OH,Endless(If Free Play),No,Yes;", + "OE,Demo Sound,Off,On;", + "OI,Name Letters,8,3;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +assign LED = ~ioctl_downl; +assign AUDIO_R = AUDIO_L; +assign SDRAM_CLK = ~CLOCK_48; +assign SDRAM_CKE = 1; + +wire CLOCK_48, pll_locked; +pll pll( + .inclk0(CLOCK_27), + .c0(CLOCK_48), + .locked(pll_locked) + ); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [11:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoublerD; +wire ypbpr; +wire [15:0] audio; +wire hs, vs; +wire hb, vb; +wire blankn = ~(hb | vb); +wire [3:0] r, g, b; +wire [14:0] cpu1_rom_addr; +wire [12:0] cpu2_rom_addr; +wire [15:0] cpu1_rom_do, cpu2_rom_do; +//wire [12:0] sp_rom_addr; +//wire [31:0] sp_rom_do; +//wire [12:0] fg_rom_addr; +//wire [31:0] fg_rom_do; +wire [12:0] bg_rom_addr; +wire [31:0] bg_rom_do; +wire ioctl_downl; +wire [7:0] ioctl_index; +wire ioctl_wr; +wire [24:0] ioctl_addr; +wire [7:0] ioctl_dout; +wire key_strobe; +wire key_pressed; +wire [7:0] key_code; + +data_io data_io( + .clk_sys ( CLOCK_48 ), + .SPI_SCK ( SPI_SCK ), + .SPI_SS2 ( SPI_SS2 ), + .SPI_DI ( SPI_DI ), + .ioctl_download( ioctl_downl ), + .ioctl_index ( ioctl_index ), + .ioctl_wr ( ioctl_wr ), + .ioctl_addr ( ioctl_addr ), + .ioctl_dout ( ioctl_dout ) +); + +wire [24:0] sp_ioctl_addr = ioctl_addr - 16'ha000; + +reg port1_req, port2_req; +sdram sdram( + .*, + .init_n ( pll_locked ), + .clk ( CLOCK_48 ), + + // port1 used for main + sound CPU + .port1_req ( port1_req ), + .port1_ack ( ), + .port1_a ( ioctl_addr[23:1] ), + .port1_ds ( {ioctl_addr[0], ~ioctl_addr[0]} ), + .port1_we ( ioctl_downl ), + .port1_d ( {ioctl_dout, ioctl_dout} ), + .port1_q ( ), + + .cpu1_addr ( ioctl_downl ? 16'hffff : {1'b0, cpu1_rom_addr[14:1]} ), + .cpu1_q ( cpu1_rom_do ), + .cpu2_addr ( ioctl_downl ? 16'hffff : (16'h4000 + cpu2_rom_addr[12:1]) ), + .cpu2_q ( cpu2_rom_do ), + + // port2 for sprite graphics + .port2_req ( port2_req ), + .port2_ack ( ), + .port2_a ( {sp_ioctl_addr[12:0], sp_ioctl_addr[14]} ), + .port2_ds ( {sp_ioctl_addr[13], ~sp_ioctl_addr[13]} ), + .port2_we ( ioctl_downl ), + .port2_d ( {ioctl_dout, ioctl_dout} ), + .port2_q ( ), + + .sp_addr ( ioctl_downl ? 15'h7fff : bg_rom_addr ), + .sp_q ( bg_rom_do ) +); + + +// ROM download controller +always @(posedge CLOCK_48) begin + reg ioctl_wr_last = 0; + + ioctl_wr_last <= ioctl_wr; + if (ioctl_downl) begin + if (~ioctl_wr_last && ioctl_wr) begin + port1_req <= ~port1_req; + port2_req <= ~port2_req; + end + end +end + + +reg reset = 1; +reg rom_loaded = 0; +always @(posedge CLOCK_48) begin + reg ioctl_downlD; + ioctl_downlD <= ioctl_downl; + if (ioctl_downlD & ~ioctl_downl) rom_loaded <= 1; + reset <= status[0] | buttons[1] | status[6] | ~rom_loaded; +end + +wire PCLK; +wire [8:0] HPOS,VPOS; +wire [7:0] POUT; +ninjakun_top ninjakun_top( + .RESET(reset), + .MCLK(CLOCK_48), + .CTR1(~{2'b11, btn_one_player, 1'b0, m_fire, m_bomb, m_right, m_left }), + .CTR2(~{~btn_coin, 1'b1, btn_two_players, 1'b0, m_fire, m_bomb, m_right, m_left }), + .DSW1({~status[8], ~status[14], ~status[13:12], ~status[11], ~status[10:9], 1'b0}), + .DSW2({~status[17], ~status[16], 1'b0, ~status[15], ~status[18], 3'b111}), + .PH(HPOS), + .PV(VPOS), + .PCLK(PCLK), + .POUT(POUT), + .SNDOUT(audio), + .CPU1ADDR(cpu1_rom_addr), + .CPU1DT(cpu1_rom_addr[0] ? cpu1_rom_do[15:8] : cpu1_rom_do[7:0]), + .CPU2ADDR(cpu2_rom_addr), + .CPU2DT(cpu2_rom_addr[0] ? cpu2_rom_do[15:8] : cpu2_rom_do[7:0]), +// .sp_rom_addr(sp_rom_addr), +// .sp_rom_data(sp_rom_do), +// .fg_rom_addr(fg_rom_addr), +// .fg_rom_data(sp_rom_do), + .bg_rom_addr(bg_rom_addr), + .bg_rom_data(bg_rom_do) +); + +hvgen hvgen( + .HPOS(HPOS), + .VPOS(VPOS), + .PCLK(PCLK), + .iRGB(POUT), + .oRGB({r,g,b}), + .HBLK(hb), + .VBLK(vb), + .HSYN(hs), + .VSYN(vs) +); + +mist_video #(.COLOR_DEPTH(4), .SD_HCNT_WIDTH(11)) mist_video( + .clk_sys ( CLOCK_48 ), + .SPI_SCK ( SPI_SCK ), + .SPI_SS3 ( SPI_SS3 ), + .SPI_DI ( SPI_DI ), + .R ( blankn ? r : 0 ), + .G ( blankn ? g : 0 ), + .B ( blankn ? b : 0 ), + .HSync ( hs ), + .VSync ( vs ), + .VGA_R ( VGA_R ), + .VGA_G ( VGA_G ), + .VGA_B ( VGA_B ), + .VGA_VS ( VGA_VS ), + .VGA_HS ( VGA_HS ), + .rotate ( {1'b1,status[2]} ), + .ce_divider (1), + .scandoubler_disable( scandoublerD ), + .scanlines ( status[4:3] ), + .ypbpr ( ypbpr ) + ); + +user_io #(.STRLEN(($size(CONF_STR)>>3)))user_io( + .clk_sys (CLOCK_48 ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac #(.C_bits(16))dac( + .clk_i(CLOCK_48), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); +// Rotated Normal +//wire m_up = ~status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_up | joystick_0[3] | joystick_1[3]; +//wire m_down = ~status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_down | joystick_0[2] | joystick_1[2]; +wire m_left = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_left | joystick_0[1] | joystick_1[1]; +wire m_right = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_right | joystick_0[0] | joystick_1[0]; +wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; +wire m_bomb = btn_fire2 | joystick_0[5] | joystick_1[5]; + +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_left = 0; +reg btn_right = 0; +reg btn_down = 0; +reg btn_up = 0; +reg btn_fire1 = 0; +reg btn_fire2 = 0; +//reg btn_fire3 = 0; +reg btn_coin = 0; + +always @(posedge CLOCK_48) begin + reg old_state; + old_state <= key_strobe; + if(old_state != key_strobe) begin + case(key_code) + 'h75: btn_up <= key_pressed; // up + 'h72: btn_down <= key_pressed; // down + 'h6B: btn_left <= key_pressed; // left + 'h74: btn_right <= key_pressed; // right + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 +// 'h14: btn_fire3 <= key_pressed; // ctrl + 'h11: btn_fire2 <= key_pressed; // alt + 'h29: btn_fire1 <= key_pressed; // Space + endcase + end +end + + +endmodule diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/YM2149_linmix_sep.vhd b/Arcade_MiST/NinjaKun_MiST/rtl/YM2149_linmix_sep.vhd new file mode 100644 index 00000000..6ed2498a --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/YM2149_linmix_sep.vhd @@ -0,0 +1,574 @@ +-- changes for seperate audio outputs and enable now enables cpu access as well +-- +-- A simulation model of YM2149 (AY-3-8910 with bells on) + +-- Copyright (c) MikeJ - Jan 2005 +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS CODE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +-- Clues from MAME sound driver and Kazuhiro TSUJIKAWA +-- +-- These are the measured outputs from a real chip for a single Isolated channel into a 1K load (V) +-- vol 15 .. 0 +-- 3.27 2.995 2.741 2.588 2.452 2.372 2.301 2.258 2.220 2.198 2.178 2.166 2.155 2.148 2.141 2.132 +-- As the envelope volume is 5 bit, I have fitted a curve to the not quite log shape in order +-- to produced all the required values. +-- (The first part of the curve is a bit steeper and the last bit is more linear than expected) +-- +-- NOTE, this component uses LINEAR mixing of the three analogue channels, and is only +-- accurate for designs where the outputs are buffered and not simply wired together. +-- The ouput level is more complex in that case and requires a larger table. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity YM2149 is + port ( + -- data bus + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + O_DA_OE_L : out std_logic; + -- control + I_A9_L : in std_logic; + I_A8 : in std_logic; + I_BDIR : in std_logic; + I_BC2 : in std_logic; + I_BC1 : in std_logic; + I_SEL_L : in std_logic; + + O_AUDIO : out std_logic_vector(7 downto 0); + O_CHAN : out std_logic_vector(1 downto 0); + -- port a + I_IOA : in std_logic_vector(7 downto 0); + O_IOA : out std_logic_vector(7 downto 0); + O_IOA_OE_L : out std_logic; + -- port b + I_IOB : in std_logic_vector(7 downto 0); + O_IOB : out std_logic_vector(7 downto 0); + O_IOB_OE_L : out std_logic; + + ENA : in std_logic; -- clock enable for higher speed operation + RESET_L : in std_logic; + CLK : in std_logic -- note 6 Mhz + ); +end; + +architecture RTL of YM2149 is + type array_16x8 is array (0 to 15) of std_logic_vector( 7 downto 0); + type array_3x12 is array (1 to 3) of std_logic_vector(11 downto 0); + + signal cnt_div : std_logic_vector(3 downto 0) := (others => '0'); + signal cnt_div_t1 : std_logic_vector(3 downto 0); + signal noise_div : std_logic := '0'; + signal ena_div : std_logic; + signal ena_div_noise : std_logic; + signal poly17 : std_logic_vector(16 downto 0) := (others => '0'); + + -- registers + signal addr : std_logic_vector(7 downto 0); + signal busctrl_addr : std_logic; + signal busctrl_we : std_logic; + signal busctrl_re : std_logic; + + signal reg : array_16x8; + signal env_reset : std_logic; + signal ioa_inreg : std_logic_vector(7 downto 0); + signal iob_inreg : std_logic_vector(7 downto 0); + + signal noise_gen_cnt : std_logic_vector(4 downto 0); + signal noise_gen_op : std_logic; + signal tone_gen_cnt : array_3x12 := (others => (others => '0')); + signal tone_gen_op : std_logic_vector(3 downto 1) := "000"; + + signal env_gen_cnt : std_logic_vector(15 downto 0); + signal env_ena : std_logic; + signal env_hold : std_logic; + signal env_inc : std_logic; + signal env_vol : std_logic_vector(4 downto 0); + + signal tone_ena_l : std_logic; + signal tone_src : std_logic; + signal noise_ena_l : std_logic; + signal chan_vol : std_logic_vector(4 downto 0); + + signal dac_amp : std_logic_vector(7 downto 0); +begin + -- cpu i/f + p_busdecode : process(I_BDIR, I_BC2, I_BC1, addr, I_A9_L, I_A8) + variable cs : std_logic; + variable sel : std_logic_vector(2 downto 0); + begin + -- BDIR BC2 BC1 MODE + -- 0 0 0 inactive + -- 0 0 1 address + -- 0 1 0 inactive + -- 0 1 1 read + -- 1 0 0 address + -- 1 0 1 inactive + -- 1 1 0 write + -- 1 1 1 read + busctrl_addr <= '0'; + busctrl_we <= '0'; + busctrl_re <= '0'; + + cs := '0'; + if (I_A9_L = '0') and (I_A8 = '1') and (addr(7 downto 4) = "0000") then + cs := '1'; + end if; + + sel := (I_BDIR & I_BC2 & I_BC1); + case sel is + when "000" => null; + when "001" => busctrl_addr <= '1'; + when "010" => null; + when "011" => busctrl_re <= cs; + when "100" => busctrl_addr <= '1'; + when "101" => null; + when "110" => busctrl_we <= cs; + when "111" => busctrl_addr <= '1'; + when others => null; + end case; + end process; + + p_oe : process(busctrl_re) + begin + -- if we are emulating a real chip, maybe clock this to fake up the tristate typ delay of 100ns + O_DA_OE_L <= not (busctrl_re); + end process; + + -- + -- CLOCKED + -- + p_waddr : process(RESET_L, CLK) + begin + -- looks like registers are latches in real chip, but the address is caught at the end of the address state. + if (RESET_L = '0') then + addr <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA = '1') then + if (busctrl_addr = '1') then + addr <= I_DA; + end if; + end if; + end if; + end process; + + p_wdata : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + reg <= (others => (others => '0')); + env_reset <= '1'; + elsif rising_edge(CLK) then + if (ENA = '1') then + env_reset <= '0'; + if (busctrl_we = '1') then + case addr(3 downto 0) is + when x"0" => reg(0) <= I_DA; + when x"1" => reg(1) <= I_DA; + when x"2" => reg(2) <= I_DA; + when x"3" => reg(3) <= I_DA; + when x"4" => reg(4) <= I_DA; + when x"5" => reg(5) <= I_DA; + when x"6" => reg(6) <= I_DA; + when x"7" => reg(7) <= I_DA; + when x"8" => reg(8) <= I_DA; + when x"9" => reg(9) <= I_DA; + when x"A" => reg(10) <= I_DA; + when x"B" => reg(11) <= I_DA; + when x"C" => reg(12) <= I_DA; + when x"D" => reg(13) <= I_DA; env_reset <= '1'; + when x"E" => reg(14) <= I_DA; + when x"F" => reg(15) <= I_DA; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_rdata : process(busctrl_re, addr, reg, ioa_inreg, iob_inreg) + begin + O_DA <= (others => '0'); -- 'X' + if (busctrl_re = '1') then -- not necessary, but useful for putting 'X's in the simulator + case addr(3 downto 0) is + when x"0" => O_DA <= reg(0) ; + when x"1" => O_DA <= "0000" & reg(1)(3 downto 0) ; + when x"2" => O_DA <= reg(2) ; + when x"3" => O_DA <= "0000" & reg(3)(3 downto 0) ; + when x"4" => O_DA <= reg(4) ; + when x"5" => O_DA <= "0000" & reg(5)(3 downto 0) ; + when x"6" => O_DA <= "000" & reg(6)(4 downto 0) ; + when x"7" => O_DA <= reg(7) ; + when x"8" => O_DA <= "000" & reg(8)(4 downto 0) ; + when x"9" => O_DA <= "000" & reg(9)(4 downto 0) ; + when x"A" => O_DA <= "000" & reg(10)(4 downto 0) ; + when x"B" => O_DA <= reg(11); + when x"C" => O_DA <= reg(12); + when x"D" => O_DA <= "0000" & reg(13)(3 downto 0); + when x"E" => if (reg(7)(6) = '0') then -- input + O_DA <= ioa_inreg; + else + O_DA <= reg(14); -- read output reg + end if; + when x"F" => if (Reg(7)(7) = '0') then + O_DA <= iob_inreg; + else + O_DA <= reg(15); + end if; + when others => null; + end case; + end if; + end process; + -- + p_divider : process + begin + wait until rising_edge(CLK); + -- / 8 when SEL is high and /16 when SEL is low + if (ENA = '1') then + ena_div <= '0'; + ena_div_noise <= '0'; + if (cnt_div = "0000") then + cnt_div <= (not I_SEL_L) & "111"; + ena_div <= '1'; + + noise_div <= not noise_div; + if (noise_div = '1') then + ena_div_noise <= '1'; + end if; + else + cnt_div <= cnt_div - "1"; + end if; + end if; + end process; + + p_noise_gen : process + variable noise_gen_comp : std_logic_vector(4 downto 0); + variable poly17_zero : std_logic; + begin + wait until rising_edge(CLK); + if (reg(6)(4 downto 0) = "00000") then + noise_gen_comp := "00000"; + else + noise_gen_comp := (reg(6)(4 downto 0) - "1"); + end if; + + poly17_zero := '0'; + if (poly17 = "00000000000000000") then poly17_zero := '1'; end if; + + if (ENA = '1') then + if (ena_div_noise = '1') then -- divider ena + + if (noise_gen_cnt >= noise_gen_comp) then + noise_gen_cnt <= "00000"; + poly17 <= (poly17(0) xor poly17(2) xor poly17_zero) & poly17(16 downto 1); + else + noise_gen_cnt <= (noise_gen_cnt + "1"); + end if; + end if; + end if; + end process; + noise_gen_op <= poly17(0); + + p_tone_gens : process + variable tone_gen_freq : array_3x12; + variable tone_gen_comp : array_3x12; + begin + wait until rising_edge(CLK); + -- looks like real chips count up - we need to get the Exact behaviour .. + tone_gen_freq(1) := reg(1)(3 downto 0) & reg(0); + tone_gen_freq(2) := reg(3)(3 downto 0) & reg(2); + tone_gen_freq(3) := reg(5)(3 downto 0) & reg(4); + -- period 0 = period 1 + for i in 1 to 3 loop + if (tone_gen_freq(i) = x"000") then + tone_gen_comp(i) := x"000"; + else + tone_gen_comp(i) := (tone_gen_freq(i) - "1"); + end if; + end loop; + + if (ENA = '1') then + for i in 1 to 3 loop + if (ena_div = '1') then -- divider ena + + if (tone_gen_cnt(i) >= tone_gen_comp(i)) then + tone_gen_cnt(i) <= x"000"; + tone_gen_op(i) <= not tone_gen_op(i); + else + tone_gen_cnt(i) <= (tone_gen_cnt(i) + "1"); + end if; + end if; + end loop; + end if; + end process; + + p_envelope_freq : process + variable env_gen_freq : std_logic_vector(15 downto 0); + variable env_gen_comp : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + env_gen_freq := reg(12) & reg(11); + -- envelope freqs 1 and 0 are the same. + if (env_gen_freq = x"0000") then + env_gen_comp := x"0000"; + else + env_gen_comp := (env_gen_freq - "1"); + end if; + + if (ENA = '1') then + env_ena <= '0'; + if (ena_div = '1') then -- divider ena + if (env_gen_cnt >= env_gen_comp) then + env_gen_cnt <= x"0000"; + env_ena <= '1'; + else + env_gen_cnt <= (env_gen_cnt + "1"); + end if; + end if; + end if; + end process; + + p_envelope_shape : process(env_reset, reg, CLK) + variable is_bot : boolean; + variable is_bot_p1 : boolean; + variable is_top_m1 : boolean; + variable is_top : boolean; + begin + -- envelope shapes + -- C AtAlH + -- 0 0 x x \___ + -- + -- 0 1 x x /___ + -- + -- 1 0 0 0 \\\\ + -- + -- 1 0 0 1 \___ + -- + -- 1 0 1 0 \/\/ + -- ___ + -- 1 0 1 1 \ + -- + -- 1 1 0 0 //// + -- ___ + -- 1 1 0 1 / + -- + -- 1 1 1 0 /\/\ + -- + -- 1 1 1 1 /___ + if (env_reset = '1') then + -- load initial state + if (reg(13)(2) = '0') then -- attack + env_vol <= "11111"; + env_inc <= '0'; -- -1 + else + env_vol <= "00000"; + env_inc <= '1'; -- +1 + end if; + env_hold <= '0'; + + elsif rising_edge(CLK) then + is_bot := (env_vol = "00000"); + is_bot_p1 := (env_vol = "00001"); + is_top_m1 := (env_vol = "11110"); + is_top := (env_vol = "11111"); + + if (ENA = '1') then + if (env_ena = '1') then + if (env_hold = '0') then + if (env_inc = '1') then + env_vol <= (env_vol + "00001"); + else + env_vol <= (env_vol + "11111"); + end if; + end if; + + -- envelope shape control. + if (reg(13)(3) = '0') then + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + else + if is_top then env_hold <= '1'; end if; + end if; + else + if (reg(13)(0) = '1') then -- hold = 1 + if (env_inc = '0') then -- down + if (reg(13)(1) = '1') then -- alt + if is_bot then env_hold <= '1'; end if; + else + if is_bot_p1 then env_hold <= '1'; end if; + end if; + else + if (reg(13)(1) = '1') then -- alt + if is_top then env_hold <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + end if; + end if; + + elsif (reg(13)(1) = '1') then -- alternate + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + if is_bot then env_hold <= '0'; env_inc <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + if is_top then env_hold <= '0'; env_inc <= '0'; end if; + end if; + end if; + + end if; + end if; + end if; + end if; + end process; + + p_chan_mixer : process(cnt_div, reg, tone_gen_op) + begin + tone_ena_l <= '1'; tone_src <= '1'; + noise_ena_l <= '1'; chan_vol <= "00000"; + case cnt_div(1 downto 0) is + when "00" => + tone_ena_l <= reg(7)(0); tone_src <= tone_gen_op(1); chan_vol <= reg(8)(4 downto 0); + noise_ena_l <= reg(7)(3); + when "01" => + tone_ena_l <= reg(7)(1); tone_src <= tone_gen_op(2); chan_vol <= reg(9)(4 downto 0); + noise_ena_l <= reg(7)(4); + when "10" => + tone_ena_l <= reg(7)(2); tone_src <= tone_gen_op(3); chan_vol <= reg(10)(4 downto 0); + noise_ena_l <= reg(7)(5); + when "11" => null; -- tone gen outputs become valid on this clock + when others => null; + end case; + end process; + + p_op_mixer : process + variable chan_mixed : std_logic; + variable chan_amp : std_logic_vector(4 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + chan_mixed := (tone_ena_l or tone_src) and (noise_ena_l or noise_gen_op); + + chan_amp := (others => '0'); + if (chan_mixed = '1') then + if (chan_vol(4) = '0') then + if (chan_vol(3 downto 0) = "0000") then -- nothing is easy ! make sure quiet is quiet + chan_amp := "00000"; + else + chan_amp := chan_vol(3 downto 0) & '1'; -- make sure level 31 (env) = level 15 (tone) + end if; + else + chan_amp := env_vol(4 downto 0); + end if; + end if; + + dac_amp <= x"00"; + case chan_amp is + when "11111" => dac_amp <= x"FF"; + when "11110" => dac_amp <= x"D9"; + when "11101" => dac_amp <= x"BA"; + when "11100" => dac_amp <= x"9F"; + when "11011" => dac_amp <= x"88"; + when "11010" => dac_amp <= x"74"; + when "11001" => dac_amp <= x"63"; + when "11000" => dac_amp <= x"54"; + when "10111" => dac_amp <= x"48"; + when "10110" => dac_amp <= x"3D"; + when "10101" => dac_amp <= x"34"; + when "10100" => dac_amp <= x"2C"; + when "10011" => dac_amp <= x"25"; + when "10010" => dac_amp <= x"1F"; + when "10001" => dac_amp <= x"1A"; + when "10000" => dac_amp <= x"16"; + when "01111" => dac_amp <= x"13"; + when "01110" => dac_amp <= x"10"; + when "01101" => dac_amp <= x"0D"; + when "01100" => dac_amp <= x"0B"; + when "01011" => dac_amp <= x"09"; + when "01010" => dac_amp <= x"08"; + when "01001" => dac_amp <= x"07"; + when "01000" => dac_amp <= x"06"; + when "00111" => dac_amp <= x"05"; + when "00110" => dac_amp <= x"04"; + when "00101" => dac_amp <= x"03"; + when "00100" => dac_amp <= x"03"; + when "00011" => dac_amp <= x"02"; + when "00010" => dac_amp <= x"02"; + when "00001" => dac_amp <= x"01"; + when "00000" => dac_amp <= x"00"; + when others => null; + end case; + + cnt_div_t1 <= cnt_div; + end if; + end process; + + p_audio_output : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + O_AUDIO <= (others => '0'); + O_CHAN <= (others => '0'); + elsif rising_edge(CLK) then + + if (ENA = '1') then + O_AUDIO <= dac_amp(7 downto 0); + O_CHAN <= cnt_div_t1(1 downto 0); + end if; + end if; + end process; + + p_io_ports : process(reg) + begin + O_IOA <= reg(14); + O_IOA_OE_L <= not reg(7)(6); + O_IOB <= reg(15); + O_IOB_OE_L <= not reg(7)(7); + end process; + + p_io_ports_inreg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then -- resync + ioa_inreg <= I_IOA; + iob_inreg <= I_IOB; + end if; + end process; +end architecture RTL; diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/build_id.tcl b/Arcade_MiST/NinjaKun_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80.vhd b/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..398fa0df --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1073 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 and Auto_Wait_t1 = '0' then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0' and Auto_Wait_t1 = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0' and Auto_Wait_t1 = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if T_Res = '1' then + Auto_Wait_t1 <= '0'; + else + Auto_Wait_t1 <= Auto_Wait or IORQ_i; + end if; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if (Auto_Wait = '1' and Auto_Wait_t2 = '0') nor + (IOWait = 1 and IORQ_i = '1' and Auto_Wait_t1 = '0') then + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_ALU.vhd b/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..86fddce7 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,351 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; + +end; diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_MCode.vhd b/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..4cc30f35 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1934 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; +-- constant aNone : std_logic_vector(2 downto 0) := "000"; +-- constant aXY : std_logic_vector(2 downto 0) := "001"; +-- constant aIOA : std_logic_vector(2 downto 0) := "010"; +-- constant aSP : std_logic_vector(2 downto 0) := "011"; +-- constant aBC : std_logic_vector(2 downto 0) := "100"; +-- constant aDE : std_logic_vector(2 downto 0) := "101"; +-- constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0010"; + else + IncDec_16 <= "1010"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0010"; + else + IncDec_16 <= "1010"; + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_Pack.vhd b/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..ac7d34da --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,208 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_Reg.vhd b/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80s.vhd b/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80s.vhd new file mode 100644 index 00000000..5b612110 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/cpu/T80s.vhd @@ -0,0 +1,190 @@ +-- +-- Z80 compatible microprocessor core, synchronous top level +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed read with wait +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80s is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0; -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + IOWait : integer := 1 -- 0 => Single cycle I/O, 1 => Std I/O cycle + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + 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 T80s; + +architecture rtl of T80s is + + signal CEN : std_logic; + 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 + + CEN <= '1'; + + u0 : T80 + generic map( + Mode => Mode, + IOWait => IOWait) + port map( + CEN => CEN, + 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 + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and Wait_n = '0')) and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + else + if (TState = "001" or (TState = "010" and Wait_n = '0')) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/dataselector_3D_8B.v b/Arcade_MiST/NinjaKun_MiST/rtl/dataselector_3D_8B.v new file mode 100644 index 00000000..9b99b4a9 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/dataselector_3D_8B.v @@ -0,0 +1,19 @@ +module dataselector_3D_8B +( + output [7:0] out, + input [7:0] df, + + input en0, + input [7:0] dt0, + input en1, + input [7:0] dt1, + input en2, + input [7:0] dt2 +); + +assign out = en0 ? dt0 : + en1 ? dt1 : + en2 ? dt2 : + df; + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/dataselector_4D_9B.v b/Arcade_MiST/NinjaKun_MiST/rtl/dataselector_4D_9B.v new file mode 100644 index 00000000..a4558148 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/dataselector_4D_9B.v @@ -0,0 +1,26 @@ +module dataselector_4D_9B +( + output [8:0] OUT, + + input EN1, + input [8:0] IN1, + + input EN2, + input [8:0] IN2, + + input EN3, + input [8:0] IN3, + + input EN4, + input [8:0] IN4, + + input [8:0] IND +); + +assign OUT = EN1 ? IN1: + EN2 ? IN2: + EN3 ? IN3: + EN4 ? IN4: + IND; + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/dataselector_5D_8B.v b/Arcade_MiST/NinjaKun_MiST/rtl/dataselector_5D_8B.v new file mode 100644 index 00000000..bfc04745 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/dataselector_5D_8B.v @@ -0,0 +1,23 @@ +module dataselector_5D_8B +( + output [7:0] out, + input en0, + input [7:0] dt0, + input en1, + input [7:0] dt1, + input en2, + input [7:0] dt2, + input en3, + input [7:0] dt3, + input en4, + input [7:0] dt4 +); + +assign out = en0 ? dt0 : + en1 ? dt1 : + en2 ? dt2 : + en3 ? dt3 : + en4 ? dt4 : + 8'hFF; + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/dpram.vhd b/Arcade_MiST/NinjaKun_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..9ea85a26 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/dpram.vhd @@ -0,0 +1,130 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY dpram IS + GENERIC + ( + init_file : string := ""; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED"; + outdata_reg_b : string := "UNREGISTERED" + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock_a : IN STD_LOGIC ; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + wren_a : IN STD_LOGIC := '1'; + wren_b : IN STD_LOGIC := '1'; + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_reg_b : STRING; + clock_enable_input_a : STRING; + clock_enable_input_b : STRING; + clock_enable_output_a : STRING; + clock_enable_output_b : STRING; + indata_reg_b : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + numwords_b : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_aclr_b : STRING; + outdata_reg_a : STRING; + outdata_reg_b : STRING; + power_up_uninitialized : STRING; + read_during_write_mode_port_a : STRING; + read_during_write_mode_port_b : STRING; + widthad_a : NATURAL; + widthad_b : NATURAL; + width_a : NATURAL; + width_b : NATURAL; + width_byteena_a : NATURAL; + width_byteena_b : NATURAL; + wrcontrol_wraddress_reg_b : STRING + ); + PORT ( + wren_a : IN STD_LOGIC ; + clock0 : IN STD_LOGIC ; + wren_b : IN STD_LOGIC ; + clock1 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q_a <= sub_wire0(width_a-1 DOWNTO 0); + q_b <= sub_wire1(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "BYPASS", + clock_enable_input_b => "BYPASS", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + numwords_b => 2**widthad_a, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => outdata_reg_a, + outdata_reg_b => outdata_reg_a, + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => widthad_a, + widthad_b => widthad_a, + width_a => width_a, + width_b => width_a, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + wren_a => wren_a, + clock0 => clock_a, + wren_b => wren_b, + clock1 => clock_b, + address_a => address_a, + address_b => address_b, + data_a => data_a, + data_b => data_b, + q_a => sub_wire0, + q_b => sub_wire1 + ); + + + +END SYN; diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/dpram_1r1w.vhd b/Arcade_MiST/NinjaKun_MiST/rtl/dpram_1r1w.vhd new file mode 100644 index 00000000..73f3d5d1 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/dpram_1r1w.vhd @@ -0,0 +1,101 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY dpram_1r1w IS + GENERIC + ( + widthad_a : natural; + width_a : natural := 8; + outdata_reg_b : string := "UNREGISTERED" + ); + PORT + ( + data : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + rdaddress : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + rdclock : IN STD_LOGIC ; + rdclocken : IN STD_LOGIC := '1'; + wraddress : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + wrclock : IN STD_LOGIC ; + wrclocken : IN STD_LOGIC := '1'; + wren : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END dpram_1r1w; + + +ARCHITECTURE SYN OF dpram_1r1w IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + COMPONENT altsyncram + GENERIC ( + address_reg_b : STRING; + clock_enable_input_a : STRING; + clock_enable_input_b : STRING; + clock_enable_output_b : STRING; + intended_device_family : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + numwords_b : NATURAL; + operation_mode : STRING; + outdata_aclr_b : STRING; + outdata_reg_b : STRING; + power_up_uninitialized : STRING; + widthad_a : NATURAL; + widthad_b : NATURAL; + width_a : NATURAL; + width_b : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clocken0 : IN STD_LOGIC ; + clocken1 : IN STD_LOGIC ; + wren_a : IN STD_LOGIC ; + clock0 : IN STD_LOGIC ; + clock1 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "BYPASS", + clock_enable_input_b => "BYPASS", + clock_enable_output_b => "BYPASS", + intended_device_family => "Cyclone III", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + numwords_b => 2**widthad_a, + operation_mode => "DUAL_PORT", + outdata_aclr_b => "NONE", + outdata_reg_b => outdata_reg_b, + power_up_uninitialized => "FALSE", + widthad_a => widthad_a, + widthad_b => widthad_a, + width_a => width_a, + width_b => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clocken0 => wrclocken, + clocken1 => rdclocken, + wren_a => wren, + clock0 => wrclock, + clock1 => rdclock, + address_a => wraddress, + address_b => rdaddress, + data_a => data, + q_b => sub_wire0 + ); + +END SYN; diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/hvgen.v b/Arcade_MiST/NinjaKun_MiST/rtl/hvgen.v new file mode 100644 index 00000000..ffe5eacd --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/hvgen.v @@ -0,0 +1,42 @@ +module hvgen +( + output [8:0] HPOS, + output [8:0] VPOS, + input PCLK, + input [11:0] iRGB, + + output reg [11:0] oRGB, + output reg HBLK = 1, + output reg VBLK = 1, + output reg HSYN = 1, + output reg VSYN = 1 +); + +reg [8:0] hcnt = 0; +reg [8:0] vcnt = 0; + +assign HPOS = hcnt-16; +assign VPOS = vcnt-16; + +always @(posedge PCLK) begin + case (hcnt) + 15: begin HBLK <= 0; hcnt <= hcnt+1; end + 272: begin HBLK <= 1; hcnt <= hcnt+1; end + 311: begin HSYN <= 0; hcnt <= hcnt+1; end + 342: begin HSYN <= 1; hcnt <= 471; end + 511: begin hcnt <= 0; + case (vcnt) + 15: begin VBLK <= 0; vcnt <= vcnt+1; end + 207: begin VBLK <= 1; vcnt <= vcnt+1; end + 226: begin VSYN <= 0; vcnt <= vcnt+1; end + 233: begin VSYN <= 1; vcnt <= 483; end + 511: begin vcnt <= 0; end + default: vcnt <= vcnt+1; + endcase + end + default: hcnt <= hcnt+1; + endcase + oRGB <= (HBLK|VBLK) ? 12'h0 : iRGB; +end + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/mems.v b/Arcade_MiST/NinjaKun_MiST/rtl/mems.v new file mode 100644 index 00000000..e943fd5b --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/mems.v @@ -0,0 +1,116 @@ +// Copyright (c) 2011 MiSTer-X + +module VDPRAM400x2 +( + input CL0, + input [10:0] AD0, + input WR0, + input [7:0] WD0, + output [7:0] RD0, + + input CL1, + input [9:0] AD1, + output [15:0] RD1 +); + +reg A10; +always @( posedge CL0 ) A10 <= AD0[10]; + +wire [7:0] RD00, RD01; +DPRAM400 LS( CL0, AD0[9:0], WR0 & (~AD0[10]), WD0, RD00, CL1, AD1, 1'b0, 8'h0, RD1[ 7:0] ); +DPRAM400 HS( CL0, AD0[9:0], WR0 & ( AD0[10]), WD0, RD01, CL1, AD1, 1'b0, 8'h0, RD1[15:8] ); + +assign RD0 = A10 ? RD01 : RD00; + +endmodule + + +module DPRAM800 +( + input CL0, + input [10:0] AD0, + input WE0, + input [7:0] WD0, + output reg [7:0] RD0, + + input CL1, + input [10:0] AD1, + input WE1, + input [7:0] WD1, + output reg [7:0] RD1 +); + +reg [7:0] core[0:2047]; + +always @( posedge CL0 ) begin + if (WE0) core[AD0] <= WD0; + RD0 <= core[AD0]; +end + +always @( posedge CL1 ) begin + if (WE1) core[AD1] <= WD1; + RD1 <= core[AD1]; +end + +endmodule + + +module DPRAM400 +( + input CL0, + input [9:0] AD0, + input WE0, + input [7:0] WD0, + output reg [7:0] RD0, + + input CL1, + input [9:0] AD1, + input WE1, + input [7:0] WD1, + output reg [7:0] RD1 +); + +reg [7:0] core[0:1023]; + +always @( posedge CL0 ) begin + if (WE0) core[AD0] <= WD0; + RD0 <= core[AD0]; +end + +always @( posedge CL1 ) begin + if (WE1) core[AD1] <= WD1; + RD1 <= core[AD1]; +end + +endmodule + + +module DPRAM200 +( + input CL0, + input [8:0] AD0, + input WE0, + input [7:0] WD0, + output reg [7:0] RD0, + + input CL1, + input [8:0] AD1, + input WE1, + input [7:0] WD1, + output reg [7:0] RD1 +); + +reg [7:0] core[0:511]; + +always @( posedge CL0 ) begin + if (WE0) core[AD0] <= WD0; + RD0 <= core[AD0]; +end + +always @( posedge CL1 ) begin + if (WE1) core[AD1] <= WD1; + RD1 <= core[AD1]; +end + +endmodule + diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_adec.v b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_adec.v new file mode 100644 index 00000000..b5b9977e --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_adec.v @@ -0,0 +1,28 @@ +module ninjakun_adec +( + input [15:0] CP0AD, + input CP0WR, + + input [15:0] CP1AD, + input CP1WR, + + output CS_IN0, + output CS_IN1, + + output CS_SH0, + output CS_SH1, + + output SYNWR0, + output SYNWR1 +); + +assign CS_IN0 = (CP0AD[15:2] == 14'b1010_0000_0000_00); +assign CS_IN1 = (CP1AD[15:2] == 14'b1010_0000_0000_00); + +assign CS_SH0 = (CP0AD[15:11] == 5'b1110_0); +assign CS_SH1 = (CP1AD[15:11] == 5'b1110_0); + +assign SYNWR0 = CS_IN0 & (CP0AD[1:0]==2) & CP0WR; +assign SYNWR1 = CS_IN1 & (CP1AD[1:0]==2) & CP1WR; + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_bg.v b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_bg.v new file mode 100644 index 00000000..fa24729e --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_bg.v @@ -0,0 +1,44 @@ +// BackGround Scanline Generator +module ninjakun_bg +( + input VCLK, + + input [8:0] PH, // CRTC + input [8:0] PV, + + input [7:0] BGSCX, // SCRREG + input [7:0] BGSCY, + + output reg [9:0] BGVAD, // VRAM + input [15:0] BGVDT, + + output reg [12:0] BGCAD, + input [31:0] BGCDT, + + output [8:0] BGOUT // OUTPUT +); + +wire [8:0] POSH = PH+BGSCX+2; +wire [8:0] POSV = PV+BGSCY+32; + +wire [9:0] CHRNO = {BGVDT[15:14],BGVDT[7:0]}; +reg [31:0] CDT; + +reg [3:0] PAL; +reg [3:0] OUT; +always @( posedge VCLK ) begin + case(POSH[2:0]) + 0: begin OUT <= CDT[7:4] ; PAL <= BGVDT[11:8]; end + 1: begin OUT <= CDT[3:0] ; BGVAD <= {POSV[7:3],POSH[7:3]}; end + 2: begin OUT <= CDT[15:12]; end + 3: begin OUT <= CDT[11:8] ; end + 4: begin OUT <= CDT[23:20]; BGCAD <= {CHRNO,POSV[2:0]}; end + 5: begin OUT <= CDT[19:16]; end + 6: begin OUT <= CDT[31:28]; end + 7: begin OUT <= CDT[27:24]; CDT <= BGCDT; end + endcase +end + +assign BGOUT = { 1'b1, PAL, OUT }; + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_clkgen.v b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_clkgen.v new file mode 100644 index 00000000..e10d8edd --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_clkgen.v @@ -0,0 +1,35 @@ +// Copyright (c) 2011 MiSTer-X + +module ninjakun_clkgen +( + input MCLK, // 48MHz + + output VCLKx4, + output VCLK, + + output VRAMCL, + output PCLK, + + output CLK24M, + output CLK12M, + output CLK6M, + output CLK3M +); + +reg [3:0] CLKDIV; +always @( posedge MCLK ) CLKDIV <= CLKDIV+1'b1; + +assign VCLKx4 = CLKDIV[0]; // 24MHz +assign VCLK = CLKDIV[2]; // 6MHz + +assign CLK24M = CLKDIV[0]; +assign CLK12M = CLKDIV[1]; +assign CLK6M = CLKDIV[2]; +assign CLK3M = CLKDIV[3]; + +assign VRAMCL = ~VCLKx4; +assign PCLK = ~VCLK; + +endmodule + + diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_cpumux.v b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_cpumux.v new file mode 100644 index 00000000..6541c67b --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_cpumux.v @@ -0,0 +1,53 @@ +module ninjakun_cpumux +( + input SHCLK, + output [15:0] CPADR, + output [7:0] CPODT, + input [7:0] CPIDT, + output CPRED, + output CPWRT, + + output reg CP0CL, + input [15:0] CP0AD, + input [7:0] CP0OD, + output [7:0] CP0ID, + input CP0RD, + input CP0WR, + + output reg CP1CL, + input [15:0] CP1AD, + input [7:0] CP1OD, + output [7:0] CP1ID, + input CP1RD, + input CP1WR +); + +reg [7:0] CP0DT, CP1DT; +reg [2:0] PHASE; +reg CSIDE; +always @( posedge SHCLK ) begin // 24MHz + case (PHASE) + 0: begin CP0DT <= CPIDT; CSIDE <= 1'b0; end + 4: begin CP1DT <= CPIDT; CSIDE <= 1'b1; end + default:; + endcase +end +always @( negedge SHCLK ) begin + case (PHASE) + 0: CP0CL <= 1'b1; + 2: CP0CL <= 1'b0; + 4: CP1CL <= 1'b1; + 6: CP1CL <= 1'b0; + default:; + endcase + PHASE <= PHASE+1; +end + +assign CPADR = CSIDE ? CP1AD : CP0AD; +assign CPODT = CSIDE ? CP1OD : CP0OD; +assign CPRED = CSIDE ? CP1RD : CP0RD; +assign CPWRT = CSIDE ? CP1WR : CP0WR; +assign CP0ID = CSIDE ? CP0DT : CPIDT; +assign CP1ID = CSIDE ? CPIDT : CP1DT; + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_fg.v b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_fg.v new file mode 100644 index 00000000..086c9a5e --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_fg.v @@ -0,0 +1,41 @@ +// ForeGround Scanline Generator +module ninjakun_fg +( + input VCLK, + + input [8:0] PH, // CRTC + input [8:0] PV, + + output reg [9:0] FGVAD, // VRAM + input [15:0] FGVDT, + + output reg [12:0] FGCAD, + input [31:0] FGCDT, + + output [9:0] FGOUT // PIXEL OUT : {PRIO,PALNO[8:0]} +); + +wire [8:0] POSH = PH+8+1; +wire [8:0] POSV = PV+32; + +wire [9:0] CHRNO = {1'b0,FGVDT[13],FGVDT[7:0]}; +reg [31:0] CDT; + +reg [4:0] PAL; +reg [3:0] OUT; +always @( posedge VCLK ) begin + case(POSH[2:0]) + 0: begin OUT <= CDT[7:4] ; PAL <= FGVDT[12:8]; end + 1: begin OUT <= CDT[3:0] ; FGVAD <= {POSV[7:3],POSH[7:3]}; end + 2: begin OUT <= CDT[15:12]; end + 3: begin OUT <= CDT[11:8] ; end + 4: begin OUT <= CDT[23:20]; FGCAD <= {CHRNO,POSV[2:0]}; end + 5: begin OUT <= CDT[19:16]; end + 6: begin OUT <= CDT[31:28]; end + 7: begin OUT <= CDT[27:24]; CDT <= FGCDT; end + endcase +end + +assign FGOUT = { PAL[4], 1'b0, PAL[3:0], OUT }; + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_input.v b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_input.v new file mode 100644 index 00000000..936322f5 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_input.v @@ -0,0 +1,57 @@ +// Copyright (c) 2011 MiSTer-X + +module ninjakun_input +( + input INPCL, + input RESET, + + input [7:0] CTR1i, // Control Panel (Negative Logic) + input [7:0] CTR2i, + + input VBLK, + + input [1:0] AD0, + input [1:0] OD0, + input WR0, + + input [1:0] AD1, + input [1:0] OD1, + input WR1, + + output [7:0] INPD0, + output [7:0] INPD1 +); + +reg [1:0] SYNCFLG; +reg [7:0] CTR1,CTR2; +always @( posedge INPCL or posedge RESET ) begin + if (RESET) begin + SYNCFLG = 0; + end + else begin + CTR1 <= CTR1i; + CTR2 <= CTR2i; + if (WR0) begin + if (OD0[1]) SYNCFLG[0] = 1; + if (OD0[0]) SYNCFLG[1] = 0; + end + if (WR1) begin + if (OD1[1]) SYNCFLG[0] = 0; + if (OD1[0]) SYNCFLG[1] = 1; + end + end +end + +wire [7:0] INPORT0 = CTR1; +wire [7:0] INPORT1 = CTR2; +wire [7:0] INPORT2 = { 4'b0000, SYNCFLG, ~VBLK,1'b0 }; + +assign INPD0 = ( AD0 == 0 ) ? INPORT0 : + ( AD0 == 1 ) ? INPORT1 : + ( AD0 == 2 ) ? INPORT2 : 8'hFF; + +assign INPD1 = ( AD1 == 0 ) ? INPORT0 : + ( AD1 == 1 ) ? INPORT1 : + ( AD1 == 2 ) ? INPORT2 : 8'hFF; + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_io_video.v b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_io_video.v new file mode 100644 index 00000000..ba510c6b --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_io_video.v @@ -0,0 +1,115 @@ +// Copyright (c) 2011,19 MiSTer-X + +module ninjakun_io_video +( + input SHCLK, + input CLK3M, + input RESET, + input VRCLK, + input VCLKx4, + input VCLK, + input [8:0] PH, + input [8:0] PV, + input [15:0] CPADR, + input [7:0] CPODT, + output [7:0] CPIDT, + input CPRED, + input CPWRT, + input [7:0] DSW1, + input [7:0] DSW2, + output VBLK, + output [7:0] POUT, + output [15:0] SNDOUT, +// output [12:0] sp_rom_addr, +// input [31:0] sp_rom_data, +// output [12:0] fg_rom_addr, +// input [31:0] fg_rom_data, + output [12:0] bg_rom_addr, + input [31:0] bg_rom_data +); + +wire [9:0] FGVAD; +wire [15:0] FGVDT; +wire [9:0] BGVAD; +wire [15:0] BGVDT; +wire [10:0] SPAAD; +wire [7:0] SPADT; +wire [7:0] SCRPX, SCRPY; +wire [8:0] PALET; +ninjakun_video video ( + .RESET(RESET), + .VCLKx4(VCLKx4), + .VCLK(VCLK), + .PH(PH), + .PV(PV), + .PALAD(PALET), // Pixel Output (Palet Index) + .FGVAD(FGVAD), // FG + .FGVDT(FGVDT), + .BGVAD(BGVAD), // BG + .BGVDT(BGVDT), + .BGSCX(SCRPX), + .BGSCY(SCRPY), + .SPAAD(SPAAD), // Sprite + .SPADT(SPADT), + .VBLK(VBLK), + .DBGPD(1'b0), // Palet Display (for Debug) +// .sp_rom_addr(sp_rom_addr), +// .sp_rom_data(sp_rom_data), +// .fg_rom_addr(fg_rom_addr), +// .fg_rom_data(fg_rom_data), + .bg_rom_addr(bg_rom_addr), + .bg_rom_data(bg_rom_data) +); + +wire CS_PSG, CS_FGV, CS_BGV, CS_SPA, CS_PAL; +ninjakun_sadec sadec( + .CPADR(CPADR), + .CS_PSG(CS_PSG), + .CS_FGV(CS_FGV), + .CS_BGV(CS_BGV), + .CS_SPA(CS_SPA), + .CS_PAL(CS_PAL) +); + +wire [7:0] PSDAT, FGDAT, BGDAT, SPDAT, PLDAT; + +wire [9:0] BGOFS = CPADR[9:0]+{SCRPY[7:3],SCRPX[7:3]}; +wire [10:0] BGADR = {CPADR[10],BGOFS}; + +VDPRAM400x2 fgv( SHCLK, CPADR[10:0], CS_FGV & CPWRT, CPODT, FGDAT, VRCLK, FGVAD, FGVDT ); +VDPRAM400x2 bgv( SHCLK, BGADR , CS_BGV & CPWRT, CPODT, BGDAT, VRCLK, BGVAD, BGVDT ); +DPRAM800 spa( SHCLK, CPADR[10:0], CS_SPA & CPWRT, CPODT, SPDAT, VRCLK, SPAAD, 1'b0, 8'h0, SPADT ); +DPRAM200 pal( SHCLK, CPADR[ 8:0], CS_PAL & CPWRT, CPODT, PLDAT, VCLK, PALET, 1'b0, 8'h0, POUT ); + +dataselector_5D_8B cpxdsel( + .out(CPIDT), + .en0(CS_PSG), + .dt0(PSDAT), + .en1(CS_FGV), + .dt1(FGDAT), + .en2(CS_BGV), + .dt2(BGDAT), + .en3(CS_SPA), + .dt3(SPDAT), + .en4(CS_PAL), + .dt4(PLDAT) +); + +ninjakun_psg psg( + .AXSCLK(SHCLK), + .CLK(CLK3M), + .ADR(CPADR[1:0]), + .CS(CS_PSG), + .WR(CPWRT), + .ID(CPODT), + .OD(PSDAT), + .RESET(RESET), + .RD(CPRED), + .DSW1(DSW1), + .DSW2(DSW2), + .SCRPX(SCRPX), + .SCRPY(SCRPY), + .SNDO(SNDOUT) +); + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_irqgen.v b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_irqgen.v new file mode 100644 index 00000000..3fc16e62 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_irqgen.v @@ -0,0 +1,33 @@ +module ninjakun_irqgen +( + input CLK, + input VBLK, + + input IRQ0_ACK, + input IRQ1_ACK, + + output reg IRQ0, + output reg IRQ1 +); + +`define CYCLES 12500 // 1/240sec. + +reg pVBLK; +wire VBTG = VBLK & (pVBLK^VBLK); + +reg [13:0] cnt; +wire IRQ1_ACT = (cnt == 1); +wire CNTR_RST = (cnt == `CYCLES)|VBTG; + +always @( posedge CLK ) begin + if (VBTG) IRQ0 <= 1'b1; + if (IRQ1_ACT) IRQ1 <= 1'b1; + + if (IRQ0_ACK) IRQ0 <= 1'b0; + if (IRQ1_ACK) IRQ1 <= 1'b0; + + cnt <= CNTR_RST ? 0 : (cnt + 1'b1); + pVBLK <= VBLK; +end + +endmodule diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_main.v b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_main.v new file mode 100644 index 00000000..197d57a6 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_main.v @@ -0,0 +1,155 @@ +module ninjakun_main +( + input RESET, + input CLK24M, + input CLK3M, + input VBLK, + + input [7:0] CTR1, + input [7:0] CTR2, + + output [15:0] CPADR, + output [7:0] CPODT, + input [7:0] CPIDT, + output CPRED, + output CPWRT, + output [14:0] CPU1ADDR, + input [7:0] CPU1DT, + output [12:0] CPU2ADDR, + input [7:0] CPU2DT +); + +wire SHCLK = CLK24M; +wire INPCL = CLK24M; + +wire CP0IQ, CP0IQA; +wire CP1IQ, CP1IQA; +ninjakun_irqgen ninjakun_irqgen( + .CLK(CLK3M), + .VBLK(VBLK), + .IRQ0_ACK(CP0IQA), + .IRQ1_ACK(CP1IQA), + .IRQ0(CP0IQ), + .IRQ1(CP1IQ) +); + +wire CP0CL, CP1CL; +wire [15:0] CP0AD, CP1AD; +wire [7:0] CP0OD, CP1OD; +wire [7:0] CP0DT, CP1DT; +wire [7:0] CP0ID, CP1ID; +wire CP0RD, CP1RD; +wire CP0WR, CP1WR; +Z80IP cpu0( + .reset_in(RESET), + .clk(CP0CL), + .adr(CP0AD), + .data_in(CP0DT), + .data_out(CP0OD), + .rd(CP0RD), + .wr(CP0WR), + .intreq(CP0IQ), + .intack(CP0IQA) +); + +Z80IP cpu1( + .reset_in(RESET), + .clk(CP1CL), + .adr(CP1AD), + .data_in(CP1DT), + .data_out(CP1OD), + .rd(CP1RD), + .wr(CP1WR), + .intreq(CP1IQ), + .intack(CP1IQA) +); + +ninjakun_cpumux ioshare( + .SHCLK(SHCLK), + .CPADR(CPADR), + .CPODT(CPODT), + .CPIDT(CPIDT), + .CPRED(CPRED), + .CPWRT(CPWRT), + .CP0CL(CP0CL), + .CP0AD(CP0AD), + .CP0OD(CP0OD), + .CP0ID(CP0ID), + .CP0RD(CP0RD), + .CP0WR(CP0WR), + .CP1CL(CP1CL), + .CP1AD(CP1AD), + .CP1OD(CP1OD), + .CP1ID(CP1ID), + .CP1RD(CP1RD), + .CP1WR(CP1WR) +); + +wire CS_SH0, CS_SH1, CS_IN0, CS_IN1; +wire SYNWR0, SYNWR1; +ninjakun_adec adec( + .CP0AD(CP0AD), + .CP0WR(CP0WR), + .CP1AD(CP1AD), + .CP1WR(CP1WR), + .CS_IN0(CS_IN0), + .CS_IN1(CS_IN1), + .CS_SH0(CS_SH0), + .CS_SH1(CS_SH1), + .SYNWR0(SYNWR0), + .SYNWR1(SYNWR1) +); + + +wire [7:0] ROM0D, ROM1D; +assign CPU1ADDR = CP0AD[14:0]; +assign ROM0D = CPU1DT; +assign CPU2ADDR = CP1AD[12:0]; +assign ROM1D = CPU2DT; + +wire [7:0] SHDT0, SHDT1; +DPRAM800 shmem( + SHCLK, { CP0AD[10] ,CP0AD[9:0]}, CS_SH0 & CP0WR, CP0OD, SHDT0, + SHCLK, {(~CP1AD[10]),CP1AD[9:0]}, CS_SH1 & CP1WR, CP1OD, SHDT1 +); + +wire [7:0] INPD0, INPD1; +ninjakun_input inps( + .INPCL(INPCL), + .RESET(RESET), + .CTR1i(CTR1), // Control Panel (Negative Logic) + .CTR2i(CTR2), + .VBLK(VBLK), + .AD0(CP0AD[1:0]), + .OD0(CP0OD[7:6]), + .WR0(SYNWR0), + .AD1(CP1AD[1:0]), + .OD1(CP1OD[7:6]), + .WR1(SYNWR1), + .INPD0(INPD0), + .INPD1(INPD1) +); + +dataselector_3D_8B cdt0( + .out(CP0DT), + .df(CP0ID), + .en0(CS_IN0), + .dt0(INPD0), + .en1(CS_SH0), + .dt1(SHDT0), + .en2(~CP0AD[15]), + .dt2(ROM0D) +); + +dataselector_3D_8B cdt1( + .out(CP1DT), + .df(CP1ID), + .en0(CS_IN1), + .dt0(INPD1), + .en1(CS_SH1), + .dt1(SHDT1), + .en2(~CP1AD[15]), + .dt2(ROM1D) +); + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_psg.v b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_psg.v new file mode 100644 index 00000000..8cc26257 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_psg.v @@ -0,0 +1,94 @@ +module ninjakun_psg +( + input AXSCLK, + input CLK, + input [1:0] ADR, + input CS, + input WR, + input [7:0] ID, + output [7:0] OD, + input RESET, + input RD, + input [7:0] DSW1, + input [7:0] DSW2, + output [7:0] SCRPX, + output [7:0] SCRPY, + output [15:0] SNDO +); + +wire [7:0] OD0, OD1; +assign OD = ADR[1] ? OD1 : OD0; + +reg [7:0] SA0, SB0, SC0; wire [7:0] S0x; wire [1:0] S0c; +reg [7:0] SA1, SB1, SC1; wire [7:0] S1x; wire [1:0] S1c; + +reg [1:0] encnt; +reg ENA; +always @(posedge AXSCLK) begin + ENA <= (encnt==0); + encnt <= encnt+1; + case (S0c) + 2'd0: SA0 <= S0x; + 2'd1: SB0 <= S0x; + 2'd2: SC0 <= S0x; + default:; + endcase + case (S1c) + 2'd0: SA1 <= S1x; + 2'd1: SB1 <= S1x; + 2'd2: SC1 <= S1x; + default:; + endcase +end + +wire psgxad = ~ADR[0]; +wire psg0cs = CS & (~ADR[1]); +wire psg0bd = psg0cs & (WR|psgxad); +wire psg0bc = psg0cs & ((~WR)|psgxad); + +wire psg1cs = CS & ADR[1]; +wire psg1bd = psg1cs & (WR|psgxad); +wire psg1bc = psg1cs & ((~WR)|psgxad); + +YM2149 psg0( + .I_DA(ID), + .O_DA(OD0), + .I_A9_L(~psg0cs), + .I_BDIR(psg0bd), + .I_BC1(psg0bc), + .I_A8(1'b1), + .I_BC2(1'b1), + .I_SEL_L(1'b0), + .O_AUDIO(S0x), + .O_CHAN(S0c), + .I_IOA(DSW1), + .I_IOB(DSW2), + .ENA(ENA), + .RESET_L(~RESET), + .CLK(AXSCLK) +); + +YM2149 psg1( + .I_DA(ID), + .O_DA(OD1), + .I_A9_L(~psg1cs), + .I_BDIR(psg1bd), + .I_BC1(psg1bc), + .I_A8(1'b1), + .I_BC2(1'b1), + .I_SEL_L(1'b0), + .O_AUDIO(S1x), + .O_CHAN(S1c), + .I_IOA(8'd0), + .I_IOB(8'd0), + .O_IOA(SCRPX), + .O_IOB(SCRPY), + .ENA(ENA), + .RESET_L(~RESET), + .CLK(AXSCLK) +); + +wire [11:0] SND = SA0+SB0+SC0+SA1+SB1+SC1; +assign SNDO = {SND,SND[3:0]}; + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_sadec.v b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_sadec.v new file mode 100644 index 00000000..89bd4b14 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_sadec.v @@ -0,0 +1,19 @@ +// Copyright (c) 2011 MiSTer-X + +module ninjakun_sadec +( + input [15:0] CPADR, + output CS_PSG, + output CS_FGV, + output CS_BGV, + output CS_SPA, + output CS_PAL +); + +assign CS_PSG = ( CPADR[15: 2] == 14'b1000_0000_0000_00 ); +assign CS_FGV = ( CPADR[15:11] == 5'b1100_0 ); +assign CS_BGV = ( CPADR[15:11] == 5'b1100_1 ); +assign CS_SPA = ( CPADR[15:11] == 5'b1101_0 ); +assign CS_PAL = ( CPADR[15:11] == 5'b1101_1 ); + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_sp.v b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_sp.v new file mode 100644 index 00000000..479f7ded --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_sp.v @@ -0,0 +1,216 @@ +// Copyright (c) 2011,19 MiSTer-X + +module ninjakun_sp +( + input VCLKx4, + input VCLK, + + input [8:0] PH, + input [8:0] PV, + + output [10:0] SPAAD, + input [7:0] SPADT, + + output [12:0] SPCAD, + input [31:0] SPCDT, + input SPCFT, + + output [8:0] SPOUT +); + +wire WPEN; +wire [8:0] WPAD; +wire [7:0] WPIX; + +reg [7:0] POUT; +wire [3:0] OTHP = (POUT[3:0]==1) ? POUT[7:4] : POUT[3:0]; + +reg [9:0] radr0=0,radr1=1; +wire [7:0] POUTi; +LineDBuf ldbuf( + VCLKx4, radr0, POUTi, (radr0==radr1), + ~VCLKx4, {PV[0],WPAD}, WPIX, WPEN +); +always @(posedge VCLK) radr0 <= {~PV[0],PH}; +always @(negedge VCLK) begin + if (radr0!=radr1) POUT <= POUTi; + radr1 <= radr0; +end + +NINJAKUN_SPENG eng ( + VCLKx4, PH, PV, + SPAAD, SPADT, + SPCAD, SPCDT, SPCFT, + WPAD, WPIX, WPEN +); + +assign SPOUT = { 5'h0, OTHP }; + +endmodule + + +module NINJAKUN_SPENG +( + input VCLKx4, + + input [8:0] PH, + input [8:0] PV, + + output [10:0] SPAAD, + input [7:0] SPADT, + + output [12:0] SPCAD, + input [31:0] SPCDT, + input SPCFT, + + output [8:0] WPAD, + output [7:0] WPIX, + output WPEN +); + +reg [5:0] SPRNO; +reg [1:0] SPRIX; +assign SPAAD = {SPRNO, 3'h0, SPRIX}; + +reg [7:0] ATTR; +wire [3:0] PALNO = ATTR[3:0]; +wire FLIPH = ATTR[4]; +wire FLIPV = ATTR[5]; +wire XPOSH = ATTR[6]; +wire DSABL = ATTR[7]; + +reg [7:0] YPOS; +reg [7:0] NV; +wire [7:0] HV = NV-YPOS; +wire [3:0] LV = {4{FLIPV}}^(HV[3:0]); +wire YHIT = (HV[7:4]==4'b1111) & (~DSABL); + +reg [7:0] XPOS; +reg [4:0] WP; +wire [3:0] WOFS = {4{FLIPH}}^(WP[3:0]); +assign WPAD = {1'b0,XPOS}-{XPOSH,8'h0}+WOFS-1; +assign WPEN = ~(WP[4]|(WPIX[3:0]==0)); + +reg [7:0] PTNO; +reg CRS; +assign SPCAD = {PTNO, LV[3], CRS, LV[2:0]}; + +function [3:0] XOUT; +input [2:0] N; +input [31:0] CDT; + case(N) + 0: XOUT = CDT[7:4]; + 1: XOUT = CDT[3:0]; + 2: XOUT = CDT[15:12]; + 3: XOUT = CDT[11:8]; + 4: XOUT = CDT[23:20]; + 5: XOUT = CDT[19:16]; + 6: XOUT = CDT[31:28]; + 7: XOUT = CDT[27:24]; + endcase +endfunction +reg [31:0] CDT0, CDT1; +assign WPIX = {PALNO, XOUT(WP[2:0],WP[3] ? CDT1 : CDT0)}; + + +`define WAIT 0 +`define FETCH0 1 +`define FETCH1 2 +`define FETCH2 3 +`define FETCH3 4 +`define FETCH4 5 +`define DRAW 6 +`define NEXT 7 + +reg [2:0] STATE; +always @( posedge VCLKx4 ) begin + case (STATE) + + `WAIT: begin + WP <= 16; + if (~PH[8]) begin + NV <= PV+17; + SPRNO <= 0; + SPRIX <= 2; + STATE <= `FETCH0; + end + end + + `FETCH0: begin + YPOS <= SPADT; + SPRIX <= 3; + STATE <= `FETCH1; + end + `FETCH1: begin + ATTR = SPADT; /* ATTR must block assign */ + SPRIX <= 0; + STATE <= YHIT ? `FETCH2 : `NEXT; + end + + `FETCH2: begin + PTNO <= SPADT; + SPRIX <= 1; + STATE <= `FETCH3; + end + `FETCH3: begin + if (SPCFT) begin // Wait for CHRROM fetch cycle + XPOS <= SPADT; + CRS <= 0; + STATE <= `FETCH4; + end + end + `FETCH4: begin + if (SPCFT) begin // Fetch CHRROM data (16pixels) + if (~CRS) begin + CDT0 <= SPCDT; + CRS <= 1; + end + else begin + CDT1 <= SPCDT; + WP <= 0; + STATE <= `DRAW; + end + end + end + + `DRAW: begin + WP <= WP+1; + if (WP[4]) STATE <= `NEXT; + end + + `NEXT: begin + CDT0 <= 0; CDT1 <= 0; + SPRNO <= SPRNO+1; + SPRIX <= 2; + STATE <= (SPRNO==63) ? `WAIT : `FETCH0; + end + + endcase +end + +endmodule + + +module LineDBuf +( + input rC, + input [9:0] rA, + output [7:0] rD, + input rE, + + input wC, + input [9:0] wA, + input [7:0] wD, + input wE +); + +DPRAM1024 ram( + rA, wA, + rC, wC, + 8'h0, wD, + rE, wE, + rD +); + +endmodule + diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_top.v b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_top.v new file mode 100644 index 00000000..0f3a70fa --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_top.v @@ -0,0 +1,124 @@ +/*********************************************** + "FPGA NinjaKun" for MiSTer + + Copyright (c) 2011,19 MiSTer-X +************************************************/ +/* +ROM_START( ninjakun ) + ROM_REGION( 0x8000, "maincpu", 0 ) + ROM_LOAD( "ninja-1.7a", 0x0000, 0x02000, CRC(1c1dc141) SHA1(423d3ed35e73a8d5bfce075a889b0322b207bd0d) ) + ROM_LOAD( "ninja-2.7b", 0x2000, 0x02000, CRC(39cc7d37) SHA1(7f0d0e1e92cb6a57f15eb7fc51a67112f1c5fc8e) ) + ROM_LOAD( "ninja-3.7d", 0x4000, 0x02000, CRC(d542bfe3) SHA1(3814d8f5b1acda21438fff4f71670fa653dc7b30) ) + ROM_LOAD( "ninja-4.7e", 0x6000, 0x02000, CRC(a57385c6) SHA1(77925a281e64889bfe967c3d42a388529aaf7eb6) ) + + ROM_REGION( 0x2000, "sub", 0 ) + ROM_LOAD( "ninja-5.7h", 0x0000, 0x02000, CRC(164a42c4) SHA1(16b434b33b76b878514f67c23315d4c6da7bfc9e) ) + + ROM_REGION( 0x08000, "gfx1", 0 ) + ROM_LOAD16_BYTE( "ninja-6.7n", 0x0000, 0x02000, CRC(a74c4297) SHA1(87184d14c67331f2c8a2412e28f31427eddae799) ) + ROM_LOAD16_BYTE( "ninja-7.7p", 0x0001, 0x02000, CRC(53a72039) SHA1(d77d608ce9388a8956831369badd88a8eda8e102) ) + ROM_LOAD16_BYTE( "ninja-8.7s", 0x4000, 0x02000, CRC(4a99d857) SHA1(6aadb6a5c721a161a5c1bef5569c1e323e380cff) ) + ROM_LOAD16_BYTE( "ninja-9.7t", 0x4001, 0x02000, CRC(dede49e4) SHA1(8ce4bc02ec583b3885ca63fb5e2d5dad185fe192) ) + + ROM_REGION( 0x08000, "gfx2", 0 ) + ROM_LOAD16_BYTE( "ninja-10.2c", 0x0000, 0x02000, CRC(0d55664a) SHA1(955a607b4401ce9f3f807d53833a766152b0ef9b) ) + ROM_LOAD16_BYTE( "ninja-11.2d", 0x0001, 0x02000, CRC(12ff9597) SHA1(10b572844ab32e3ae54abe3600fecc1a811ac713) ) + ROM_LOAD16_BYTE( "ninja-12.4c", 0x4000, 0x02000, CRC(e9b75807) SHA1(cf4c8ac962f785e9de5502df58eab9b3725aaa28) ) + ROM_LOAD16_BYTE( "ninja-13.4d", 0x4001, 0x02000, CRC(1760ed2c) SHA1(ee4c8efcce483c8051873714856824a1a1e14b61) ) +ROM_END*/ + +module ninjakun_top +( + input RESET, // RESET + input MCLK, // Master Clock (48.0MHz) + input [7:0] CTR1, // Control Panel + input [7:0] CTR2, + input [7:0] DSW1, // DipSW + input [7:0] DSW2, + input [8:0] PH, // PIXEL H + input [8:0] PV, // PIXEL V + output PCLK, // PIXEL CLOCK + output [7:0] POUT, // PIXEL OUT + output [15:0] SNDOUT, // Sound Output (LPCM unsigned 16bits) + output [14:0] CPU1ADDR, + input [7:0] CPU1DT, + output [12:0] CPU2ADDR, + input [7:0] CPU2DT, +// output [12:0] sp_rom_addr, +// input [31:0] sp_rom_data, +// output [12:0] fg_rom_addr, +// input [31:0] fg_rom_data, + output [12:0] bg_rom_addr, + input [31:0] bg_rom_data +); + +wire VCLKx4, VCLK; +wire VRAMCL, CLK24M, CLK12M, CLK6M, CLK3M; +ninjakun_clkgen ninjakun_clkgen( + .MCLK(MCLK), // 48MHz + .VCLKx4(VCLKx4), + .VCLK(VCLK), + .VRAMCL(VRAMCL), + .PCLK(PCLK), + .CLK24M(CLK24M), + .CLK12M(CLK12M), + .CLK6M(CLK6M), + .CLK3M(CLK3M) +); + +wire [15:0] CPADR; +wire [7:0] CPODT, CPIDT; +wire CPRED, CPWRT, VBLK; +ninjakun_main ninjakun_main( + .RESET(RESET), + .CLK24M(CLK24M), + .CLK3M(CLK3M), + .VBLK(VBLK), + .CTR1(CTR1), + .CTR2(CTR2), + .CPADR(CPADR), + .CPODT(CPODT), + .CPIDT(CPIDT), + .CPRED(CPRED), + .CPWRT(CPWRT), + .CPU1ADDR(CPU1ADDR), + .CPU1DT(CPU1DT), + .CPU2ADDR(CPU2ADDR), + .CPU2DT(CPU2DT) +); + + +wire [9:0] FGVAD, BGVAD; +wire [15:0] FGVDT, BGVDT; +wire [10:0] SPAAD; +wire [7:0] SPADT; +wire [8:0] PALET; +wire [7:0] SCRPX, SCRPY; +ninjakun_io_video ninjakun_io_video( + .SHCLK(CLK24M), + .CLK3M(CLK3M), + .RESET(RESET), + .VRCLK(VRAMCL), + .VCLKx4(VCLKx4), + .VCLK(VCLK), + .PH(PH), + .PV(PV), + .CPADR(CPADR), + .CPODT(CPODT), + .CPIDT(CPIDT), + .CPRED(CPRED), + .CPWRT(CPWRT), + .DSW1(DSW1), + .DSW2(DSW2), + .VBLK(VBLK), + .POUT(POUT), + .SNDOUT(SNDOUT), +// .sp_rom_addr(sp_rom_addr), +// .sp_rom_data(sp_rom_data), +// .fg_rom_addr(fg_rom_addr), +// .fg_rom_data(fg_rom_data), + .bg_rom_addr(bg_rom_addr), + .bg_rom_data(bg_rom_data) +); + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_video.v b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_video.v new file mode 100644 index 00000000..043f5d1a --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/ninjakun_video.v @@ -0,0 +1,142 @@ +// Copyright (c) 2011,19 MiSTer-X + +module ninjakun_video +( + input RESET, + input VCLKx4, + input VCLK, + + input [8:0] PH, + input [8:0] PV, + + output [8:0] PALAD, // Pixel Output (Palet Index) + + output [9:0] FGVAD, // FG + input [15:0] FGVDT, + + output [9:0] BGVAD, // BG + input [15:0] BGVDT, + input [7:0] BGSCX, + input [7:0] BGSCY, + + output [10:0] SPAAD, // Sprite + input [7:0] SPADT, + + output VBLK, + input DBGPD, // Palet Display (for Debug) +// output [12:0] sp_rom_addr, +// input [31:0] sp_rom_data, +// output [12:0] fg_rom_addr, +// input [31:0] fg_rom_data, + output [12:0] bg_rom_addr, + input [31:0] bg_rom_data +); + +assign VBLK = (PV>=193); + +// ROMs +wire SPCFT = 1'b1; +wire [12:0] SPCAD; +wire [31:0] SPCDT; + +wire [12:0] FGCAD; +wire [31:0] FGCDT; + +wire [12:0] BGCAD; +wire [31:0] BGCDT; +wire sc_acc = 0; + +//NJFGROM sprom(~VCLKx4, SPCAD, SPCDT, ROMCL, ROMAD, ROMDT, ROMEN); +//NJFGROM fgrom( ~VCLK, FGCAD, FGCDT, ROMCL, ROMAD, ROMDT, ROMEN); +//NJBGROM bgrom( ~VCLK, BGCAD, BGCDT, ROMCL, ROMAD, ROMDT, ROMEN); +//assign sp_rom_addr = SPCAD; +//assign SPCDT = sp_rom_data; +//assign fg_rom_addr = FGCAD; +//assign FGCDT = fg_rom_data; +/* +static GFXDECODE_START( gfx_ninjakun ) + GFXDECODE_ENTRY( "gfx1", 0, layout16x16, 0x200, 16 ) // sprites + GFXDECODE_ENTRY( "gfx1", 0, layout8x8, 0x000, 16 ) // fg tiles + GFXDECODE_ENTRY( "gfx2", 0, layout8x8, 0x100, 16 ) // bg tiles +GFXDECODE_END*/ + +assign bg_rom_addr = BGCAD; +assign BGCDT = bg_rom_data; + +fg1_rom fg1_rom ( + .clk(~VCLKx4),//if sprite ? ~VCLKx4 : ~VCLK + .addr(SPCAD),//if sprite ? SPCAD : FGCAD + .data(SPCDT[7:0])//if sprite ? SPCDT[7:0] : FGCDT[7:0] +); + +fg2_rom fg2_rom ( + .clk(~VCLKx4), + .addr(SPCAD), + .data(SPCDT[15:8]) +); + +fg3_rom fg3_rom ( + .clk(~VCLKx4), + .addr(SPCAD), + .data(SPCDT[23:16]) +); + +fg4_rom fg4_rom ( + .clk(~VCLKx4), + .addr(SPCAD), + .data(SPCDT[31:24]) +); + +// Fore-Ground Scanline Generator +wire FGPRI; +wire [8:0] FGOUT; +ninjakun_fg fg( + VCLK, + PH, PV, + FGVAD, FGVDT, + FGCAD, FGCDT, + {FGPRI, FGOUT} +); +wire FGOPQ =(FGOUT[3:0]!=0); +wire FGPPQ = FGOPQ & (~FGPRI); + +// Back-Ground Scanline Generator +wire [8:0] BGOUT; +ninjakun_bg bg( + VCLK, + PH, PV, + BGSCX, BGSCY, + BGVAD, BGVDT, + BGCAD, BGCDT, + BGOUT +); + +// Sprite Scanline Generator +wire [8:0] SPOUT; +ninjakun_sp sp( + VCLKx4, VCLK, + PH, PV, + SPAAD, SPADT, + SPCAD, SPCDT, SPCFT, + SPOUT +); +wire SPOPQ = (SPOUT[3:0]!=0); + +// Palet Display (for Debug) +wire [8:0] PDOUT = (PV[7]|PV[8]) ? 0 : {PV[6:2],PH[7:4]}; + +// Color Mixer +dataselector_4D_9B dataselector_4D_9B( + .OUT(PALAD), + .EN1(DBGPD), + .IN1(PDOUT), + .EN2(FGPPQ), + .IN2(FGOUT), + .EN3(SPOPQ), + .IN3(SPOUT), + .EN4(FGOPQ), + .IN4(FGOUT), + .IND(BGOUT) +); + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/pll.v b/Arcade_MiST/NinjaKun_MiST/rtl/pll.v new file mode 100644 index 00000000..d8ab4161 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/pll.v @@ -0,0 +1,337 @@ +// megafunction wizard: %ALTPLL% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altpll + +// ============================================================ +// File Name: pll.v +// Megafunction Name(s): +// altpll +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.4 Build 182 03/12/2014 Patches 4.26 SJ Web Edition +// ************************************************************ + + +//Copyright (C) 1991-2014 Altera Corporation +//Your use of Altera Corporation's design tools, logic functions +//and other software and tools, and its AMPP partner logic +//functions, and any output files from any of the foregoing +//(including device programming or simulation files), and any +//associated documentation or information are expressly subject +//to the terms and conditions of the Altera Program License +//Subscription Agreement, Altera MegaCore Function License +//Agreement, or other applicable license agreement, including, +//without limitation, that your use is for the sole purpose of +//programming logic devices manufactured by Altera and sold by +//Altera or its authorized distributors. Please refer to the +//applicable agreement for further details. + + +// synopsys translate_off +`timescale 1 ps / 1 ps +// synopsys translate_on +module pll ( + inclk0, + c0, + c1, + locked); + + input inclk0; + output c0; + output c1; + output locked; + + wire [4:0] sub_wire0; + wire sub_wire2; + wire [0:0] sub_wire6 = 1'h0; + wire [0:0] sub_wire3 = sub_wire0[0:0]; + wire [1:1] sub_wire1 = sub_wire0[1:1]; + wire c1 = sub_wire1; + wire locked = sub_wire2; + wire c0 = sub_wire3; + wire sub_wire4 = inclk0; + wire [1:0] sub_wire5 = {sub_wire6, sub_wire4}; + + altpll altpll_component ( + .inclk (sub_wire5), + .clk (sub_wire0), + .locked (sub_wire2), + .activeclock (), + .areset (1'b0), + .clkbad (), + .clkena ({6{1'b1}}), + .clkloss (), + .clkswitch (1'b0), + .configupdate (1'b0), + .enable0 (), + .enable1 (), + .extclk (), + .extclkena ({4{1'b1}}), + .fbin (1'b1), + .fbmimicbidir (), + .fbout (), + .fref (), + .icdrclk (), + .pfdena (1'b1), + .phasecounterselect ({4{1'b1}}), + .phasedone (), + .phasestep (1'b1), + .phaseupdown (1'b1), + .pllena (1'b1), + .scanaclr (1'b0), + .scanclk (1'b0), + .scanclkena (1'b1), + .scandata (1'b0), + .scandataout (), + .scandone (), + .scanread (1'b0), + .scanwrite (1'b0), + .sclkout0 (), + .sclkout1 (), + .vcooverrange (), + .vcounderrange ()); + defparam + altpll_component.bandwidth_type = "AUTO", + altpll_component.clk0_divide_by = 9, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 16, + altpll_component.clk0_phase_shift = "0", + altpll_component.clk1_divide_by = 9, + altpll_component.clk1_duty_cycle = 50, + altpll_component.clk1_multiply_by = 2, + altpll_component.clk1_phase_shift = "0", + altpll_component.compensate_clock = "CLK0", + altpll_component.inclk0_input_frequency = 37037, + altpll_component.intended_device_family = "Cyclone III", + altpll_component.lpm_hint = "CBX_MODULE_PREFIX=pll", + altpll_component.lpm_type = "altpll", + altpll_component.operation_mode = "NORMAL", + altpll_component.pll_type = "AUTO", + altpll_component.port_activeclock = "PORT_UNUSED", + altpll_component.port_areset = "PORT_UNUSED", + altpll_component.port_clkbad0 = "PORT_UNUSED", + altpll_component.port_clkbad1 = "PORT_UNUSED", + altpll_component.port_clkloss = "PORT_UNUSED", + altpll_component.port_clkswitch = "PORT_UNUSED", + altpll_component.port_configupdate = "PORT_UNUSED", + altpll_component.port_fbin = "PORT_UNUSED", + altpll_component.port_inclk0 = "PORT_USED", + altpll_component.port_inclk1 = "PORT_UNUSED", + altpll_component.port_locked = "PORT_USED", + altpll_component.port_pfdena = "PORT_UNUSED", + altpll_component.port_phasecounterselect = "PORT_UNUSED", + altpll_component.port_phasedone = "PORT_UNUSED", + altpll_component.port_phasestep = "PORT_UNUSED", + altpll_component.port_phaseupdown = "PORT_UNUSED", + altpll_component.port_pllena = "PORT_UNUSED", + altpll_component.port_scanaclr = "PORT_UNUSED", + altpll_component.port_scanclk = "PORT_UNUSED", + altpll_component.port_scanclkena = "PORT_UNUSED", + altpll_component.port_scandata = "PORT_UNUSED", + altpll_component.port_scandataout = "PORT_UNUSED", + altpll_component.port_scandone = "PORT_UNUSED", + altpll_component.port_scanread = "PORT_UNUSED", + altpll_component.port_scanwrite = "PORT_UNUSED", + altpll_component.port_clk0 = "PORT_USED", + altpll_component.port_clk1 = "PORT_USED", + altpll_component.port_clk2 = "PORT_UNUSED", + altpll_component.port_clk3 = "PORT_UNUSED", + altpll_component.port_clk4 = "PORT_UNUSED", + altpll_component.port_clk5 = "PORT_UNUSED", + altpll_component.port_clkena0 = "PORT_UNUSED", + altpll_component.port_clkena1 = "PORT_UNUSED", + altpll_component.port_clkena2 = "PORT_UNUSED", + altpll_component.port_clkena3 = "PORT_UNUSED", + altpll_component.port_clkena4 = "PORT_UNUSED", + altpll_component.port_clkena5 = "PORT_UNUSED", + altpll_component.port_extclk0 = "PORT_UNUSED", + altpll_component.port_extclk1 = "PORT_UNUSED", + altpll_component.port_extclk2 = "PORT_UNUSED", + altpll_component.port_extclk3 = "PORT_UNUSED", + altpll_component.self_reset_on_loss_lock = "OFF", + altpll_component.width_clock = 5; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +// Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +// Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +// Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +// Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +// Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +// Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +// Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +// Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +// Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +// Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +// Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +// Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "1" +// Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "1" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "48.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "6.000000" +// Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +// Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +// Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +// Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +// Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +// Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +// Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "1" +// Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "deg" +// Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "1" +// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "1" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "48.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "6.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +// Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +// Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +// Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +// Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +// Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +// Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +// Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +// Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +// Retrieval info: PRIVATE: SPREAD_USE STRING "0" +// Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +// Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +// Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" +// Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +// Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: USE_CLK0 STRING "1" +// Retrieval info: PRIVATE: USE_CLK1 STRING "1" +// Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +// Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +// Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +// Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "9" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "16" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9" +// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "2" +// Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +// Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +// Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +// Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +// Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +// Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +// Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +// Retrieval info: CONNECT: locked 0 0 0 0 @locked 0 0 0 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf +// Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/rom/make_rom.bat b/Arcade_MiST/NinjaKun_MiST/rtl/rom/make_rom.bat new file mode 100644 index 00000000..43216a17 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/rom/make_rom.bat @@ -0,0 +1,13 @@ +copy /b ninja-1.7a + ninja-2.7b + ninja-3.7d + ninja-4.7e cpu1_rom.bin +copy /b ninja-5.7h cpu2_rom.bin +copy /b ninja-10.2c + ninja-11.2d + ninja-12.4c + ninja-13.4d bg.bin +copy /b cpu1_rom.bin + cpu2_rom.bin + bg.bin NINJAKUN.ROM + + +make_vhdl_prom.exe ninja-6.7n fg1_rom.vhd +make_vhdl_prom.exe ninja-7.7p fg2_rom.vhd +make_vhdl_prom.exe ninja-8.7s fg3_rom.vhd +make_vhdl_prom.exe ninja-9.7t fg4_rom.vhd + + +pause \ No newline at end of file diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/rom/make_vhdl_prom.exe b/Arcade_MiST/NinjaKun_MiST/rtl/rom/make_vhdl_prom.exe new file mode 100644 index 0000000000000000000000000000000000000000..1e5618bf9417eaeb90556e3021a78e9860a815e8 GIT binary patch literal 119861 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 +// Copyright (c) 2019 Gyorgy Szombathelyi +// +// This source file is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This source file is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +module sdram ( + + // interface to the MT48LC16M16 chip + inout reg [15:0] SDRAM_DQ, // 16 bit bidirectional data bus + output reg [12:0] SDRAM_A, // 13 bit multiplexed address bus + output reg SDRAM_DQML, // two byte masks + output reg SDRAM_DQMH, // two byte masks + output reg [1:0] SDRAM_BA, // two banks + output SDRAM_nCS, // a single chip select + output SDRAM_nWE, // write enable + output SDRAM_nRAS, // row address select + output SDRAM_nCAS, // columns address select + + // cpu/chipset interface + input init_n, // init signal after FPGA config to initialize RAM + input clk, // sdram clock + + input port1_req, + output reg port1_ack, + input port1_we, + input [23:1] port1_a, + input [1:0] port1_ds, + input [15:0] port1_d, + output reg [15:0] port1_q, + + input [16:1] cpu1_addr, + output reg [15:0] cpu1_q, + input [16:1] cpu2_addr, + output reg [15:0] cpu2_q, + + input port2_req, + output reg port2_ack, + input port2_we, + input [23:1] port2_a, + input [1:0] port2_ds, + input [15:0] port2_d, + output reg [31:0] port2_q, + + input [16:2] sp_addr, + output reg [31:0] sp_q +); + +localparam RASCAS_DELAY = 3'd2; // tRCD=20ns -> 2 cycles@<100MHz +localparam BURST_LENGTH = 3'b001; // 000=1, 001=2, 010=4, 011=8 +localparam ACCESS_TYPE = 1'b0; // 0=sequential, 1=interleaved +localparam CAS_LATENCY = 3'd2; // 2/3 allowed +localparam OP_MODE = 2'b00; // only 00 (standard operation) allowed +localparam NO_WRITE_BURST = 1'b1; // 0= write burst enabled, 1=only single access write + +localparam MODE = { 3'b000, NO_WRITE_BURST, OP_MODE, CAS_LATENCY, ACCESS_TYPE, BURST_LENGTH}; + +// 64ms/8192 rows = 7.8us -> 842 cycles@108MHz +localparam RFRSH_CYCLES = 10'd842; + +// --------------------------------------------------------------------- +// ------------------------ cycle state machine ------------------------ +// --------------------------------------------------------------------- + +/* + SDRAM state machine for 2 bank interleaved access + 1 word burst, CL2 +cmd issued registered + 0 RAS0 cas1 - data0 read burst terminated + 1 ras0 + 2 data1 returned + 3 CAS0 data1 returned + 4 RAS1 cas0 + 5 ras1 + 6 CAS1 data0 returned +*/ + +localparam STATE_RAS0 = 3'd0; // first state in cycle +localparam STATE_RAS1 = 3'd4; // Second ACTIVE command after RAS0 + tRRD (15ns) +localparam STATE_CAS0 = STATE_RAS0 + RASCAS_DELAY + 1'd1; // CAS phase - 3 +localparam STATE_CAS1 = STATE_RAS1 + RASCAS_DELAY; // CAS phase - 6 +localparam STATE_READ0 = 3'd0;// STATE_CAS0 + CAS_LATENCY + 2'd2; // 7 +localparam STATE_READ1 = 3'd3; +localparam STATE_DS1b = 3'd0; +localparam STATE_READ1b = 3'd4; +localparam STATE_LAST = 3'd6; + +reg [2:0] t; + +always @(posedge clk) begin + t <= t + 1'd1; + if (t == STATE_LAST) t <= STATE_RAS0; +end + +// --------------------------------------------------------------------- +// --------------------------- startup/reset --------------------------- +// --------------------------------------------------------------------- + +// wait 1ms (32 8Mhz cycles) after FPGA config is done before going +// into normal operation. Initialize the ram in the last 16 reset cycles (cycles 15-0) +reg [4:0] reset; +reg init = 1'b1; +always @(posedge clk, negedge init_n) begin + if(!init_n) begin + reset <= 5'h1f; + init <= 1'b1; + end else begin + if((t == STATE_LAST) && (reset != 0)) reset <= reset - 5'd1; + init <= !(reset == 0); + end +end + +// --------------------------------------------------------------------- +// ------------------ generate ram control signals --------------------- +// --------------------------------------------------------------------- + +// all possible commands +localparam CMD_INHIBIT = 4'b1111; +localparam CMD_NOP = 4'b0111; +localparam CMD_ACTIVE = 4'b0011; +localparam CMD_READ = 4'b0101; +localparam CMD_WRITE = 4'b0100; +localparam CMD_BURST_TERMINATE = 4'b0110; +localparam CMD_PRECHARGE = 4'b0010; +localparam CMD_AUTO_REFRESH = 4'b0001; +localparam CMD_LOAD_MODE = 4'b0000; + +reg [3:0] sd_cmd; // current command sent to sd ram +reg [15:0] sd_din; +// drive control signals according to current command +assign SDRAM_nCS = sd_cmd[3]; +assign SDRAM_nRAS = sd_cmd[2]; +assign SDRAM_nCAS = sd_cmd[1]; +assign SDRAM_nWE = sd_cmd[0]; + +reg [24:1] addr_latch[2]; +reg [24:1] addr_latch_next[2]; +reg [16:1] addr_last[2]; +reg [16:2] addr_last2[2]; +reg [15:0] din_latch[2]; +reg [1:0] oe_latch; +reg [1:0] we_latch; +reg [1:0] ds[2]; + +reg port1_state; +reg port2_state; + +localparam PORT_NONE = 2'd0; +localparam PORT_CPU1 = 2'd1; +localparam PORT_CPU2 = 2'd2; +localparam PORT_SP = 2'd1; +localparam PORT_REQ = 2'd3; + +reg [1:0] next_port[2]; +reg [1:0] port[2]; + +reg refresh; +reg [10:0] refresh_cnt; +wire need_refresh = (refresh_cnt >= RFRSH_CYCLES); + +// PORT1: bank 0,1 +always @(*) begin + if (refresh) begin + next_port[0] = PORT_NONE; + addr_latch_next[0] = addr_latch[0]; + end else if (port1_req ^ port1_state) begin + next_port[0] = PORT_REQ; + addr_latch_next[0] = { 1'b0, port1_a }; + end else if (cpu1_addr != addr_last[PORT_CPU1]) begin + next_port[0] = PORT_CPU1; + addr_latch_next[0] = { 8'd0, cpu1_addr }; + end else if (cpu2_addr != addr_last[PORT_CPU2]) begin + next_port[0] = PORT_CPU2; + addr_latch_next[0] = { 8'd0, cpu2_addr }; + end else begin + next_port[0] = PORT_NONE; + addr_latch_next[0] = addr_latch[0]; + end +end + +// PORT1: bank 2,3 +always @(*) begin + if (port2_req ^ port2_state) begin + next_port[1] = PORT_REQ; + addr_latch_next[1] = { 1'b1, port2_a }; + end else if (sp_addr != addr_last2[PORT_SP]) begin + next_port[1] = PORT_SP; + addr_latch_next[1] = { 1'b1, 7'd0, sp_addr, 1'b0 }; + end else begin + next_port[1] = PORT_NONE; + addr_latch_next[1] = addr_latch[1]; + end +end + +always @(posedge clk) begin + + // permanently latch ram data to reduce delays + sd_din <= SDRAM_DQ; + SDRAM_DQ <= 16'bZZZZZZZZZZZZZZZZ; + { SDRAM_DQMH, SDRAM_DQML } <= 2'b11; + sd_cmd <= CMD_NOP; // default: idle + refresh_cnt <= refresh_cnt + 1'd1; + + if(init) begin + // initialization takes place at the end of the reset phase + if(t == STATE_RAS0) begin + + if(reset == 15) begin + sd_cmd <= CMD_PRECHARGE; + SDRAM_A[10] <= 1'b1; // precharge all banks + end + + if(reset == 10 || reset == 8) begin + sd_cmd <= CMD_AUTO_REFRESH; + end + + if(reset == 2) begin + sd_cmd <= CMD_LOAD_MODE; + SDRAM_A <= MODE; + SDRAM_BA <= 2'b00; + end + end + end else begin + // RAS phase + // bank 0,1 + if(t == STATE_RAS0) begin + addr_latch[0] <= addr_latch_next[0]; + port[0] <= next_port[0]; + { oe_latch[0], we_latch[0] } <= 2'b00; + + if (next_port[0] != PORT_NONE) begin + sd_cmd <= CMD_ACTIVE; + SDRAM_A <= addr_latch_next[0][22:10]; + SDRAM_BA <= addr_latch_next[0][24:23]; + addr_last[next_port[0]] <= addr_latch_next[0][16:1]; + if (next_port[0] == PORT_REQ) begin + { oe_latch[0], we_latch[0] } <= { ~port1_we, port1_we }; + ds[0] <= port1_ds; + din_latch[0] <= port1_d; + port1_state <= port1_req; + end else begin + { oe_latch[0], we_latch[0] } <= 2'b10; + ds[0] <= 2'b11; + end + end + end + + // bank 2,3 + if(t == STATE_RAS1) begin + refresh <= 1'b0; + addr_latch[1] <= addr_latch_next[1]; + { oe_latch[1], we_latch[1] } <= 2'b00; + port[1] <= next_port[1]; + + if (next_port[1] != PORT_NONE) begin + sd_cmd <= CMD_ACTIVE; + SDRAM_A <= addr_latch_next[1][22:10]; + SDRAM_BA <= addr_latch_next[1][24:23]; + addr_last2[next_port[1]] <= addr_latch_next[1][16:2]; + if (next_port[1] == PORT_REQ) begin + { oe_latch[1], we_latch[1] } <= { ~port1_we, port1_we }; + ds[1] <= port2_ds; + din_latch[1] <= port2_d; + port2_state <= port2_req; + end else begin + { oe_latch[1], we_latch[1] } <= 2'b10; + ds[1] <= 2'b11; + end + end + + if (next_port[1] == PORT_NONE && need_refresh && !we_latch[0] && !oe_latch[0]) begin + refresh <= 1'b1; + refresh_cnt <= 0; + sd_cmd <= CMD_AUTO_REFRESH; + end + end + + // CAS phase + if(t == STATE_CAS0 && (we_latch[0] || oe_latch[0])) begin + sd_cmd <= we_latch[0]?CMD_WRITE:CMD_READ; + { SDRAM_DQMH, SDRAM_DQML } <= ~ds[0]; + if (we_latch[0]) begin + SDRAM_DQ <= din_latch[0]; + port1_ack <= port1_req; + end + SDRAM_A <= { 4'b0010, addr_latch[0][9:1] }; // auto precharge + SDRAM_BA <= addr_latch[0][24:23]; + end + + if(t == STATE_CAS1 && (we_latch[1] || oe_latch[1])) begin + sd_cmd <= we_latch[1]?CMD_WRITE:CMD_READ; + { SDRAM_DQMH, SDRAM_DQML } <= ~ds[1]; + if (we_latch[1]) begin + SDRAM_DQ <= din_latch[1]; + port2_ack <= port2_req; + end + SDRAM_A <= { 4'b0010, addr_latch[1][9:1] }; // auto precharge + SDRAM_BA <= addr_latch[1][24:23]; + end + + // Data returned + if(t == STATE_READ0 && oe_latch[0]) begin + case(port[0]) + PORT_REQ: begin port1_q <= sd_din; port1_ack <= port1_req; end + PORT_CPU1: begin cpu1_q <= sd_din; end + PORT_CPU2: begin cpu2_q <= sd_din; end + default: ; + endcase; + end + + if(t == STATE_READ1 && oe_latch[1]) begin + case(port[1]) + PORT_REQ: port2_q[15:0] <= sd_din; + PORT_SP : sp_q[15:0] <= sd_din; + default: ; + endcase; + end + + if(t == STATE_DS1b && oe_latch[1]) { SDRAM_DQMH, SDRAM_DQML } <= ~ds[1]; + + if(t == STATE_READ1b && oe_latch[1]) begin + case(port[1]) + PORT_REQ: begin port2_q[31:16] <= sd_din; port2_ack <= port2_req; end + PORT_SP : begin sp_q[31:16] <= sd_din; end + default: ; + endcase; + end + end +end + +endmodule diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/spram.vhd b/Arcade_MiST/NinjaKun_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/NinjaKun_MiST/rtl/z80ip.v b/Arcade_MiST/NinjaKun_MiST/rtl/z80ip.v new file mode 100644 index 00000000..8d55182f --- /dev/null +++ b/Arcade_MiST/NinjaKun_MiST/rtl/z80ip.v @@ -0,0 +1,51 @@ +// Copyright (c) 2011 MiSTer-X + +module Z80IP +( + input reset_in, + input clk, + output [15:0] adr, + input [7:0] data_in, + output [7:0] data_out, + output rd, + output wr, + input intreq, + output intack +); + +assign intack = (adr==16'h38); + +wire nmireq = 0; + +wire i_mreq, i_iorq, i_rd, i_wr, i_rfsh; + +T80s cpu( + .CLK_n(~clk), + .RESET_n(~reset_in), + .INT_n(~intreq), + .NMI_n(~nmireq), + .MREQ_n(i_mreq), + .IORQ_n(i_iorq), + .RFSH_n(i_rfsh), + .RD_n(i_rd), + .WR_n(i_wr), + .A(adr), + .DI(data_in), + .DO(data_out), + .WAIT_n(1'b1), + .BUSRQ_n(1'b1), + .BUSAK_n(), + .HALT_n(), + .M1_n() +); + +wire mreq = (~i_mreq) & (i_rfsh); +wire iorq = ~i_iorq; +wire rdr = ~i_rd; +wire wrr = ~i_wr; + +assign rd = mreq & rdr; +assign wr = mreq & wrr; + +endmodule +