From f1956f3fe00cf5cbf33db4b560bd6174a5ca79ad Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sat, 10 Sep 2022 17:55:16 +0200 Subject: [PATCH] Port the RAM/ROM rework, M84, optimize palette RAM, add R-Type II and Hammerin' Harry US --- Arcade_MiST/IremM72 Hardware/IremM72.qsf | 19 +- Arcade_MiST/IremM72 Hardware/Readme.md | 5 +- .../meta/Air Duel (Japan, M72 hardware).mra | 10 +- .../Dragon Breed (Japan, M72 hardware).mra | 10 +- ...rmed Police Unit (Japan, M72 hardware).mra | 7 +- .../Hammerin' Harry (US, M84 hardware).mra | 75 ++ .../meta/Image Fight (Japan).mra | 10 +- .../meta/Image Fight (World).mra | 10 +- .../meta/Legend of Hero Tonma (Japan).mra | 10 +- .../meta/Mr. HELI no Daibouken (Japan).mra | 10 +- .../meta/Ninja Spirit (Japan).mra | 10 +- .../IremM72 Hardware/meta/R-Type (Japan).mra | 6 +- .../IremM72 Hardware/meta/R-Type (World).mra | 6 +- .../meta/R-Type II (Japan).mra | 73 ++ .../meta/R-Type II (World).mra | 72 ++ .../meta/X Multiply (Japan, M72 hardware).mra | 12 +- .../IremM72 Hardware/rtl/Arcade-IremM72.sv | 675 --------------- .../IremM72 Hardware/rtl/IremM72_MiST.sv | 31 +- Arcade_MiST/IremM72 Hardware/rtl/board_b_d.sv | 38 +- .../IremM72 Hardware/rtl/board_b_d_layer.sv | 119 ++- Arcade_MiST/IremM72 Hardware/rtl/kna70h015.sv | 13 +- Arcade_MiST/IremM72 Hardware/rtl/kna91h014.v | 65 +- Arcade_MiST/IremM72 Hardware/rtl/m72.sv | 173 ++-- Arcade_MiST/IremM72 Hardware/rtl/m72.v | 813 ------------------ Arcade_MiST/IremM72 Hardware/rtl/m72_pkg.sv | 28 +- Arcade_MiST/IremM72 Hardware/rtl/mcu.sv | 77 +- Arcade_MiST/IremM72 Hardware/rtl/pal.sv | 221 +++-- Arcade_MiST/IremM72 Hardware/rtl/rom.sv | 35 +- .../IremM72 Hardware/rtl/sample_rom.sv | 49 ++ Arcade_MiST/IremM72 Hardware/rtl/sdram_4w.sv | 14 +- Arcade_MiST/IremM72 Hardware/rtl/sound.sv | 101 ++- Arcade_MiST/IremM72 Hardware/rtl/sprite.sv | 2 +- 32 files changed, 876 insertions(+), 1923 deletions(-) create mode 100644 Arcade_MiST/IremM72 Hardware/meta/Hammerin' Harry (US, M84 hardware).mra create mode 100644 Arcade_MiST/IremM72 Hardware/meta/R-Type II (Japan).mra create mode 100644 Arcade_MiST/IremM72 Hardware/meta/R-Type II (World).mra delete mode 100644 Arcade_MiST/IremM72 Hardware/rtl/Arcade-IremM72.sv delete mode 100644 Arcade_MiST/IremM72 Hardware/rtl/m72.v create mode 100644 Arcade_MiST/IremM72 Hardware/rtl/sample_rom.sv diff --git a/Arcade_MiST/IremM72 Hardware/IremM72.qsf b/Arcade_MiST/IremM72 Hardware/IremM72.qsf index 152eb751..2ff1dbe2 100644 --- a/Arcade_MiST/IremM72 Hardware/IremM72.qsf +++ b/Arcade_MiST/IremM72 Hardware/IremM72.qsf @@ -1,3 +1,4 @@ +set_global_assignment -name FIT_ATTEMPTS_TO_SKIP 0.0 # -------------------------------------------------------------------------- # # # Copyright (C) 1991-2013 Altera Corporation @@ -164,7 +165,7 @@ set_global_assignment -name USE_CONFIGURATION_DEVICE OFF # SignalTap II Assignments # ======================== set_global_assignment -name ENABLE_SIGNALTAP OFF -set_global_assignment -name USE_SIGNALTAP_FILE output_files/cpu3.stp +set_global_assignment -name USE_SIGNALTAP_FILE output_files/cpu2.stp # Power Estimation Assignments # ============================ @@ -233,11 +234,20 @@ set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top # end ENTITY(IremM72_MiST) # --------------------------- set_location_assignment PLL_1 -to pll|altpll_component|auto_generated|pll1 +set_global_assignment -name DSP_BLOCK_BALANCING "DSP BLOCKS" +set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_RETIMING OFF +set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_DUPLICATION OFF +set_global_assignment -name AUTO_SHIFT_REGISTER_RECOGNITION OFF +set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT EXTRA +set_global_assignment -name VERILOG_SHOW_LMF_MAPPING_MESSAGES OFF set_global_assignment -name SYSTEMVERILOG_FILE rtl/IremM72_MiST.sv +set_global_assignment -name VERILOG_FILE rtl/build_id.v set_global_assignment -name QIP_FILE rtl/pll_mist.qip +set_global_assignment -name SYSTEMVERILOG_FILE rtl/ddr_debug.sv set_global_assignment -name SYSTEMVERILOG_FILE rtl/m72.sv set_global_assignment -name SYSTEMVERILOG_FILE rtl/pal.sv set_global_assignment -name SYSTEMVERILOG_FILE rtl/mcu.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/sample_rom.sv set_global_assignment -name SYSTEMVERILOG_FILE rtl/m72_pkg.sv set_global_assignment -name SYSTEMVERILOG_FILE rtl/m72_pic.sv set_global_assignment -name VERILOG_FILE rtl/iir_filter.v @@ -247,8 +257,6 @@ set_global_assignment -name SYSTEMVERILOG_FILE rtl/kna70h015.sv set_global_assignment -name VERILOG_FILE rtl/jtframe_frac_cen.v set_global_assignment -name SYSTEMVERILOG_FILE rtl/dualport_mailbox.sv set_global_assignment -name SYSTEMVERILOG_FILE rtl/dpramv.sv -set_global_assignment -name SYSTEMVERILOG_FILE rtl/ddr_debug.sv -set_global_assignment -name VERILOG_FILE rtl/build_id.v set_global_assignment -name SYSTEMVERILOG_FILE rtl/board_b_d_layer.sv set_global_assignment -name SYSTEMVERILOG_FILE rtl/board_b_d.sv set_global_assignment -name SYSTEMVERILOG_FILE rtl/sprite.sv @@ -263,9 +271,4 @@ set_global_assignment -name QIP_FILE ../../common/Sound/jt51/jt51.qip set_global_assignment -name SIGNALTAP_FILE output_files/cpu.stp set_global_assignment -name SIGNALTAP_FILE output_files/cpu2.stp set_global_assignment -name SIGNALTAP_FILE output_files/cpu3.stp -set_global_assignment -name DSP_BLOCK_BALANCING "DSP BLOCKS" -set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_RETIMING ON -set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_DUPLICATION OFF -set_global_assignment -name AUTO_SHIFT_REGISTER_RECOGNITION OFF -set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT EXTRA set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/IremM72 Hardware/Readme.md b/Arcade_MiST/IremM72 Hardware/Readme.md index 26187246..6eab9a76 100644 --- a/Arcade_MiST/IremM72 Hardware/Readme.md +++ b/Arcade_MiST/IremM72 Hardware/Readme.md @@ -2,7 +2,7 @@ ![](docs/header_small.png) -Implemention of the Irem M72 arcade hardware (https://www.system16.com/hardware.php?id=738) for the MiSTer FPGA platform. +Implemention of the Irem M72 & M84 arcade hardware (https://www.system16.com/hardware.php?id=738) for the MiSTer FPGA platform. [Original core](https://github.com/MiSTer-devel/Arcade-IremM72_MiSTer) by Martin Donlon. @@ -22,6 +22,9 @@ Implemention of the Irem M72 arcade hardware (https://www.system16.com/hardware. |[Dragon Breed](https://en.wikipedia.org/wiki/Dragon_Breed)|Japan|Conversion from M81 hardware.| |[X-Multiply](https://en.wikipedia.org/wiki/X_Multiply)|Japan|Conversion from M81 hardware.| |[Daiku no Gensan](https://en.wikipedia.org/wiki/Hammerin%27_Harry)|Japan|Conversion from M81 hardware. Emulated MCU| +|[R-Type II](https://en.wikipedia.org/wiki/R-Type_II)|Japan,World|M84 hardware.| +|[Hammerin' Harry](https://en.wikipedia.org/wiki/Hammerin%27_Harry)|US|M84 hardware.| + **Note:** Emulated MCU is not implemented on MiST (FPGA is full). diff --git a/Arcade_MiST/IremM72 Hardware/meta/Air Duel (Japan, M72 hardware).mra b/Arcade_MiST/IremM72 Hardware/meta/Air Duel (Japan, M72 hardware).mra index 94eb7326..336054f0 100644 --- a/Arcade_MiST/IremM72 Hardware/meta/Air Duel (Japan, M72 hardware).mra +++ b/Arcade_MiST/IremM72 Hardware/meta/Air Duel (Japan, M72 hardware).mra @@ -37,7 +37,7 @@ - 00 08 00 00 + 01 08 00 00 @@ -46,7 +46,7 @@ - 00 08 00 00 + 02 08 00 00 @@ -55,7 +55,7 @@ - 00 08 00 00 + 03 08 00 00 @@ -64,11 +64,11 @@ - 00 00 10 00 + 04 00 10 00 - 00 02 00 00 + 05 02 00 00 diff --git a/Arcade_MiST/IremM72 Hardware/meta/Dragon Breed (Japan, M72 hardware).mra b/Arcade_MiST/IremM72 Hardware/meta/Dragon Breed (Japan, M72 hardware).mra index c80e6eaf..9527d893 100644 --- a/Arcade_MiST/IremM72 Hardware/meta/Dragon Breed (Japan, M72 hardware).mra +++ b/Arcade_MiST/IremM72 Hardware/meta/Dragon Breed (Japan, M72 hardware).mra @@ -43,7 +43,7 @@ - 00 08 00 00 + 01 08 00 00 @@ -52,7 +52,7 @@ - 00 08 00 00 + 02 08 00 00 @@ -61,7 +61,7 @@ - 00 08 00 00 + 03 08 00 00 @@ -70,11 +70,11 @@ - 00 00 10 00 + 04 00 10 00 - 00 02 00 00 + 05 02 00 00 diff --git a/Arcade_MiST/IremM72 Hardware/meta/Gallop - Armed Police Unit (Japan, M72 hardware).mra b/Arcade_MiST/IremM72 Hardware/meta/Gallop - Armed Police Unit (Japan, M72 hardware).mra index 9768589e..fe6de640 100644 --- a/Arcade_MiST/IremM72 Hardware/meta/Gallop - Armed Police Unit (Japan, M72 hardware).mra +++ b/Arcade_MiST/IremM72 Hardware/meta/Gallop - Armed Police Unit (Japan, M72 hardware).mra @@ -39,7 +39,7 @@ - 00 08 00 00 + 01 08 00 00 @@ -48,7 +48,7 @@ - 00 04 00 00 + 02 04 00 00 @@ -57,12 +57,13 @@ - 00 04 00 00 + 03 04 00 00 + diff --git a/Arcade_MiST/IremM72 Hardware/meta/Hammerin' Harry (US, M84 hardware).mra b/Arcade_MiST/IremM72 Hardware/meta/Hammerin' Harry (US, M84 hardware).mra new file mode 100644 index 00000000..4ac6b62c --- /dev/null +++ b/Arcade_MiST/IremM72 Hardware/meta/Hammerin' Harry (US, M84 hardware).mra @@ -0,0 +1,75 @@ + + Hammerin' Harry (US, M84 hardware) + 0247 + hharryu + 1989 + Irem + Platformer + IremM72 + horizontal + + 8-way + 2 + + + + + + + + + + + + + + + + + + + 14 + + 00 08 00 00 + + + + + + + + + + + + + + + + 01 08 00 00 + + + + + + + + + 02 08 00 00 + + + + + + + + + 05 02 00 00 + + + + 08 01 00 00 + + + + \ No newline at end of file diff --git a/Arcade_MiST/IremM72 Hardware/meta/Image Fight (Japan).mra b/Arcade_MiST/IremM72 Hardware/meta/Image Fight (Japan).mra index c1fef8e0..57eeaca1 100644 --- a/Arcade_MiST/IremM72 Hardware/meta/Image Fight (Japan).mra +++ b/Arcade_MiST/IremM72 Hardware/meta/Image Fight (Japan).mra @@ -45,7 +45,7 @@ - 00 08 00 00 + 01 08 00 00 @@ -54,7 +54,7 @@ - 00 04 00 00 + 02 04 00 00 @@ -63,7 +63,7 @@ - 00 04 00 00 + 03 04 00 00 @@ -72,11 +72,11 @@ - 00 00 10 00 + 04 00 10 00 - 00 02 00 00 + 05 02 00 00 diff --git a/Arcade_MiST/IremM72 Hardware/meta/Image Fight (World).mra b/Arcade_MiST/IremM72 Hardware/meta/Image Fight (World).mra index db56e424..83e681b1 100644 --- a/Arcade_MiST/IremM72 Hardware/meta/Image Fight (World).mra +++ b/Arcade_MiST/IremM72 Hardware/meta/Image Fight (World).mra @@ -44,7 +44,7 @@ - 00 08 00 00 + 01 08 00 00 @@ -53,7 +53,7 @@ - 00 04 00 00 + 02 04 00 00 @@ -62,7 +62,7 @@ - 00 04 00 00 + 03 04 00 00 @@ -71,11 +71,11 @@ - 00 00 10 00 + 04 00 10 00 - 00 02 00 00 + 05 02 00 00 diff --git a/Arcade_MiST/IremM72 Hardware/meta/Legend of Hero Tonma (Japan).mra b/Arcade_MiST/IremM72 Hardware/meta/Legend of Hero Tonma (Japan).mra index 1723f33f..d46dbf26 100644 --- a/Arcade_MiST/IremM72 Hardware/meta/Legend of Hero Tonma (Japan).mra +++ b/Arcade_MiST/IremM72 Hardware/meta/Legend of Hero Tonma (Japan).mra @@ -39,7 +39,7 @@ - 00 08 00 00 + 01 08 00 00 @@ -48,7 +48,7 @@ - 00 04 00 00 + 02 04 00 00 @@ -57,7 +57,7 @@ - 00 04 00 00 + 03 04 00 00 @@ -66,11 +66,11 @@ - 00 00 10 00 + 04 00 10 00 - 00 01 00 00 + 05 01 00 00 diff --git a/Arcade_MiST/IremM72 Hardware/meta/Mr. HELI no Daibouken (Japan).mra b/Arcade_MiST/IremM72 Hardware/meta/Mr. HELI no Daibouken (Japan).mra index 751944b3..c95959de 100644 --- a/Arcade_MiST/IremM72 Hardware/meta/Mr. HELI no Daibouken (Japan).mra +++ b/Arcade_MiST/IremM72 Hardware/meta/Mr. HELI no Daibouken (Japan).mra @@ -50,7 +50,7 @@ - 00 08 00 00 + 01 08 00 00 @@ -59,7 +59,7 @@ - 00 04 00 00 + 02 04 00 00 @@ -68,7 +68,7 @@ - 00 04 00 00 + 03 04 00 00 @@ -77,11 +77,11 @@ - 00 00 10 00 + 04 00 10 00 - 00 01 00 00 + 05 01 00 00 diff --git a/Arcade_MiST/IremM72 Hardware/meta/Ninja Spirit (Japan).mra b/Arcade_MiST/IremM72 Hardware/meta/Ninja Spirit (Japan).mra index ecd626f4..e0d72b74 100644 --- a/Arcade_MiST/IremM72 Hardware/meta/Ninja Spirit (Japan).mra +++ b/Arcade_MiST/IremM72 Hardware/meta/Ninja Spirit (Japan).mra @@ -48,7 +48,7 @@ - 00 08 00 00 + 01 08 00 00 @@ -57,7 +57,7 @@ - 00 04 00 00 + 02 04 00 00 @@ -66,7 +66,7 @@ - 00 04 00 00 + 03 04 00 00 @@ -75,11 +75,11 @@ - 00 00 10 00 + 04 00 10 00 - 00 01 00 00 + 05 01 00 00 diff --git a/Arcade_MiST/IremM72 Hardware/meta/R-Type (Japan).mra b/Arcade_MiST/IremM72 Hardware/meta/R-Type (Japan).mra index 02e1ee91..3eb004e5 100644 --- a/Arcade_MiST/IremM72 Hardware/meta/R-Type (Japan).mra +++ b/Arcade_MiST/IremM72 Hardware/meta/R-Type (Japan).mra @@ -42,7 +42,7 @@ - 00 06 00 00 + 01 06 00 00 @@ -58,7 +58,7 @@ - 00 02 00 00 + 02 02 00 00 @@ -67,7 +67,7 @@ - 00 02 00 00 + 03 02 00 00 diff --git a/Arcade_MiST/IremM72 Hardware/meta/R-Type (World).mra b/Arcade_MiST/IremM72 Hardware/meta/R-Type (World).mra index d4ab0a84..ea9c53c3 100644 --- a/Arcade_MiST/IremM72 Hardware/meta/R-Type (World).mra +++ b/Arcade_MiST/IremM72 Hardware/meta/R-Type (World).mra @@ -40,7 +40,7 @@ - 00 06 00 00 + 01 06 00 00 @@ -56,7 +56,7 @@ - 00 02 00 00 + 02 02 00 00 @@ -65,7 +65,7 @@ - 00 02 00 00 + 03 02 00 00 diff --git a/Arcade_MiST/IremM72 Hardware/meta/R-Type II (Japan).mra b/Arcade_MiST/IremM72 Hardware/meta/R-Type II (Japan).mra new file mode 100644 index 00000000..15597ef5 --- /dev/null +++ b/Arcade_MiST/IremM72 Hardware/meta/R-Type II (Japan).mra @@ -0,0 +1,73 @@ + + R-Type II (Japan) + 0245 + rtype2j + rtype2 + 1989 + Irem + Shooter + IremM72 + horizontal + + 8-way + 2 + + + + + + + + + + + + + + + 13 + + 00 08 00 00 + + + + + + + + + + + 01 08 00 00 + + + + + + + + + 02 10 00 00 + + + + + + + + + + + + + + + 05 02 00 00 + + + + 08 01 00 00 + + + + diff --git a/Arcade_MiST/IremM72 Hardware/meta/R-Type II (World).mra b/Arcade_MiST/IremM72 Hardware/meta/R-Type II (World).mra new file mode 100644 index 00000000..b2c9da0b --- /dev/null +++ b/Arcade_MiST/IremM72 Hardware/meta/R-Type II (World).mra @@ -0,0 +1,72 @@ + + R-Type II (World) + 0245 + rtype2 + 1989 + Irem + Shooter + IremM72 + horizontal + + 8-way + 2 + + + + + + + + + + + + + + + 13 + + 00 08 00 00 + + + + + + + + + + + 01 08 00 00 + + + + + + + + + 02 10 00 00 + + + + + + + + + + + + + + + 05 02 00 00 + + + + 08 01 00 00 + + + + \ No newline at end of file diff --git a/Arcade_MiST/IremM72 Hardware/meta/X Multiply (Japan, M72 hardware).mra b/Arcade_MiST/IremM72 Hardware/meta/X Multiply (Japan, M72 hardware).mra index 2b05fa69..68533798 100644 --- a/Arcade_MiST/IremM72 Hardware/meta/X Multiply (Japan, M72 hardware).mra +++ b/Arcade_MiST/IremM72 Hardware/meta/X Multiply (Japan, M72 hardware).mra @@ -12,7 +12,7 @@ 8-way 1 - + @@ -43,7 +43,7 @@ - 00 10 00 00 + 01 10 00 00 @@ -58,7 +58,7 @@ - 00 08 00 00 + 02 08 00 00 @@ -67,7 +67,7 @@ - 00 08 00 00 + 03 08 00 00 @@ -76,11 +76,11 @@ - 00 00 10 00 + 04 00 10 00 - 00 02 00 00 + 05 02 00 00 diff --git a/Arcade_MiST/IremM72 Hardware/rtl/Arcade-IremM72.sv b/Arcade_MiST/IremM72 Hardware/rtl/Arcade-IremM72.sv deleted file mode 100644 index 479b3ade..00000000 --- a/Arcade_MiST/IremM72 Hardware/rtl/Arcade-IremM72.sv +++ /dev/null @@ -1,675 +0,0 @@ -//============================================================================ -// Irem M72 for MiSTer FPGA -// -// Copyright (C) 2022 Martin Donlon -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -//============================================================================ - - -import m72_pkg::*; - -module emu -( - //Master input clock - input CLK_50M, - - //Async reset from top-level module. - //Can be used as initial reset. - input RESET, - - //Must be passed to hps_io module - inout [48:0] HPS_BUS, - - //Base video clock. Usually equals to CLK_SYS. - output CLK_VIDEO, - - //Multiple resolutions are supported using different CE_PIXEL rates. - //Must be based on CLK_VIDEO - output CE_PIXEL, - - //Video aspect ratio for HDMI. Most retro systems have ratio 4:3. - //if VIDEO_ARX[12] or VIDEO_ARY[12] is set then [11:0] contains scaled size instead of aspect ratio. - output [12:0] VIDEO_ARX, - output [12:0] VIDEO_ARY, - - output [7:0] VGA_R, - output [7:0] VGA_G, - output [7:0] VGA_B, - output VGA_HS, - output VGA_VS, - output VGA_DE, // = ~(VBlank | HBlank) - output VGA_F1, - output [1:0] VGA_SL, - output VGA_SCALER, // Force VGA scaler - - input [11:0] HDMI_WIDTH, - input [11:0] HDMI_HEIGHT, - output HDMI_FREEZE, - -`ifdef MISTER_FB - // Use framebuffer in DDRAM (USE_FB=1 in qsf) - // FB_FORMAT: - // [2:0] : 011=8bpp(palette) 100=16bpp 101=24bpp 110=32bpp - // [3] : 0=16bits 565 1=16bits 1555 - // [4] : 0=RGB 1=BGR (for 16/24/32 modes) - // - // FB_STRIDE either 0 (rounded to 256 bytes) or multiple of pixel size (in bytes) - output FB_EN, - output [4:0] FB_FORMAT, - output [11:0] FB_WIDTH, - output [11:0] FB_HEIGHT, - output [31:0] FB_BASE, - output [13:0] FB_STRIDE, - input FB_VBL, - input FB_LL, - output FB_FORCE_BLANK, - -`ifdef MISTER_FB_PALETTE - // Palette control for 8bit modes. - // Ignored for other video modes. - output FB_PAL_CLK, - output [7:0] FB_PAL_ADDR, - output [23:0] FB_PAL_DOUT, - input [23:0] FB_PAL_DIN, - output FB_PAL_WR, -`endif -`endif - - output LED_USER, // 1 - ON, 0 - OFF. - - // b[1]: 0 - LED status is system status OR'd with b[0] - // 1 - LED status is controled solely by b[0] - // hint: supply 2'b00 to let the system control the LED. - output [1:0] LED_POWER, - output [1:0] LED_DISK, - - // I/O board button press simulation (active high) - // b[1]: user button - // b[0]: osd button - output [1:0] BUTTONS, - - input CLK_AUDIO, // 24.576 MHz - output [15:0] AUDIO_L, - output [15:0] AUDIO_R, - output AUDIO_S, // 1 - signed audio samples, 0 - unsigned - output [1:0] AUDIO_MIX, // 0 - no mix, 1 - 25%, 2 - 50%, 3 - 100% (mono) - - //ADC - inout [3:0] ADC_BUS, - - //SD-SPI - output SD_SCK, - output SD_MOSI, - input SD_MISO, - output SD_CS, - input SD_CD, - - //High latency DDR3 RAM interface - //Use for non-critical time purposes - output DDRAM_CLK, - input DDRAM_BUSY, - output [7:0] DDRAM_BURSTCNT, - output [28:0] DDRAM_ADDR, - input [63:0] DDRAM_DOUT, - input DDRAM_DOUT_READY, - output DDRAM_RD, - output [63:0] DDRAM_DIN, - output [7:0] DDRAM_BE, - output DDRAM_WE, - - //SDRAM interface with lower latency - output SDRAM_CLK, - output SDRAM_CKE, - output [12:0] SDRAM_A, - output [1:0] SDRAM_BA, - inout [15:0] SDRAM_DQ, - output SDRAM_DQML, - output SDRAM_DQMH, - output SDRAM_nCS, - output SDRAM_nCAS, - output SDRAM_nRAS, - output SDRAM_nWE, - -`ifdef MISTER_DUAL_SDRAM - //Secondary SDRAM - //Set all output SDRAM_* signals to Z ASAP if SDRAM2_EN is 0 - input SDRAM2_EN, - output SDRAM2_CLK, - output [12:0] SDRAM2_A, - output [1:0] SDRAM2_BA, - inout [15:0] SDRAM2_DQ, - output SDRAM2_nCS, - output SDRAM2_nCAS, - output SDRAM2_nRAS, - output SDRAM2_nWE, -`endif - - input UART_CTS, - output UART_RTS, - input UART_RXD, - output UART_TXD, - output UART_DTR, - input UART_DSR, - - // Open-drain User port. - // 0 - D+/RX - // 1 - D-/TX - // 2..6 - USR2..USR6 - // Set USER_OUT to 1 to read from USER_IN. - input [6:0] USER_IN, - output [6:0] USER_OUT, - - input OSD_STATUS -); - -///////// Default values for ports not used in this core ///////// - -assign ADC_BUS = 'Z; -assign USER_OUT = '1; -assign {UART_RTS, UART_TXD, UART_DTR} = 0; -assign {SD_SCK, SD_MOSI, SD_CS} = 'Z; -assign CLK_VIDEO = CLK_32M; - -assign VGA_F1 = 0; -assign VGA_SCALER = 0; - -assign AUDIO_S = 1; -assign AUDIO_MIX = 0; - -assign LED_DISK = 0; -assign LED_POWER = 0; -assign BUTTONS = 0; - -////////////////////////////////////////////////////////////////// - -wire [1:0] ar = status[2:1]; -wire [1:0] scandoubler_fx = status[4:3]; -wire [1:0] scale = status[6:5]; -wire pause_in_osd = status[7]; -wire system_pause; - -assign VGA_SL = scandoubler_fx; -assign HDMI_FREEZE = 0; //system_pause; - -wire en_layer_a = ~status[64]; -wire en_layer_b = ~status[65]; -wire en_sprites = ~status[66]; -wire en_layer_palette = ~status[67]; -wire en_sprite_palette = ~status[68]; -wire dbg_sprite_freeze = status[69]; -wire en_audio_filters = ~status[70]; - -wire video_60hz = status[9:8] == 2'd3; -wire video_57hz = status[9:8] == 2'd2; -wire video_50hz = status[9:8] == 2'd1; - -// If video timing changes, force mode update -reg [1:0] video_status; -reg new_vmode = 0; -always @(posedge clk_sys) begin - if (video_status != status[9:8]) begin - video_status <= status[9:8]; - new_vmode <= ~new_vmode; - end -end - -`include "build_id.v" -localparam CONF_STR = { - "M72;;", - "-;", - "O[2:1],Aspect ratio,Original,Full Screen,[ARC1],[ARC2];", - "O[4:3],Scandoubler Fx,None,CRT 25%,CRT 50%,CRT 75%;", - "O[6:5],Scale,Normal,V-Integer,Narrower HV-Integer,Wider HV-Integer;", - "O[7],OSD Pause,Off,On;", - "O[9:8],Video Timing,Normal,50Hz,57Hz,60Hz;", - "O[10],Orientation,Horz,Vert;", - "-;", - "DIP;", - "-;", - "P1,Debug;", - "P1-;", - "P1O[64],Layer A,On,Off;", - "P1O[65],Layer B,On,Off;", - "P1O[66],Sprites,On,Off;", - "P1O[67],Layer Palette,On,Off;", - "P1O[68],Sprite Palette,On,Off;", - "P1O[69],Sprite Freeze,Off,On;", - "P1O[70],Audio Filtering,On,Off;", - "-;", - "T[0],Reset;", - "DEFMRA,/_Arcade/m72.mra;", - "V,v",`BUILD_DATE -}; - -wire forced_scandoubler; -wire [1:0] buttons; -wire [128:0] status; -wire [10:0] ps2_key; - -wire ioctl_download; -wire ioctl_upload; -wire ioctl_upload_req = 0; -wire [7:0] ioctl_index; -wire ioctl_wr; -wire [24:0] ioctl_addr; -wire [7:0] ioctl_dout; -wire [7:0] ioctl_din = 0; -wire ioctl_wait; - -wire [15:0] joystick_0, joystick_1; -wire [15:0] joy = joystick_0 | joystick_1; - -wire [21:0] gamma_bus; -wire direct_video; -wire video_rotated; -wire no_rotate = ~status[10]; -wire flip = 0; -wire rotate_ccw = 1; - -wire clk_sys = CLK_32M; - -hps_io #(.CONF_STR(CONF_STR)) hps_io -( - .clk_sys(clk_sys), - .HPS_BUS(HPS_BUS), - .EXT_BUS(), - .gamma_bus(gamma_bus), - .direct_video(direct_video), - - .forced_scandoubler(forced_scandoubler), - .new_vmode(new_vmode), - .video_rotated(video_rotated), - - .buttons(buttons), - .status(status), - .status_menumask({direct_video}), - - .ioctl_download(ioctl_download), - .ioctl_upload(ioctl_upload), - .ioctl_upload_req(ioctl_upload_req), - .ioctl_wr(ioctl_wr), - .ioctl_addr(ioctl_addr), - .ioctl_dout(ioctl_dout), - .ioctl_din(ioctl_din), - .ioctl_index(ioctl_index), - .ioctl_wait(ioctl_wait), - - .joystick_0(joystick_0), - .joystick_1(joystick_1), - .ps2_key(ps2_key) -); - -/////////////////////// CLOCKS /////////////////////////////// - -wire CLK_32M; -wire CLK_96M; -wire pll_locked; -pll pll -( - .refclk(CLK_50M), - .rst(0), - .outclk_0(CLK_96M), - .outclk_1(CLK_32M), - .locked(pll_locked) -); - -wire reset = RESET | status[0] | buttons[1]; - -/////////////////////////////////////////////////////////////////////// -// SDRAM -/////////////////////////////////////////////////////////////////////// -wire [63:0] sdr_sprite_dout; -wire [24:1] sdr_sprite_addr; -wire sdr_sprite_req, sdr_sprite_rdy; - -wire [31:0] sdr_bg_dout; -wire [24:1] sdr_bg_addr; -wire sdr_bg_req, sdr_bg_rdy; - -wire [15:0] sdr_cpu_dout, sdr_cpu_din; -wire [24:1] sdr_cpu_addr; -wire sdr_cpu_req; -wire [1:0] sdr_cpu_wr_sel; - -reg [24:1] sdr_rom_addr; -reg [15:0] sdr_rom_data; -reg [1:0] sdr_rom_be; -reg sdr_rom_req; - -wire sdr_rom_write = ioctl_download && (ioctl_index == 0); -wire [24:1] sdr_ch3_addr = sdr_rom_write ? sdr_rom_addr : sdr_cpu_addr; -wire [15:0] sdr_ch3_din = sdr_rom_write ? sdr_rom_data : sdr_cpu_din; -wire [1:0] sdr_ch3_be = sdr_rom_write ? sdr_rom_be : sdr_cpu_wr_sel; -wire sdr_ch3_rnw = sdr_rom_write ? 1'b0 : ~{|sdr_cpu_wr_sel}; -wire sdr_ch3_req = sdr_rom_write ? sdr_rom_req : sdr_cpu_req; -wire sdr_ch3_rdy; -wire sdr_cpu_rdy = sdr_ch3_rdy; -wire sdr_rom_rdy = sdr_ch3_rdy; - -wire [19:0] bram_addr; -wire [7:0] bram_data; -wire [1:0] bram_cs; -wire bram_wr; - -board_cfg_t board_cfg; - -sdram sdram -( - .*, - .doRefresh(0), - .init(~pll_locked), - .clk(CLK_96M), - - .ch1_addr(sdr_bg_addr), - .ch1_dout(sdr_bg_dout), - .ch1_req(sdr_bg_req), - .ch1_ready(sdr_bg_rdy), - - .ch2_addr(sdr_sprite_addr), - .ch2_dout(sdr_sprite_dout), - .ch2_req(sdr_sprite_req), - .ch2_ready(sdr_sprite_rdy), - - // multiplexed with rom download and cpu read/writes - .ch3_addr(sdr_ch3_addr), - .ch3_din(sdr_ch3_din), - .ch3_dout(sdr_cpu_dout), - .ch3_be(sdr_ch3_be), - .ch3_rnw(sdr_ch3_rnw), - .ch3_req(sdr_ch3_req), - .ch3_ready(sdr_ch3_rdy) -); - -rom_loader rom_loader( - .sys_clk(clk_sys), - .ram_clk(CLK_96M), - - .ioctl_wr(ioctl_wr && !ioctl_index), - .ioctl_data(ioctl_dout[7:0]), - - .ioctl_wait(ioctl_wait), - - .sdr_addr(sdr_rom_addr), - .sdr_data(sdr_rom_data), - .sdr_be(sdr_rom_be), - .sdr_req(sdr_rom_req), - .sdr_rdy(sdr_rom_rdy), - - .bram_addr(bram_addr), - .bram_data(bram_data), - .bram_cs(bram_cs), - .bram_wr(bram_wr), - - .board_cfg(board_cfg) -); - -/////////////////// Keyboard ////////////////// -reg btn_up = 0; -reg btn_down = 0; -reg btn_left = 0; -reg btn_right = 0; -reg btn_a = 0; -reg btn_b = 0; -reg btn_x = 0; -reg btn_y = 0; -reg btn_coin1 = 0; -reg btn_coin2 = 0; -reg btn_1p_start = 0; -reg btn_2p_start = 0; -reg btn_pause = 0; - -wire pressed = ps2_key[9]; -wire [7:0] code = ps2_key[7:0]; -always @(posedge CLK_32M) begin - reg old_state; - old_state <= ps2_key[10]; - if(old_state != ps2_key[10]) begin - case(code) - 'h16: btn_1p_start <= pressed; // 1 - 'h1E: btn_2p_start <= pressed; // 2 - 'h2E: btn_coin1 <= pressed; // 5 - 'h36: btn_coin2 <= pressed; // 6 - 'h4D: btn_pause <= pressed; // P - - 'h75: btn_up <= pressed; // up - 'h72: btn_down <= pressed; // down - 'h6B: btn_left <= pressed; // left - 'h74: btn_right <= pressed; // right - 'h14: btn_a <= pressed; // ctrl - 'h11: btn_b <= pressed; // alt - 'h29: btn_x <= pressed; // space - 'h12: btn_y <= pressed; // shift - endcase - end -end - -// DIP SWITCHES -reg [7:0] dip_sw[8]; // Active-LOW -always @(posedge CLK_32M) begin - if(ioctl_wr && (ioctl_index==254) && !ioctl_addr[24:3]) - dip_sw[ioctl_addr[2:0]] <= ioctl_dout; -end - - -////////////////// Arcade Buttons/Interfaces /////////////////////////// - -//Player 1 -wire m_up1 = btn_up | joystick_0[3]; -wire m_down1 = btn_down | joystick_0[2]; -wire m_left1 = btn_left | joystick_0[1]; -wire m_right1 = btn_right | joystick_0[0]; -wire m_btna1 = btn_a | joystick_0[4]; -wire m_btnb1 = btn_b | joystick_0[5]; -wire m_btnx1 = btn_x | joystick_0[6]; -wire m_btny1 = btn_y | joystick_0[7]; - -//Player 2 -wire m_up2 = btn_up | joystick_1[3]; -wire m_down2 = btn_down | joystick_1[2]; -wire m_left2 = btn_left | joystick_1[1]; -wire m_right2 = btn_right | joystick_1[0]; -wire m_btna2 = btn_a | joystick_1[4]; -wire m_btnb2 = btn_b | joystick_1[5]; -wire m_btnx2 = btn_x | joystick_1[6]; -wire m_btny2 = btn_y | joystick_1[7]; - -//Start/coin -wire m_start1 = btn_1p_start | joy[8]; -wire m_start2 = btn_2p_start | joy[10]; -wire m_coin1 = btn_coin1 | joy[9]; -wire m_coin2 = btn_coin2; -wire m_pause = btn_pause | joy[11]; - -////////////////////////////////////////////////////////////////// - -wire [7:0] R, G, B; -wire HBlank, VBlank, HSync, VSync; -wire ce_pix; - -m72 m72( - .CLK_32M(CLK_32M), - .CLK_96M(CLK_96M), - .ce_pix(ce_pix), - .reset_n(~reset), - .HBlank(HBlank), - .VBlank(VBlank), - .HSync(HSync), - .VSync(VSync), - .R(R), - .G(G), - .B(B), - .AUDIO_L(AUDIO_L), - .AUDIO_R(AUDIO_R), - - .board_cfg(board_cfg), - - .coin({~m_coin2, ~m_coin1}), - - .start_buttons({~m_start2, ~m_start1}), - - .p1_joystick({~m_up1, ~m_down1, ~m_left1, ~m_right1}), - .p2_joystick({~m_up2, ~m_down2, ~m_left2, ~m_right2}), - .p1_buttons({~m_btna1, ~m_btnb1, ~m_btnx1, ~m_btny1}), - .p2_buttons({~m_btna2, ~m_btnb2, ~m_btnx2, ~m_btny2}), - - .dip_sw({~dip_sw[1], ~dip_sw[0]}), - - .sdr_sprite_addr(sdr_sprite_addr), - .sdr_sprite_dout(sdr_sprite_dout), - .sdr_sprite_req(sdr_sprite_req), - .sdr_sprite_rdy(sdr_sprite_rdy), - - .sdr_bg_addr(sdr_bg_addr), - .sdr_bg_dout(sdr_bg_dout), - .sdr_bg_req(sdr_bg_req), - .sdr_bg_rdy(sdr_bg_rdy), - - .sdr_cpu_dout(sdr_cpu_dout), - .sdr_cpu_din(sdr_cpu_din), - .sdr_cpu_addr(sdr_cpu_addr), - .sdr_cpu_req(sdr_cpu_req), - .sdr_cpu_rdy(sdr_cpu_rdy), - .sdr_cpu_wr_sel(sdr_cpu_wr_sel), - - .clk_bram(clk_sys), - .bram_addr(bram_addr), - .bram_data(bram_data), - .bram_cs(bram_cs), - .bram_wr(bram_wr), - -`ifdef M72_DEBUG - .pause_rq(system_pause | debug_stall), -`else - .pause_rq(system_pause), -`endif - .ddr_debug_data(ddr_debug_data), - - .en_layer_a(en_layer_a), - .en_layer_b(en_layer_b), - .en_sprites(en_sprites), - .en_layer_palette(en_layer_palette), - .en_sprite_palette(en_sprite_palette), - .en_audio_filters(en_audio_filters), - - .sprite_freeze(dbg_sprite_freeze), - - .video_50hz(video_50hz), - .video_57hz(video_57hz), - .video_60hz(video_60hz) -); - - -wire gamma_hsync, gamma_vsync, gamma_hblank, gamma_vblank; -wire [7:0] gamma_r, gamma_g, gamma_b; -gamma_fast video_gamma -( - .clk_vid(CLK_VIDEO), - .ce_pix(ce_pix), - .gamma_bus(gamma_bus), - .HSync(HSync), - .VSync(VSync), - .HBlank(HBlank), - .VBlank(VBlank), - .DE(), - .RGB_in({R, G, B}), - .HSync_out(gamma_hsync), - .VSync_out(gamma_vsync), - .HBlank_out(gamma_hblank), - .VBlank_out(gamma_vblank), - .DE_out(), - .RGB_out({gamma_r, gamma_g, gamma_b}) -); - -wire VGA_DE_MIXER; -video_mixer #(386, 0, 0) video_mixer( - .CLK_VIDEO(CLK_VIDEO), - .CE_PIXEL(CE_PIXEL), - .ce_pix(ce_pix), - - .scandoubler(forced_scandoubler || scandoubler_fx != 2'b00), - .hq2x(0), - - .gamma_bus(), - - .R(gamma_r), - .G(gamma_g), - .B(gamma_b), - - .HBlank(gamma_hblank), - .VBlank(gamma_vblank), - .HSync(gamma_hsync), - .VSync(gamma_vsync), - - .VGA_R(VGA_R), - .VGA_G(VGA_G), - .VGA_B(VGA_B), - .VGA_VS(VGA_VS), - .VGA_HS(VGA_HS), - .VGA_DE(VGA_DE_MIXER), - - .HDMI_FREEZE(HDMI_FREEZE) -); - - -video_freak video_freak( - .CLK_VIDEO(CLK_VIDEO), - .CE_PIXEL(CE_PIXEL), - .VGA_VS(VGA_VS), - .HDMI_WIDTH(HDMI_WIDTH), - .HDMI_HEIGHT(HDMI_HEIGHT), - .VGA_DE(VGA_DE), - .VIDEO_ARX(VIDEO_ARX), - .VIDEO_ARY(VIDEO_ARY), - - .VGA_DE_IN(VGA_DE_MIXER), - .ARX((!ar) ? ( no_rotate ? 12'd4 : 12'd3 ) : (ar - 1'd1)), - .ARY((!ar) ? ( no_rotate ? 12'd3 : 12'd4 ) : 12'd0), - .CROP_SIZE(0), - .CROP_OFF(0), - .SCALE(scale) -); - - -pause pause( - .clk_sys(clk_sys), - .reset(reset), - .user_button(m_pause), - .pause_request(0), - .options({1'b0, pause_in_osd}), - .pause_cpu(system_pause), - .OSD_STATUS(OSD_STATUS) -); - -`ifndef M72_DEBUG // debug uses DDR -screen_rotate screen_rotate(.*); -`endif - - - -ddr_debug_data_t ddr_debug_data; - -`ifdef M72_DEBUG -wire debug_stall; -ddr_debug ddr_debug( - .*, - .data(ddr_debug_data), - .clk(CLK_96M), - .reset(reset | ~pll_locked), - .stall(debug_stall) -); -`endif - -endmodule diff --git a/Arcade_MiST/IremM72 Hardware/rtl/IremM72_MiST.sv b/Arcade_MiST/IremM72 Hardware/rtl/IremM72_MiST.sv index dd351ab4..f2bb6e53 100644 --- a/Arcade_MiST/IremM72 Hardware/rtl/IremM72_MiST.sv +++ b/Arcade_MiST/IremM72 Hardware/rtl/IremM72_MiST.sv @@ -33,7 +33,10 @@ module IremM72_MiST( `include "rtl/build_id.v" -`define CORE_NAME "LOHTJ" +`define CORE_NAME "RTYPE2" +//`define CORE_NAME "HHARRYU" +//`define CORE_NAME "GALLOP" +//`define CORE_NAME "LOHTJ" //`define CORE_NAME "MRHELI" //`define CORE_NAME "AIRDUM72" //`define CORE_NAME "RTYPE" @@ -166,19 +169,19 @@ wire [24:1] sdr_sprite_addr; wire sdr_sprite_req, sdr_sprite_ack; wire [31:0] sdr_bg_data_a; -wire [24:1] sdr_bg_addr_a; +wire [24:0] sdr_bg_addr_a; wire sdr_bg_req_a, sdr_bg_ack_a; wire [31:0] sdr_bg_data_b; -wire [24:1] sdr_bg_addr_b; +wire [24:0] sdr_bg_addr_b; wire sdr_bg_req_b, sdr_bg_ack_b; wire [15:0] sdr_cpu_dout, sdr_cpu_din; -wire [24:1] sdr_cpu_addr; +wire [24:0] sdr_cpu_addr; wire sdr_cpu_req, sdr_cpu_ack; wire [1:0] sdr_cpu_wr_sel; -wire [24:1] sdr_rom_addr; +wire [24:0] sdr_rom_addr; wire [15:0] sdr_rom_data; wire [1:0] sdr_rom_be; wire sdr_rom_req; @@ -193,7 +196,7 @@ wire sdr_z80_ram_cs; wire sdr_z80_ram_valid; wire [24:0] sample_rom_addr; -wire [63:0] sample_rom_data; +wire [63:0] sample_rom_dout; wire sample_rom_req; wire sample_rom_ack; @@ -201,7 +204,7 @@ wire sdr_rom_write = ioctl_downl && (ioctl_index == 0); wire [19:0] bram_addr; wire [7:0] bram_data; -wire [1:0] bram_cs; +wire [3:0] bram_cs; wire bram_wr; board_cfg_t board_cfg; @@ -212,7 +215,7 @@ sdram_4w #(96) sdram .clk ( CLK_96M ), // Bank 0-1 ops - .port1_a ( sdr_rom_addr ), + .port1_a ( sdr_rom_addr[24:1] ), .port1_req ( sdr_rom_req ), .port1_ack ( sdr_rom_ack ), .port1_we ( sdr_rom_write ), @@ -228,7 +231,7 @@ sdram_4w #(96) sdram .cpu1_ram_req ( sdr_cpu_req ), .cpu1_ram_ack ( sdr_cpu_ack ), - .cpu1_ram_addr ( sdr_cpu_addr ), + .cpu1_ram_addr ( sdr_cpu_addr[24:1] ), .cpu1_ram_we ( |sdr_cpu_wr_sel ), .cpu1_ram_d ( sdr_cpu_din ), .cpu1_ram_q ( sdr_cpu_dout ), @@ -250,7 +253,7 @@ sdram_4w #(96) sdram .cpu3_ack ( ), // Bank 2-3 ops - .port2_a ( sdr_rom_addr ), + .port2_a ( sdr_rom_addr[24:1] ), .port2_req ( sdr_rom_req ), .port2_ack ( sdr_rom_ack ), .port2_we ( sdr_rom_write ), @@ -260,16 +263,16 @@ sdram_4w #(96) sdram .gfx1_req ( sdr_bg_req_a ), .gfx1_ack ( sdr_bg_ack_a ), - .gfx1_addr ( sdr_bg_addr_a ), + .gfx1_addr ( sdr_bg_addr_a[24:1] ), .gfx1_q ( sdr_bg_data_a ), .gfx2_req ( sdr_bg_req_b ), .gfx2_ack ( sdr_bg_ack_b ), - .gfx2_addr ( sdr_bg_addr_b ), + .gfx2_addr ( sdr_bg_addr_b[24:1] ), .gfx2_q ( sdr_bg_data_b ), .sample_addr ( {sample_rom_addr[22:3], 2'b00} ), - .sample_data ( sample_rom_data ), + .sample_q ( sample_rom_dout ), .sample_req ( sample_rom_req ), .sample_ack ( sample_rom_ack ), @@ -368,7 +371,7 @@ m72 m72( .sdr_z80_ram_valid(sdr_z80_ram_valid), .sample_rom_addr(sample_rom_addr), - .sample_rom_data(sample_rom_data), + .sample_rom_dout(sample_rom_dout), .sample_rom_req(sample_rom_req), .sample_rom_ack(sample_rom_ack), diff --git a/Arcade_MiST/IremM72 Hardware/rtl/board_b_d.sv b/Arcade_MiST/IremM72 Hardware/rtl/board_b_d.sv index c9ae1d69..c9a82629 100644 --- a/Arcade_MiST/IremM72 Hardware/rtl/board_b_d.sv +++ b/Arcade_MiST/IremM72 Hardware/rtl/board_b_d.sv @@ -37,8 +37,9 @@ module board_b_d ( input MWR, input IORD, input IOWR, - input CHARA, - input CHARA_P, + input a_memrq, + input b_memrq, + input palette_memrq, input NL, input [8:0] VE, @@ -50,12 +51,12 @@ module board_b_d ( output P1L, input [31:0] sdr_data_a, - output [24:1] sdr_addr_a, + output [24:0] sdr_addr_a, output sdr_req_a, input sdr_ack_a, input [31:0] sdr_data_b, - output [24:1] sdr_addr_b, + output [24:0] sdr_addr_b, output sdr_req_b, input sdr_ack_b, @@ -63,15 +64,17 @@ module board_b_d ( input en_layer_a, input en_layer_b, - input en_palette + input en_palette, + + input m84 ); // M72-B-D 1/8 // Didn't implement WAIT signal -wire WRA = MWR & CHARA & ~A[15]; -wire WRB = MWR & CHARA & A[15]; -wire RDA = MRD & CHARA & ~A[15]; -wire RDB = MRD & CHARA & A[15]; +wire WRA = MWR & a_memrq; +wire WRB = MWR & b_memrq; +wire RDA = MRD & a_memrq; +wire RDB = MRD & b_memrq; wire VSCKA = IOWR & (IO_A[7:6] == 2'b10) & (IO_A[3:1] == 3'b000); wire HSCKA = IOWR & (IO_A[7:6] == 2'b10) & (IO_A[3:1] == 3'b001); @@ -89,9 +92,9 @@ wire [15:0] DOUT_A, DOUT_B; assign DOUT = pal_dout_valid ? pal_dout : RDA ? DOUT_A : DOUT_B; assign DOUT_VALID = RDA | RDB | pal_dout_valid; -wire [17:0] addr_a, addr_b; -assign sdr_addr_a = { REGION_BG_A.base_addr[24:19], addr_a }; -assign sdr_addr_b = { REGION_BG_B.base_addr[24:19], addr_b }; +wire [20:0] addr_a, addr_b; +assign sdr_addr_a = { REGION_BG_A.base_addr[24:21], addr_a }; +assign sdr_addr_b = { m84 ? REGION_BG_A.base_addr[24:21] : REGION_BG_B.base_addr[24:21], addr_b }; board_b_d_layer layer_a( .CLK_32M(CLK_32M), @@ -125,7 +128,9 @@ board_b_d_layer layer_a( .sdr_ack(sdr_ack_a), .enabled(en_layer_a), - .paused(paused) + .paused(paused), + + .m84(m84) ); board_b_d_layer layer_b( @@ -160,7 +165,9 @@ board_b_d_layer layer_b( .sdr_ack(sdr_ack_b), .enabled(en_layer_b), - .paused(paused) + .paused(paused), + + .m84(m84) ); wire [4:0] r_out, g_out, b_out; @@ -176,8 +183,9 @@ assign P1L = ~(CP15A & a_opaque) & ~(CP15B & b_opaque) & ~(CP8A & BITA[3]) & ~(C kna91h014 kna91h014( .CLK_32M(CLK_32M), + .CE_PIX(CE_PIX), - .G(CHARA_P), + .G(palette_memrq), .SELECT(S), .CA({COLA, BITA}), .CB({COLB, BITB}), diff --git a/Arcade_MiST/IremM72 Hardware/rtl/board_b_d_layer.sv b/Arcade_MiST/IremM72 Hardware/rtl/board_b_d_layer.sv index 7f59dac3..b2e287bf 100644 --- a/Arcade_MiST/IremM72 Hardware/rtl/board_b_d_layer.sv +++ b/Arcade_MiST/IremM72 Hardware/rtl/board_b_d_layer.sv @@ -40,51 +40,83 @@ module board_b_d_layer( input [8:0] HE, output [3:0] BIT, - output [3:0] COL, - output CP15, - output CP8, + output reg [3:0] COL, + output reg CP15, + output reg CP8, input [31:0] sdr_data, - output [17:0] sdr_addr, - output sdr_req, + output [20:0] sdr_addr, + output reg sdr_req, input sdr_ack, input enabled, - input paused + input paused, + + input m84 ); -assign DOUT = { dout_h, dout_l }; +assign DOUT = A[1] ? { dout_11, dout_10 } : { dout_01 , dout_00 }; -wire [7:0] dout_h, dout_l; +wire [7:0] dout_00, dout_01, dout_10, dout_11; -dpramv #(.widthad_a(13)) ram_l +dpramv #(.widthad_a(12)) ram_00 ( .clock_a(CLK_32M), - .address_a(A[13:1]), - .q_a(dout_l), - .wren_a(WR & BYTE_SEL[0]), + .address_a(A[13:2]), + .q_a(dout_00), + .wren_a(WR & ~A[1] & BYTE_SEL[0]), .data_a(DIN[7:0]), .clock_b(CLK_32M), - .address_b({SV[8:3], SH[8:2]}), + .address_b({SV[8:3], SH[8:3]}), .data_b(), .wren_b(1'd0), - .q_b(ram_l_dout) + .q_b(ram_00_dout) ); -dpramv #(.widthad_a(13)) ram_h +dpramv #(.widthad_a(12)) ram_01 ( .clock_a(CLK_32M), - .address_a(A[13:1]), - .q_a(dout_h), - .wren_a(WR & BYTE_SEL[1]), + .address_a(A[13:2]), + .q_a(dout_01), + .wren_a(WR & ~A[1] & BYTE_SEL[1]), .data_a(DIN[15:8]), .clock_b(CLK_32M), - .address_b({SV[8:3], SH[8:2]}), + .address_b({SV[8:3], SH[8:3]}), .data_b(), .wren_b(1'd0), - .q_b(ram_h_dout) + .q_b(ram_01_dout) +); + +dpramv #(.widthad_a(12)) ram_10 +( + .clock_a(CLK_32M), + .address_a(A[13:2]), + .q_a(dout_10), + .wren_a(WR & A[1] & BYTE_SEL[0]), + .data_a(DIN[7:0]), + + .clock_b(CLK_32M), + .address_b({SV[8:3], SH[8:3]}), + .data_b(), + .wren_b(1'd0), + .q_b(ram_10_dout) +); + +dpramv #(.widthad_a(12)) ram_11 +( + .clock_a(CLK_32M), + .address_a(A[13:2]), + .q_a(dout_11), + .wren_a(WR & A[1] & BYTE_SEL[1]), + .data_a(DIN[15:8]), + + .clock_b(CLK_32M), + .address_b({SV[8:3], SH[8:3]}), + .data_b(), + .wren_b(1'd0), + .q_b(ram_11_dout) ); reg [31:0] rom_data; @@ -109,39 +141,37 @@ kna6034201 kna6034201( ); wire [8:0] SV = VE + adj_v; -wire [8:0] SH = ( HE + adj_h ) ^ { 6'b0, {3{NL}} }; +wire [8:0] SH = ( ( m84 ? HE - 9'd4 : HE ) + adj_h ) ^ { 6'b0, {3{NL}} }; reg [8:0] adj_v; reg [8:0] adj_h; reg HREV1, VREV, HREV2; -reg [13:0] COD; -reg [7:0] row_data1, row_data; +reg [15:0] COD; wire [2:0] RV = SV[2:0] ^ {3{VREV}}; -wire [7:0] ram_h_dout, ram_l_dout; +wire [7:0] ram_00_dout, ram_01_dout, ram_10_dout, ram_11_dout; +wire [15:0] attrib_0 = { ram_01_dout, ram_00_dout }; +wire [15:0] attrib_1 = { ram_11_dout, ram_10_dout }; -assign COL = row_data[3:0]; -assign CP15 = row_data[7]; -assign CP8 = row_data[6]; assign BIT = (HREV2 ^ NL) ? BITR : BITF; //reg [17:0] paused_offsets[512]; -//reg [8:0] ve_latch; +reg [8:0] ve_latch; always @(posedge CLK_32M) begin - //ve_latch <= VE; - //if (paused) begin - //{adj_v, adj_h} <= paused_offsets[ve_latch]; - //end else begin +// ve_latch <= VE; +// if (paused) begin +// {adj_v, adj_h} <= paused_offsets[ve_latch]; +// end else begin if (VSCK & ~IO_A[0]) adj_v[7:0] <= IO_DIN[7:0]; if (HSCK & ~IO_A[0]) adj_h[7:0] <= IO_DIN[7:0]; if (VSCK & IO_A[0]) adj_v[8] <= IO_DIN[0]; if (HSCK & IO_A[0]) adj_h[8] <= IO_DIN[0]; - //paused_offsets[ve_latch] <= {adj_v, adj_h}; - //end +// paused_offsets[ve_latch] <= {adj_v, adj_h}; +// end end always @(posedge CLK_32M) begin @@ -150,7 +180,7 @@ always @(posedge CLK_32M) begin do_rom <= 0; if (do_rom) begin - sdr_addr <= {COD[13:0], RV[2:0], 1'b0}; + sdr_addr <= {COD[15:0], RV[2:0], 2'b00}; sdr_req <= ~sdr_req; end else if (sdr_req == sdr_ack) begin rom_data <= sdr_data; @@ -158,13 +188,24 @@ always @(posedge CLK_32M) begin if (CE_PIX) begin if (SH[2:0] == 2'b001) begin - { VREV, HREV1, COD } <= { ram_h_dout, ram_l_dout }; + if (m84) begin + COD <= attrib_0; + {VREV, HREV1} <= attrib_1[6:5]; + end else begin + COD <= { 2'b00, attrib_0[13:0]}; + { VREV, HREV1 } <= attrib_0[15:14]; + end do_rom <= 1; end - - if (SH[2:0] == 3'b101) row_data1 <= ram_l_dout; if (SH[2:0] == 3'b111) begin - row_data <= row_data1; + COL <= attrib_1[3:0]; + if (m84) begin + CP15 <= attrib_1[8]; + CP8 <= attrib_1[7]; + end else begin + CP15 <= attrib_1[7]; + CP8 <= attrib_1[6]; + end HREV2 <= HREV1; end end diff --git a/Arcade_MiST/IremM72 Hardware/rtl/kna70h015.sv b/Arcade_MiST/IremM72 Hardware/rtl/kna70h015.sv index e863726b..9d3dc1a4 100644 --- a/Arcade_MiST/IremM72 Hardware/rtl/kna70h015.sv +++ b/Arcade_MiST/IremM72 Hardware/rtl/kna70h015.sv @@ -23,9 +23,8 @@ module kna70h015 ( input CE_PIX, - input [15:0] D, - input A0, - input ISET, + input [1:0] iset, + input [15:0] iset_data, input NL, input S24H, @@ -88,12 +87,8 @@ V.Sync Pulse = 384us (6) */ always @(posedge CLK_32M) begin - if (ISET) begin - if (A0) - h_int_line[8] <= D[0]; - else - h_int_line[7:0] <= D[7:0]; - end + if (iset[1]) h_int_line[8] <= iset_data[8]; + if (iset[0]) h_int_line[7:0] <= iset_data[7:0]; if (CE_PIX) begin h_count <= h_count + 10'd1; diff --git a/Arcade_MiST/IremM72 Hardware/rtl/kna91h014.v b/Arcade_MiST/IremM72 Hardware/rtl/kna91h014.v index e009c9cc..fe42751e 100644 --- a/Arcade_MiST/IremM72 Hardware/rtl/kna91h014.v +++ b/Arcade_MiST/IremM72 Hardware/rtl/kna91h014.v @@ -20,6 +20,7 @@ module kna91h014 ( input CLK_32M, + input CE_PIX, input [7:0] CB, // Pins 3-10. input [7:0] CA, // Pins 11-18. @@ -35,7 +36,7 @@ module kna91h014 ( input MRD, // Pin 28. input [15:0] DIN, // Pins 25, 22-19 (split to input for Verilog). - output [15:0] DOUT, // Pins 25, 22-19 (split to output for Verilog). + output reg [15:0] DOUT, // Pins 25, 22-19 (split to output for Verilog). output DOUT_VALID, input [19:0] A, // Pins 53-60 @@ -48,16 +49,7 @@ module kna91h014 ( wire [7:0] A_IN = A[8:1]; wire [2:0] A_S = { A[11], A[10], A[0] }; -reg [7:0] color_addr; - -always @(posedge CLK_32M) begin - color_addr <= SELECT ? CA : CB; -end - -// Palette RAMs... -reg [4:0] ram_a [256]; -reg [4:0] ram_b [256]; -reg [4:0] ram_c [256]; +wire [7:0] color_addr = SELECT ? CA : CB; // RAM Addr decoding... wire ram_a_cs = A_S==3'b000 | A_S==3'b110; @@ -68,39 +60,32 @@ wire ram_c_cs = A_S==3'b100; wire wr_ena = G & MWR; wire rd_ena = G & MRD; -wire ram_wr_a = ram_a_cs & wr_ena; -wire ram_wr_b = ram_b_cs & wr_ena; -wire ram_wr_c = ram_c_cs & wr_ena; - -reg [4:0] red_lat; -reg [4:0] grn_lat; -reg [4:0] blu_lat; - -// DOUT read driver... -assign DOUT = { 11'd0, - (ram_a_cs) ? red_lat : - (ram_b_cs) ? grn_lat : - (ram_c_cs) ? blu_lat : 5'h00 }; assign DOUT_VALID = rd_ena; +// Palette RAM(s) +reg [4:0] ram[1024]; +reg [1:0] cnt; +reg [4:0] color_out; + +always @(negedge CLK_32M) +begin + cnt <= cnt + 1'd1; + if (CE_PIX) cnt <= 0; + color_out <= ram[{cnt, color_addr}]; + case(cnt) + 2'b01: RED <= color_out; + 2'b10: GRN <= color_out; + 2'b11: BLU <= color_out; + default: ; + endcase +end + +wire [9:0] ram_a = {ram_a_cs ? 2'b00 : ram_b_cs ? 2'b01 : ram_c_cs ? 2'b10 : 2'b11, A_IN}; + always @(posedge CLK_32M) begin - red_lat <= ram_a[A_IN]; - if (ram_wr_a) - ram_a[A_IN] <= DIN[4:0]; - - grn_lat <= ram_b[A_IN]; - if (ram_wr_b) - ram_b[A_IN] <= DIN[4:0]; - - blu_lat <= ram_c[A_IN]; - if (ram_wr_c) - ram_c[A_IN] <= DIN[4:0]; - - - RED <= ram_a[color_addr]; - GRN <= ram_b[color_addr]; - BLU <= ram_c[color_addr]; + DOUT <= {11'd0, ram[ram_a]}; + if (wr_ena) ram[ram_a] <= DIN[4:0]; end endmodule diff --git a/Arcade_MiST/IremM72 Hardware/rtl/m72.sv b/Arcade_MiST/IremM72 Hardware/rtl/m72.sv index 6fa6d038..85eb0fe7 100644 --- a/Arcade_MiST/IremM72 Hardware/rtl/m72.sv +++ b/Arcade_MiST/IremM72 Hardware/rtl/m72.sv @@ -58,16 +58,16 @@ module m72 ( input sdr_sprite_ack, input [31:0] sdr_bg_data_a, - output [24:1] sdr_bg_addr_a, + output [24:0] sdr_bg_addr_a, output sdr_bg_req_a, input sdr_bg_ack_a, input [31:0] sdr_bg_data_b, - output [24:1] sdr_bg_addr_b, + output [24:0] sdr_bg_addr_b, output sdr_bg_req_b, input sdr_bg_ack_b, - output [24:1] sdr_cpu_addr, + output [24:0] sdr_cpu_addr, input [15:0] sdr_cpu_dout, output [15:0] sdr_cpu_din, output reg sdr_cpu_req, @@ -82,7 +82,7 @@ module m72 ( input sdr_z80_ram_valid, output [24:0] sample_rom_addr, - input [63:0] sample_rom_data, + input [63:0] sample_rom_dout, output sample_rom_req, input sample_rom_ack, @@ -119,6 +119,8 @@ always @(posedge CLK_32M) begin end end +wire SDBEN = sound_memrq & BRQ; + reg [1:0] ce_counter_cpu; reg [1:0] ce_counter_mcu; reg ce_cpu, ce_4x_cpu, ce_mcu; @@ -165,6 +167,8 @@ wire DBEN = cpu_io_write | cpu_io_read | cpu_mem_read | cpu_mem_write; wire TNSL; +wire m84 = board_cfg.m84; + wire [15:0] cpu_mem_out; wire [19:0] cpu_mem_addr; wire [1:0] cpu_mem_sel; @@ -185,9 +189,16 @@ wire [15:0] cpu_word_out = cpu_mem_addr[0] ? { cpu_mem_out[7:0], cpu_mem_out[15: wire [19:0] cpu_word_addr = { cpu_mem_addr[19:1], 1'b0 }; wire [1:0] cpu_word_byte_sel = cpu_mem_addr[0] ? { cpu_mem_sel[0], cpu_mem_sel[1] } : cpu_mem_sel; reg [15:0] cpu_ram_rom_data; -wire [24:1] cpu_region_addr; +wire [24:0] cpu_region_addr; wire cpu_region_writable; +wire bg_a_memrq; +wire bg_b_memrq; +wire bg_palette_memrq; +wire sprite_memrq; +wire sprite_palette_memrq; +wire sound_memrq; + function [15:0] word_shuffle(input [19:0] addr, input [15:0] data); begin word_shuffle = addr[0] ? { 8'h00, data[15:8] } : data; @@ -217,7 +228,7 @@ always_ff @(posedge CLK_32M) begin if (!mem_rq_active) begin if ((ls245_en | SDBEN) && ((cpu_mem_read_w & ~cpu_mem_read_lat) || (cpu_mem_write_w & ~cpu_mem_write_lat))) begin // sdram request sdr_cpu_wr_sel <= 2'b00; - sdr_cpu_addr <= SDBEN ? {REGION_CPU2_RAM.base_addr[24:16], cpu_word_addr[15:1]} : cpu_region_addr; + sdr_cpu_addr <= SDBEN ? {REGION_SOUND.base_addr[24:16], cpu_word_addr[15:0]} : cpu_region_addr; if (cpu_mem_write & (cpu_region_writable | SDBEN)) begin sdr_cpu_wr_sel <= cpu_word_byte_sel; sdr_cpu_din <= cpu_word_out; @@ -242,13 +253,13 @@ wire COIN0 = sys_flags[0]; wire COIN1 = sys_flags[1]; wire SOFT_NL = ~sys_flags[2]; wire CBLK = sys_flags[3]; -wire BRQ = ~sys_flags[4]; +wire BRQ = ~m84 & ~sys_flags[4]; wire BANK = sys_flags[5]; wire NL = SOFT_NL ^ dip_sw[8]; // TODO BANK, CBLK, NL always @(posedge CLK_32M) begin - if (FSET & ~cpu_io_addr[0]) sys_flags <= cpu_io_out[7:0]; + if (IOWR && cpu_io_addr == 8'h02) sys_flags <= cpu_io_out[7:0]; end // mux io and memory reads @@ -263,10 +274,12 @@ always_comb begin else d16 = cpu_ram_rom_data; cpu_mem_in = word_shuffle(cpu_mem_addr, d16); - if (SW) io16 = switches; - else if (FLAG) io16 = flags; - else if (DSW) io16 = dip_sw; - else io16 = 16'hffff; + case ({cpu_io_addr[7:1], 1'b0}) + 8'h00: io16 = switches; + 8'h02: io16 = flags; + 8'h04: io16 = dip_sw; + default: io16 = 16'hffff; + endcase cpu_io_in = cpu_io_addr[0] ? io16[15:8] : io16[7:0]; end @@ -313,52 +326,37 @@ cpu v30( .sleep_savestate(paused) ); -pal_3a pal_3a( - .A(cpu_mem_addr), - .BANK(), +wire m_io = MRD | MWR; +wire sprite_dma; +wire [1:0] iset; +wire [15:0] iset_data; +wire snd_latch1_wr, snd_latch2_wr; + +address_translator address_translator( + .A(m_io ? cpu_mem_addr : {8'h00, cpu_io_addr}), + .data(m_io ? cpu_mem_out : {8'h00, cpu_io_out}), + .bytesel(m_io ? cpu_mem_sel : 2'b01), + .rd(m_io ? MRD : IORD), + .wr(m_io ? MWR : IOWR), + .M_IO(m_io), .DBEN(DBEN), - .M_IO(MRD | MWR), - .COD(), .board_cfg(board_cfg), .ls245_en(ls245_en), .sdr_addr(cpu_region_addr), .writable(cpu_region_writable), - .S() -); + .bg_a_memrq(bg_a_memrq), + .bg_b_memrq(bg_b_memrq), + .bg_palette_memrq(bg_palette_memrq), + .sprite_memrq(sprite_memrq), + .sprite_palette_memrq(sprite_palette_memrq), + .sound_memrq(sound_memrq), -wire SW, FLAG, DSW, SND, SND2, FSET, DMA_ON, ISET, INTCS; + .sprite_dma(sprite_dma), + .iset(iset), + .iset_data(iset_data), -pal_4d pal_4d( - .IOWR(IOWR), - .IORD(IORD), - .A(cpu_io_addr), - .SW(SW), - .FLAG(FLAG), - .DSW(DSW), - .SND(SND), - .SND2(SND2), - .FSET(FSET), - .DMA_ON(DMA_ON), - .ISET(ISET), - .INTCS(INTCS) -); - -wire BUFDBEN, BUFCS, OBJ_P, CHARA_P, CHARA, SOUND, SDBEN; - -pal_3d pal_3d( - .A(cpu_mem_addr), - .M_IO(MRD | MWR), - .DBEN(~DBEN), - .TNSL(1), // TODO - .BRQ(BRQ), // TODO - - .BUFDBEN(BUFDBEN), - .BUFCS(BUFCS), - .OBJ_P(OBJ_P), - .CHARA_P(CHARA_P), - .CHARA(CHARA), - .SOUND(SOUND), - .SDBEN(SDBEN) + .snd_latch1_wr(snd_latch1_wr), + .snd_latch2_wr(snd_latch2_wr) ); wire int_req, int_ack; @@ -369,7 +367,7 @@ m72_pic m72_pic( .ce(ce_cpu), .reset(~reset_n), - .cs(INTCS), + .cs((IORD | IOWR) & ~cpu_io_addr[7] & cpu_io_addr[6]), // 0x40-0x43 .wr(IOWR), .rd(0), .a0(cpu_io_addr[1]), @@ -392,9 +390,8 @@ kna70h015 kna70h015( .CLK_32M(CLK_32M), .CE_PIX(ce_pix), - .D(cpu_io_out), - .A0(cpu_io_addr[0]), - .ISET(ISET), + .iset(iset), + .iset_data(iset_data), .NL(NL), .S24H(0), @@ -441,8 +438,11 @@ board_b_d board_b_d( .MWR(MWR), .IORD(IORD), .IOWR(IOWR), - .CHARA(CHARA), - .CHARA_P(CHARA_P), + + .a_memrq(bg_a_memrq), + .b_memrq(bg_b_memrq), + .palette_memrq(bg_palette_memrq), + .NL(NL), .VE(VE), @@ -467,7 +467,9 @@ board_b_d board_b_d( .en_layer_a(en_layer_a), .en_layer_b(en_layer_b), - .en_palette(en_layer_palette) + .en_palette(en_layer_palette), + + .m84(m84) ); @@ -484,10 +486,16 @@ sound sound( .IO_A(cpu_io_addr), .IO_DIN(cpu_io_out), - .SOUND(SOUND), - .SND(SND), + .SND(snd_latch1_wr), .BRQ(BRQ), - .SND2(SND2), + .SND2(snd_latch2_wr), + + .sample_inc(z80_sample_inc), + .sample_addr(z80_sample_addr), + .sample_addr_wr(z80_sample_addr_wr), + .sample_out(z80_sample_out), + .sample_in(sample_rom_data), + .sample_ready(sample_rom_req == sample_rom_ack), .ym_audio_l(), .ym_audio_r(ym_audio), @@ -498,6 +506,8 @@ sound sound( .pause(paused), + .m84(m84), + .ram_addr(sdr_z80_ram_addr), .ram_data(sdr_z80_ram_data), .ram_dout(sdr_z80_ram_dout), @@ -514,8 +524,9 @@ wire obj_pal_dout_valid; wire [4:0] obj_pal_r, obj_pal_g, obj_pal_b; kna91h014 obj_pal( .CLK_32M(CLK_32M), + .CE_PIX(ce_pix), - .G(OBJ_P), + .G(sprite_palette_memrq), .SELECT(0), .CA(obj_pix), .CB(obj_pix), @@ -570,7 +581,7 @@ sprite sprite( .A(cpu_word_addr), .BYTE_SEL(cpu_word_byte_sel), - .BUFDBEN(BUFDBEN), + .BUFDBEN(sprite_memrq), .MRD(MRD), .MWR(MWR), @@ -580,7 +591,7 @@ sprite sprite( .pix_test(obj_pix), .TNSL(TNSL), - .DMA_ON(DMA_ON & ~sprite_freeze), + .DMA_ON(sprite_dma & ~sprite_freeze), .sdr_data(sdr_sprite_dout), .sdr_addr(sdr_sprite_addr), @@ -596,7 +607,7 @@ wire [7:0] mcu_ram_dout; wire mcu_ram_we; wire mcu_ram_int; wire mcu_ram_cs; -wire [7:0] mcu_sample_data; +wire [7:0] mcu_sample_out; dualport_mailbox_2kx16 mcu_shared_ram( .reset(~reset_n), @@ -635,12 +646,13 @@ mcu mcu( .z80_din(mculatch_data), .z80_latch_en(mculatch_en), - .sample_data(mcu_sample_data), + .sample_out(mcu_sample_out), - .sample_rom_addr(sample_rom_addr), + .sample_addr_wr(mcu_sample_addr_wr), + .sample_addr(mcu_sample_addr), + .sample_inc(mcu_sample_inc), .sample_rom_data(sample_rom_data), - .sample_rom_req(sample_rom_req), - .sample_rom_ack(sample_rom_ack), + .sample_ready(sample_rom_req == sample_rom_ack), .clk_bram(clk_bram), .bram_wr(bram_wr), @@ -652,7 +664,28 @@ mcu mcu( .dbg_rom_addr(mcu_dbg_rom_addr) ); -wire [7:0] signed_mcu_sample = mcu_sample_data - 8'h80; +wire [1:0] z80_sample_addr_wr, mcu_sample_addr_wr; +wire [7:0] z80_sample_addr, mcu_sample_addr; +wire [7:0] sample_rom_data; +wire [7:0] z80_sample_out; +wire z80_sample_inc, mcu_sample_inc; + +sample_rom sample_rom( + .clk(CLK_32M), + .reset(~reset_n), + .sample_addr_in(m84 ? z80_sample_addr : mcu_sample_addr), + .sample_addr_wr(m84 ? z80_sample_addr_wr : mcu_sample_addr_wr), + + .sample_data(sample_rom_data), + .sample_inc(m84 ? z80_sample_inc : mcu_sample_inc), + + .sample_rom_addr(sample_rom_addr), + .sample_rom_dout(sample_rom_dout), + .sample_rom_req(sample_rom_req), + .sample_rom_ack(sample_rom_ack) +); + +wire [7:0] signed_mcu_sample = ( m84 ? z80_sample_out : mcu_sample_out ) - 8'h80; reg [2:0] ce_filter_counter = 0; wire ce_filter = &ce_filter_counter; reg [15:0] filtered_mcu_sample; diff --git a/Arcade_MiST/IremM72 Hardware/rtl/m72.v b/Arcade_MiST/IremM72 Hardware/rtl/m72.v deleted file mode 100644 index d4772ad9..00000000 --- a/Arcade_MiST/IremM72 Hardware/rtl/m72.v +++ /dev/null @@ -1,813 +0,0 @@ -//============================================================================ -// Irem M72 for MiSTer FPGA - Main module -// -// Copyright (C) 2022 Martin Donlon -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -//============================================================================ - -import m72_pkg::*; - -module m72 ( - input CLK_32M, - input CLK_96M, - - input reset_n, - output reg ce_pix, - - input board_cfg_t board_cfg, - - input z80_reset_n, - - output [7:0] R, - output [7:0] G, - output [7:0] B, - - output HSync, - output VSync, - output HBlank, - output VBlank, - - output [15:0] AUDIO_L, - output [15:0] AUDIO_R, - - input [1:0] coin, - input [1:0] start_buttons, - input [3:0] p1_joystick, - input [3:0] p2_joystick, - input [3:0] p1_buttons, - input [3:0] p2_buttons, - input service_button, - input [15:0] dip_sw, - - input pause_rq, - - output [24:1] sdr_sprite_addr, - input [63:0] sdr_sprite_dout, - output sdr_sprite_req, - input sdr_sprite_rdy, - - output [24:1] sdr_bg_addr, - input [31:0] sdr_bg_dout, - output sdr_bg_req, - input sdr_bg_rdy, - - output [24:1] sdr_cpu_addr, - input [15:0] sdr_cpu_dout, - output [15:0] sdr_cpu_din, - output sdr_cpu_req, - input sdr_cpu_rdy, - output [1:0] sdr_cpu_wr_sel, - - input clk_bram, - input bram_wr, - input [7:0] bram_data, - input [19:0] bram_addr, - input [1:0] bram_cs, - - input en_layer_a, - input en_layer_b, - input en_sprites, - input en_layer_palette, - input en_sprite_palette, - input en_audio_filters, - - input sprite_freeze, - - input video_60hz, - input video_57hz, - input video_50hz, - - output ddr_debug_data_t ddr_debug_data -); - -// Divide 32Mhz clock by 4 for pixel clock -reg paused = 0; -reg [8:0] paused_v; -reg [9:0] paused_h; - -always @(posedge CLK_32M) begin - if (pause_rq & ~paused) begin - if (~ls245_en & ~DBEN & ~mem_rq_active) begin - paused <= 1; - paused_v <= V; - paused_h <= H; - end - end else if (~pause_rq & paused) begin - paused <= ~(V == paused_v && H == paused_h); - end -end - -reg [1:0] ce_counter_cpu, ce_counter_mcu; -reg ce_cpu, ce_4x_cpu, ce_mcu; - -always @(posedge CLK_32M) begin - if (!reset_n) begin - ce_cpu <= 0; - ce_4x_cpu <= 0; - ce_counter_cpu <= 0; - ce_counter_mcu <= 0; - end else begin - ce_cpu <= 0; - ce_4x_cpu <= 0; - ce_mcu <= 0; - - if (~paused) begin - if (~ls245_en && ~mem_rq_active) begin // stall main cpu while fetching from sdram - ce_counter_cpu <= ce_counter_cpu + 2'd1; - ce_4x_cpu <= 1; - ce_cpu <= &ce_counter_cpu; - end - ce_counter_mcu <= ce_counter_mcu + 2'd1; - ce_mcu <= &ce_counter_mcu; - end - end -end - -wire ce_pix_half; -jtframe_frac_cen #(2) pixel_cen -( - .clk(CLK_32M), - .n(video_57hz ? 10'd115 : video_60hz ? 10'd207 : 10'd1), - .m(video_57hz ? 10'd444 : video_60hz ? 10'd760 : 10'd4), - .cen({ce_pix_half, ce_pix}) -); - -wire clock = CLK_32M; - -/* Global signals from schematics */ -wire IOWR = cpu_io_write; // IO Write -wire IORD = cpu_io_read; // IO Read -wire MWR = cpu_mem_write; // Mem Write -wire MRD = cpu_mem_read; // Mem Read -wire DBEN = cpu_io_write | cpu_io_read | cpu_mem_read | cpu_mem_write; - -wire TNSL; - -wire [15:0] cpu_mem_out; -wire [19:0] cpu_mem_addr; -wire [1:0] cpu_mem_sel; -reg cpu_mem_read_lat, cpu_mem_write_lat; -wire cpu_mem_read_w, cpu_mem_write_w; -wire cpu_mem_read = cpu_mem_read_w | cpu_mem_read_lat; -wire cpu_mem_write = cpu_mem_write_w | cpu_mem_write_lat; - -wire cpu_io_read, cpu_io_write; -wire [7:0] cpu_io_in; -wire [7:0] cpu_io_out; -wire [7:0] cpu_io_addr; - -wire [15:0] cpu_mem_in; - - -wire [15:0] cpu_word_out = cpu_mem_addr[0] ? { cpu_mem_out[7:0], 8'h00 } : cpu_mem_out; -wire [19:0] cpu_word_addr = { cpu_mem_addr[19:1], 1'b0 }; -wire [1:0] cpu_word_byte_sel = cpu_mem_addr[0] ? { cpu_mem_sel[0], 1'b0 } : cpu_mem_sel; -reg [15:0] cpu_ram_rom_data; -wire [24:1] cpu_region_addr; -wire cpu_region_writable; - -function [15:0] word_shuffle(input [19:0] addr, input [15:0] data); - begin - word_shuffle = addr[0] ? { 8'h00, data[15:8] } : data; - end -endfunction - -reg mem_rq_active = 0; -reg b_d_dout_valid_lat, obj_pal_dout_valid_lat, sound_dout_valid_lat, sprite_dout_valid_lat; - -always @(posedge CLK_32M or negedge reset_n) -begin - if (!reset_n) begin - b_d_dout_valid_lat <= 0; - obj_pal_dout_valid_lat <= 0; - sound_dout_valid_lat <= 0; - sprite_dout_valid_lat <= 0; - end else begin - cpu_mem_read_lat <= cpu_mem_read_w; - cpu_mem_write_lat <= cpu_mem_write_w; - - b_d_dout_valid_lat <= b_d_dout_valid; - obj_pal_dout_valid_lat <= obj_pal_dout_valid; - sound_dout_valid_lat <= sound_dout_valid; - sprite_dout_valid_lat <= sprite_dout_valid; - end -end - -reg sdr_cpu_rq, sdr_cpu_ack, sdr_cpu_rq2; - -always_ff @(posedge CLK_96M) begin - sdr_cpu_req <= 0; - if (sdr_cpu_rdy) sdr_cpu_ack <= sdr_cpu_rq; - if (sdr_cpu_rq != sdr_cpu_rq2) begin - sdr_cpu_req <= 1; - sdr_cpu_rq2 <= sdr_cpu_rq; - end -end - - -always_ff @(posedge CLK_32M or negedge reset_n) begin - if (!reset_n) begin - mem_rq_active <= 0; - end else begin - if (!mem_rq_active) begin - if (ls245_en && ((cpu_mem_read_w & ~cpu_mem_read_lat) || (cpu_mem_write_w & ~cpu_mem_write_lat))) begin // sdram request - sdr_cpu_wr_sel <= 2'b00; - sdr_cpu_addr <= cpu_region_addr; - if (cpu_mem_write & cpu_region_writable ) begin - sdr_cpu_wr_sel <= cpu_word_byte_sel; - sdr_cpu_din <= cpu_word_out; - end - sdr_cpu_rq <= ~sdr_cpu_rq; - mem_rq_active <= 1; - end - end else if (sdr_cpu_rq == sdr_cpu_ack) begin - cpu_ram_rom_data <= sdr_cpu_dout; - mem_rq_active <= 0; - end - end -end - -wire ls245_en, rom0_ce, rom1_ce, ram_cs2; - - -wire [15:0] switches = { p2_buttons, p2_joystick, p1_buttons, p1_joystick }; -wire [15:0] flags = { 8'hff, TNSL, 1'b1, 1'b1 /*TEST*/, 1'b1 /*R*/, coin, start_buttons }; - -reg [7:0] sys_flags = 0; -wire COIN0 = sys_flags[0]; -wire COIN1 = sys_flags[1]; -wire SOFT_NL = ~sys_flags[2]; -wire CBLK = sys_flags[3]; -wire BRQ = ~sys_flags[4]; -wire BANK = sys_flags[5]; -wire NL = SOFT_NL ^ dip_sw[8]; - -// TODO BANK, CBLK, NL -always @(posedge CLK_32M) begin - if (FSET & ~cpu_io_addr[0]) sys_flags <= cpu_io_out[7:0]; -end - -// mux io and memory reads -always_comb begin - bit [15:0] d16; - bit [15:0] io16; - - if (b_d_dout_valid_lat) d16 = b_d_dout; - else if (obj_pal_dout_valid_lat) d16 = obj_pal_dout; - else if (sound_dout_valid_lat) d16 = sound_dout; - else if (sprite_dout_valid_lat) d16 = sprite_dout; - else if (cpu_mem_addr[19:16] == 4'hb) d16 = cpu_shared_ram_dout; - else d16 = cpu_ram_rom_data; - cpu_mem_in = word_shuffle(cpu_mem_addr, d16); - - if (SW) io16 = switches; - else if (FLAG) io16 = flags; - else if (DSW) io16 = dip_sw; - else io16 = 16'hffff; - - cpu_io_in = cpu_io_addr[0] ? io16[15:8] : io16[7:0]; -end - -cpu v30( - .clk(CLK_32M), - .ce(ce_cpu), // TODO - .ce_4x(ce_4x_cpu), // TODO - .reset(~reset_n), - .turbo(0), - .SLOWTIMING(0), - - .cpu_idle(), - .cpu_halt(), - .cpu_irqrequest(), - .cpu_prefix(), - - .dma_active(0), - .sdma_request(0), - .canSpeedup(), - - .bus_read(cpu_mem_read_w), - .bus_write(cpu_mem_write_w), - .bus_be(cpu_mem_sel), - .bus_addr(cpu_mem_addr), - .bus_datawrite(cpu_mem_out), - .bus_dataread(cpu_mem_in), - - .irqrequest_in(int_req), - .irqvector_in(int_vector), - .irqrequest_ack(int_ack), - - .load_savestate(0), - - // TODO - .cpu_done(), - .cpu_export_opcode(cpu_export_opcode), - .cpu_export_reg_cs(cpu_export_reg_cs), - .cpu_export_reg_ip(cpu_export_reg_ip), - - .RegBus_Din(cpu_io_out), - .RegBus_Adr(cpu_io_addr), - .RegBus_wren(cpu_io_write), - .RegBus_rden(cpu_io_read), - .RegBus_Dout(cpu_io_in), - - .sleep_savestate(paused) -); - -wire [15:0] cpu_export_reg_cs; -wire [15:0] cpu_export_reg_ip; -wire [7:0] cpu_export_opcode; - -assign ddr_debug_data.cpu_cs = cpu_export_reg_cs; -assign ddr_debug_data.cpu_ip = cpu_export_reg_ip; -assign ddr_debug_data.cpu_opcode = cpu_export_opcode; - -pal_3a pal_3a( - .A(cpu_mem_addr), - .BANK(), - .DBEN(DBEN), - .M_IO(MRD | MWR), - .COD(), - .board_cfg(board_cfg), - .ls245_en(ls245_en), - .sdr_addr(cpu_region_addr), - .writable(cpu_region_writable), - .S() -); - -wire SW, FLAG, DSW, SND, SND2, FSET, DMA_ON, ISET, INTCS; - -pal_4d pal_4d( - .IOWR(IOWR), - .IORD(IORD), - .A(cpu_io_addr), - .SW(SW), - .FLAG(FLAG), - .DSW(DSW), - .SND(SND), - .SND2(SND2), - .FSET(FSET), - .DMA_ON(DMA_ON), - .ISET(ISET), - .INTCS(INTCS) -); - -wire BUFDBEN, BUFCS, OBJ_P, CHARA_P, CHARA, SOUND, SDBEN; - -pal_3d pal_3d( - .A(cpu_mem_addr), - .M_IO(MRD | MWR), - .DBEN(~DBEN), - .TNSL(1), // TODO - .BRQ(BRQ), // TODO - - .BUFDBEN(BUFDBEN), - .BUFCS(BUFCS), - .OBJ_P(OBJ_P), - .CHARA_P(CHARA_P), - .CHARA(CHARA), - .SOUND(SOUND), - .SDBEN(SDBEN) -); - -wire int_req, int_ack; -wire [8:0] int_vector; - -m72_pic m72_pic( - .clk(CLK_32M), - .ce(ce_cpu), - .reset(~reset_n), - - .cs(INTCS), - .wr(IOWR), - .rd(0), - .a0(cpu_io_addr[1]), - - .din(cpu_io_out), - - .int_req(int_req), - .int_vector(int_vector), - .int_ack(int_ack), - - .intp({5'd0, HINT, 1'b0, VBLK}) -); - -wire [8:0] VE, V; -wire [9:0] HE, H; -wire HBLK, VBLK, HS, VS; -wire HINT; - -assign HSync = HS; -assign HBlank = HBLK; -assign VSync = VS; -assign VBlank = VBLK; - -kna70h015 kna70h015( - .CLK_32M(CLK_32M), - - .CE_PIX(ce_pix), - .D(cpu_io_out), - .A0(cpu_io_addr[0]), - .ISET(ISET), - .NL(NL), - .S24H(0), - - .CLD(), - .CPBLK(), - - .VE(VE), - .V(V), - .HE(HE), - .H(H), - - .HBLK(HBLK), - .VBLK(VBLK), - .HINT(HINT), - - .HS(HS), - .VS(VS), - - .video_50hz(video_50hz) -); - -wire [15:0] b_d_dout; -wire b_d_dout_valid; - -wire [4:0] char_r, char_g, char_b; -wire P1L; - -board_b_d board_b_d( - .CLK_32M(CLK_32M), - .CLK_96M(CLK_96M), - - .CE_PIX(ce_pix), - - .DOUT(b_d_dout), - .DOUT_VALID(b_d_dout_valid), - - .DIN(cpu_word_out), - .A(cpu_word_addr), - .BYTE_SEL(cpu_word_byte_sel), - - .IO_DIN(cpu_io_out), - .IO_A(cpu_io_addr), - - .MRD(MRD), - .MWR(MWR), - .IORD(IORD), - .IOWR(IOWR), - .CHARA(CHARA), - .CHARA_P(CHARA_P), - .NL(NL), - - .VE(VE), - .HE({HE[9], HE[7:0]}), - - - .RED(char_r), - .GREEN(char_g), - .BLUE(char_b), - .P1L(P1L), - - .sdr_data(sdr_bg_dout), - .sdr_addr(sdr_bg_addr), - .sdr_req(sdr_bg_req), - .sdr_rdy(sdr_bg_rdy), - - .paused(paused), - - .en_layer_a(en_layer_a), - .en_layer_b(en_layer_b), - .en_palette(en_layer_palette) -); - - -wire [15:0] sound_dout; -wire sound_dout_valid; - -wire [7:0] snd_io_addr; -wire [7:0] snd_io_data; -wire snd_io_req; - -wire [15:0] ym_audio; - -sound sound( - .CLK_32M(CLK_32M), - .DIN(cpu_mem_out), - .DOUT(sound_dout), - .DOUT_VALID(sound_dout_valid), - - .A(cpu_mem_addr), - .BYTE_SEL(cpu_mem_sel), - - .IO_A(cpu_io_addr), - .IO_DIN(cpu_io_out), - - .SDBEN(SDBEN), - .SOUND(SOUND), - .SND(SND), - .BRQ(BRQ), - .MRD(MRD), - .MWR(MWR), - .SND2(SND2), - - .ym_audio_l(), - .ym_audio_r(ym_audio), - - .snd_io_addr(snd_io_addr), - .snd_io_data(snd_io_data), - .snd_io_req(snd_io_req), - - .pause(paused) -); - -// Temp A-C board palette -wire [15:0] obj_pal_dout; -wire obj_pal_dout_valid; - - -wire [4:0] obj_pal_r, obj_pal_g, obj_pal_b; -kna91h014 obj_pal( - .CLK_32M(CLK_32M), - - .G(OBJ_P), - .SELECT(0), - .CA(obj_pix), - .CB(obj_pix), - - .E1_N(), // TODO - .E2_N(), // TODO - - .MWR(MWR & cpu_word_byte_sel[0]), - .MRD(MRD), - - .DIN(cpu_word_out), - .DOUT(obj_pal_dout), - .DOUT_VALID(obj_pal_dout_valid), - .A(cpu_word_addr), - - .RED(obj_pal_r), - .GRN(obj_pal_g), - .BLU(obj_pal_b) -); - -wire [4:0] obj_r = en_sprite_palette ? obj_pal_r : { obj_pix[3:0], 1'b0 }; -wire [4:0] obj_g = en_sprite_palette ? obj_pal_g : { obj_pix[3:0], 1'b0 }; -wire [4:0] obj_b = en_sprite_palette ? obj_pal_b : { obj_pix[3:0], 1'b0 }; - -wire P0L = (|obj_pix[3:0]) && en_sprites; - -assign R = ~CBLK ? ( (P0L & P1L) ? {obj_r[4:0], obj_r[4:2]} : {char_r[4:0], char_r[4:2]} ) : 8'h00; -assign G = ~CBLK ? ( (P0L & P1L) ? {obj_g[4:0], obj_g[4:2]} : {char_g[4:0], char_g[4:2]} ) : 8'h00; -assign B = ~CBLK ? ( (P0L & P1L) ? {obj_b[4:0], obj_b[4:2]} : {char_b[4:0], char_b[4:2]} ) : 8'h00; - -wire [15:0] sprite_dout; -wire sprite_dout_valid; - -wire [7:0] obj_pix; - -sprite sprite( - .CLK_32M(CLK_32M), - .CLK_96M(CLK_96M), - .CE_PIX(ce_pix), - - .DIN(cpu_word_out), - .DOUT(sprite_dout), - .DOUT_VALID(sprite_dout_valid), - - .A(cpu_word_addr), - .BYTE_SEL(cpu_word_byte_sel), - - .BUFDBEN(BUFDBEN), - .MRD(MRD), - .MWR(MWR), - - .VE(VE), - .NL(NL), - .HBLK(HBLK), - .pix_test(obj_pix), - - .TNSL(TNSL), - .DMA_ON(DMA_ON & ~sprite_freeze), - - .sdr_data(sdr_sprite_dout), - .sdr_addr(sdr_sprite_addr), - .sdr_req(sdr_sprite_req), - .sdr_rdy(sdr_sprite_rdy) -); - - -wire [15:0] cpu_shared_ram_dout; -wire [11:0] mcu_ram_addr; -wire [7:0] mcu_ram_din; -wire [7:0] mcu_ram_dout; -wire mcu_ram_we; -wire mcu_ram_int; -wire mcu_ram_cs; -wire [7:0] mcu_sample_data; - -dualport_mailbox_2kx16 mcu_shared_ram( - .reset(~reset_n), - .clk_l(CLK_32M), - .addr_l(cpu_word_addr[11:1]), - .cs_l(1'b1), - .din_l(cpu_word_out), - .dout_l(cpu_shared_ram_dout), - .we_l((cpu_word_addr[19:16] == 4'hb && MWR) ? cpu_word_byte_sel : 2'b00), - .int_l(), - - .clk_r(CLK_32M), - .cs_r(mcu_ram_cs), - .addr_r(mcu_ram_addr[11:0]), - .din_r(mcu_ram_dout), - .dout_r(mcu_ram_din), - .we_r(mcu_ram_we), - .int_r(mcu_ram_int) -); - -wire [7:0] mculatch_data = board_cfg.main_mculatch ? cpu_io_out : snd_io_data; -wire mculatch_en = board_cfg.main_mculatch ? ( IOWR && cpu_io_addr == 8'hc0 ) : ( snd_io_req && snd_io_addr == 8'h82 ); - -mcu mcu( - .CLK_32M(CLK_32M), - .ce_8m(ce_mcu), - .reset(~reset_n), - - .ext_ram_addr(mcu_ram_addr), - .ext_ram_din(mcu_ram_din), - .ext_ram_dout(mcu_ram_dout), - .ext_ram_cs(mcu_ram_cs), - .ext_ram_we(mcu_ram_we), - .ext_ram_int(mcu_ram_int), - - .z80_din(mculatch_data), - .z80_latch_en(mculatch_en), - - .sample_data(mcu_sample_data), - - .clk_bram(clk_bram), - .bram_wr(bram_wr), - .bram_data(bram_data), - .bram_addr(bram_addr), - .bram_prom_cs(bram_cs[0]), - .bram_samples_cs(bram_cs[1]), - - .dbg_rom_addr(mcu_dbg_rom_addr) -); - -wire [7:0] signed_mcu_sample = mcu_sample_data - 8'h80; -reg [2:0] ce_filter_counter = 0; -wire ce_filter = &ce_filter_counter; -reg [15:0] filtered_mcu_sample; -reg [15:0] filtered_ym_audio; - -// 3.5Khz 2nd order low pass filter with additional 10dB attenuation -IIR_filter #( .use_params(1), .stereo(0), .coeff_x(0.00004185087102461337 * 0.31622776601), .coeff_x0(2), .coeff_x1(1), .coeff_x2(0), .coeff_y0(-1.99222499379830120247), .coeff_y1(0.99225510233860669818), .coeff_y2(0)) samples_lpf ( - .clk(CLK_32M), - .reset(~reset_n), - - .ce(ce_filter), - .sample_ce(1), - - .cx(), - .cx0(), - .cx1(), - .cx2(), - .cy0(), - .cy1(), - .cy2(), - - .input_l({signed_mcu_sample[7:0], 8'd0}), - .input_r(), - .output_l(filtered_mcu_sample), - .output_r() -); - - -// 9khz 1st order, 10khz 2nd order -IIR_filter #( .use_params(1), .stereo(0), .coeff_x(0.00000476166826258131), .coeff_x0(3), .coeff_x1(3), .coeff_x2(1), .coeff_y0(-2.96374831301152275032), .coeff_y1(2.92805248787211569450), .coeff_y2(-0.96430074919997255112)) music_lpf ( - .clk(CLK_32M), - .reset(~reset_n), - - .ce(ce_filter), - .sample_ce(1), - - .cx(), - .cx0(), - .cx1(), - .cx2(), - .cy0(), - .cy1(), - .cy2(), - - .input_l(ym_audio), - .input_r(), - .output_l(filtered_ym_audio), - .output_r() -); - -reg [16:0] audio_out; - -assign AUDIO_L = audio_out[16:1]; -assign AUDIO_R = audio_out[16:1]; - -always @(posedge CLK_32M) begin - ce_filter_counter <= ce_filter_counter + 3'd1; - - if (en_audio_filters) - audio_out <= {filtered_ym_audio[15], filtered_ym_audio[15:0]} + {filtered_mcu_sample[15], filtered_mcu_sample[15:0]}; - else - audio_out <= {ym_audio[15], ym_audio[15:0]} + {{signed_mcu_sample[7:0], 9'd0}}; -end - - - - - - - - - - - - - - - - - -reg [11:0] dbg_cpu_ext_addr; -reg [15:0] dbg_cpu_ext_data; -reg [1:0] dbg_cpu_ext_we; - -assign ddr_debug_data.cpu_ext_addr = dbg_cpu_ext_addr; -assign ddr_debug_data.cpu_ext_data = dbg_cpu_ext_data; -assign ddr_debug_data.cpu_ext_we = dbg_cpu_ext_we; - -// CPU debug -always @(posedge CLK_32M) begin - reg cs; - reg [11:0] addr; - reg [15:0] data; - reg [1:0] we; - - cs <= (cpu_word_addr[19:16] == 4'hb) && ( MWR || MRD ); - addr <= cpu_word_addr[11:0]; - data <= cpu_word_out; - we <= MWR ? cpu_word_byte_sel : 2'b00; - - if (cs & ~((cpu_word_addr[19:16] == 4'hb) && ( MWR || MRD ))) begin - dbg_cpu_ext_addr <= addr; - dbg_cpu_ext_we <= we; - if (we != 2'b00) dbg_cpu_ext_data <= data; - else dbg_cpu_ext_data <= cpu_shared_ram_dout; - end -end - -reg [11:0] dbg_mcu_ext_addr; -reg [7:0] dbg_mcu_ext_data; -reg dbg_mcu_ext_we; - -assign ddr_debug_data.mcu_ext_addr = dbg_mcu_ext_addr; -assign ddr_debug_data.mcu_ext_data = dbg_mcu_ext_data; -assign ddr_debug_data.mcu_ext_we = dbg_mcu_ext_we; - -// MCU debug -always @(posedge CLK_32M) begin - reg cs; - reg [11:0] addr; - reg [7:0] data; - reg we; - - cs <= mcu_ram_cs; - addr <= mcu_ram_addr; - data <= mcu_ram_dout; - we <= mcu_ram_we; - - if (cs & ~mcu_ram_cs) begin - dbg_mcu_ext_addr <= addr; - dbg_mcu_ext_we <= we; - if (we) dbg_mcu_ext_data <= data; - else dbg_mcu_ext_data <= mcu_ram_din; - end -end - - -wire [15:0] mcu_dbg_rom_addr; -reg [15:0] latched_mcu_dbg_rom_addr; -assign ddr_debug_data.mcu_rom_addr = latched_mcu_dbg_rom_addr; -always @(posedge CLK_32M) if (ce_cpu) latched_mcu_dbg_rom_addr <= mcu_dbg_rom_addr; - -endmodule diff --git a/Arcade_MiST/IremM72 Hardware/rtl/m72_pkg.sv b/Arcade_MiST/IremM72 Hardware/rtl/m72_pkg.sv index 84713388..7064db13 100644 --- a/Arcade_MiST/IremM72 Hardware/rtl/m72_pkg.sv +++ b/Arcade_MiST/IremM72 Hardware/rtl/m72_pkg.sv @@ -23,30 +23,36 @@ package m72_pkg; typedef struct packed { bit [24:0] base_addr; bit reorder_64; - bit [1:0] bram_cs; + bit [3:0] bram_cs; } region_t; - parameter region_t REGION_CPU_ROM = '{ 25'h000000, 0, 2'b00 }; - parameter region_t REGION_SPRITE = '{ 25'h100000, 1, 2'b00 }; - parameter region_t REGION_BG_A = '{ 25'h200000, 0, 2'b00 }; - parameter region_t REGION_BG_B = '{ 25'h300000, 0, 2'b00 }; - parameter region_t REGION_MCU = '{ 25'h000000, 0, 2'b01 }; - parameter region_t REGION_SAMPLES = '{ 25'h600000, 0, 2'b00 }; + parameter region_t REGION_CPU_ROM = '{ 25'h000000, 0, 4'b0000 }; + parameter region_t REGION_SPRITE = '{ 25'h100000, 1, 4'b0000 }; + parameter region_t REGION_BG_A = '{ 25'h200000, 0, 4'b0000 }; + parameter region_t REGION_BG_B = '{ 25'h400000, 0, 4'b0000 }; + parameter region_t REGION_MCU = '{ 25'h000000, 0, 4'b0001 }; + parameter region_t REGION_SAMPLES = '{ 25'h600000, 0, 4'b0000 }; + parameter region_t REGION_OFFSETS = '{ 25'h000000, 0, 4'b0100 }; + parameter region_t REGION_PROTECT = '{ 25'h000000, 0, 4'b1000 }; + parameter region_t REGION_SOUND = '{ 25'h500000, 0, 4'b0000 }; - parameter region_t LOAD_REGIONS[6] = '{ + parameter region_t LOAD_REGIONS[9] = '{ REGION_CPU_ROM, REGION_SPRITE, REGION_BG_A, REGION_BG_B, REGION_MCU, - REGION_SAMPLES + REGION_SAMPLES, + REGION_OFFSETS, + REGION_PROTECT, + REGION_SOUND }; parameter region_t REGION_CPU_RAM = '{ 25'h400000, 0, 2'b00 }; - parameter region_t REGION_CPU2_RAM = '{ 25'h500000, 0, 2'b00 }; typedef struct packed { - bit [3:0] reserved; + bit [2:0] reserved; + bit m84; bit main_mculatch; bit [2:0] memory_map; } board_cfg_t; diff --git a/Arcade_MiST/IremM72 Hardware/rtl/mcu.sv b/Arcade_MiST/IremM72 Hardware/rtl/mcu.sv index c314de0e..7b4be1ed 100644 --- a/Arcade_MiST/IremM72 Hardware/rtl/mcu.sv +++ b/Arcade_MiST/IremM72 Hardware/rtl/mcu.sv @@ -36,12 +36,13 @@ module mcu( input z80_latch_en, // sample output, 8-bit unsigned - output reg [7:0] sample_data, + output reg [7:0] sample_out, - output reg [24:0] sample_rom_addr, - input [63:0] sample_rom_data, - output reg sample_rom_req = 0, - input sample_rom_ack, + output reg [1:0] sample_addr_wr, + output reg [7:0] sample_addr, + output reg sample_inc, + input [7:0] sample_rom_data, + input sample_ready, // ioctl input clk_bram, @@ -61,13 +62,13 @@ reg ram_we, ram_cs; wire [7:0] sample_port; reg [3:0] delayed_ce_count = 0; -wire delayed_ce = ce_8m & ~|delayed_ce_count & sample_rom_req == sample_rom_ack; +wire delayed_ce = ce_8m & ~|delayed_ce_count & sample_ready; always @(posedge CLK_32M) begin if (reset) - sample_data <= 8'h80; + sample_out <= 8'h80; else - sample_data <= sample_port; + sample_out <= sample_port; end dpramv #(.widthad_a(7)) internal_ram @@ -100,24 +101,18 @@ dpramv #(.widthad_a(13)) prom .q_b() ); -wire [7:0] sample_data_dout; -reg [7:0] sample_data_latch; -reg [17:0] sample_addr; - reg [7:0] z80_latch; reg z80_latch_int = 0; -reg [7:0] ext_dout; -reg [15:0] ext_addr; -reg ext_cs, ext_we; +wire [7:0] ext_dout; +wire [15:0] ext_addr; +wire ext_cs, ext_we; enum { SAMPLE, Z80, RAM } ext_src = SAMPLE; -always @(posedge CLK_32M) begin +assign sample_addr = ext_dout; - if (reset) begin - sample_rom_addr[17:0] <= 18'h3FFFF; - end +always @(posedge CLK_32M) begin if (z80_latch_en) begin z80_latch <= z80_din; @@ -128,6 +123,8 @@ always @(posedge CLK_32M) begin ext_ram_cs <= 0; ext_ram_we <= 0; + sample_inc <= 0; + sample_addr_wr <= 0; if (delayed_ce) begin dbg_rom_addr <= prom_addr; @@ -135,17 +132,14 @@ always @(posedge CLK_32M) begin if (ext_cs) begin casex (ext_addr) 16'h0000: if (ext_we) begin - sample_addr[12:0] <= { ext_dout, 5'd0 }; + sample_addr_wr <= 2'b01; end else begin ext_src <= SAMPLE; - sample_addr <= sample_addr + 18'd1; - sample_rom_addr <= {REGION_SAMPLES.base_addr[24:18], sample_addr[17:0]}; - if(sample_addr[17:3] != sample_rom_addr[17:3]) - sample_rom_req <= ~sample_rom_req; + sample_inc <= 1; end 16'h0001: if (ext_we) begin - sample_addr[17:13] <= ext_dout[4:0]; + sample_addr_wr <= 2'b10; end 16'h0002: if (ext_we) begin @@ -167,20 +161,7 @@ always @(posedge CLK_32M) begin end end -always @(*) begin - case(sample_rom_addr[2:0]) - 3'd0: sample_data_dout = sample_rom_data[ 7: 0]; - 3'd1: sample_data_dout = sample_rom_data[15: 8]; - 3'd2: sample_data_dout = sample_rom_data[23:16]; - 3'd3: sample_data_dout = sample_rom_data[31:24]; - 3'd4: sample_data_dout = sample_rom_data[39:32]; - 3'd5: sample_data_dout = sample_rom_data[47:40]; - 3'd6: sample_data_dout = sample_rom_data[55:48]; - default: sample_data_dout = sample_rom_data[63:56]; - endcase; -end - -wire [7:0] ext_din = ext_src == SAMPLE ? sample_data_dout : ext_src == Z80 ? z80_latch : ext_ram_din; +wire [7:0] ext_din = ext_src == SAMPLE ? sample_rom_data : ext_src == Z80 ? z80_latch : ext_ram_din; reg [12:0] prom_addr; wire [12:0] pre_prom_addr; @@ -190,17 +171,7 @@ wire [6:0] pre_ram_addr; wire [7:0] pre_ram_dout; wire pre_ram_we, pre_ram_cs; -wire [7:0] pre_ext_dout; -wire [15:0] pre_ext_addr; -wire pre_ext_cs; -wire pre_ext_we; - always @(posedge CLK_32M) begin - ext_dout <= pre_ext_dout; - ext_addr <= pre_ext_addr; - ext_cs <= pre_ext_cs; - ext_we <= pre_ext_we; - if (delayed_ce) begin ram_dout <= pre_ram_dout; ram_addr <= pre_ram_addr; @@ -236,10 +207,10 @@ mc8051_core mc8051( // external ram .datax_i(ext_din), - .datax_o(pre_ext_dout), - .adrx_o(pre_ext_addr), - .memx_o(pre_ext_cs), - .wrx_o(pre_ext_we) + .datax_o(ext_dout), + .adrx_o(ext_addr), + .memx_o(ext_cs), + .wrx_o(ext_we) ); endmodule \ No newline at end of file diff --git a/Arcade_MiST/IremM72 Hardware/rtl/pal.sv b/Arcade_MiST/IremM72 Hardware/rtl/pal.sv index c2421f91..1bc1304e 100644 --- a/Arcade_MiST/IremM72 Hardware/rtl/pal.sv +++ b/Arcade_MiST/IremM72 Hardware/rtl/pal.sv @@ -22,125 +22,178 @@ import m72_pkg::*; -module pal_3a +module address_translator ( input logic [19:0] A, + input logic [15:0] data, + input logic [1:0] bytesel, + + input logic rd, + input logic wr, input board_cfg_t board_cfg, - input logic BANK, input logic DBEN, input logic M_IO, - input logic [12:0] COD, output logic ls245_en, // TODO this signal might be better named - output [24:1] sdr_addr, + output [24:0] sdr_addr, output writable, - output logic S + + output bg_a_memrq, // CHARA + output bg_b_memrq, // CHARA + output bg_palette_memrq, // CHARA_P + + output sprite_memrq, // + output sprite_palette_memrq, // OBJ_P + output sound_memrq, + + output sprite_dma, + output [1:0] iset, + output [15:0] iset_data, + + output snd_latch1_wr, + output snd_latch2_wr ); + assign snd_latch1_wr = ~M_IO & wr & ( A[7:0] == 8'h00 ); + assign snd_latch2_wr = (board_cfg.m84) ? 1'b0 : ( ~M_IO & wr & ( A[7:0] == 8'hc0)); + always_comb begin case (board_cfg.memory_map) 0: begin casex (A[19:16]) - 4'b010x: begin ls245_en = DBEN & M_IO; writable = 1; sdr_addr = REGION_CPU_RAM.base_addr[24:1] | A[16:1]; end - 4'b00xx: begin ls245_en = DBEN & M_IO; writable = 0; sdr_addr = REGION_CPU_ROM.base_addr[24:1] | A[17:1]; end - 4'b1111: begin ls245_en = DBEN & M_IO; writable = 0; sdr_addr = REGION_CPU_ROM.base_addr[24:1] | A[17:1]; end + 4'b010x: begin ls245_en = DBEN & M_IO; writable = 1; sdr_addr = REGION_CPU_RAM.base_addr[24:0] | A[16:0]; end + 4'b00xx: begin ls245_en = DBEN & M_IO; writable = 0; sdr_addr = REGION_CPU_ROM.base_addr[24:0] | A[17:0]; end + 4'b1111: begin ls245_en = DBEN & M_IO; writable = 0; sdr_addr = REGION_CPU_ROM.base_addr[24:0] | A[17:0]; end default: begin ls245_en = 0; writable = 0; sdr_addr = 24'd0; end endcase end 1: begin casex (A[19:16]) - 4'b1010: begin ls245_en = DBEN & M_IO; writable = 1; sdr_addr = REGION_CPU_RAM.base_addr[24:1] | A[16:1]; end - 4'b0xxx: begin ls245_en = DBEN & M_IO; writable = 0; sdr_addr = REGION_CPU_ROM.base_addr[24:1] | A[18:1]; end - 4'b1111: begin ls245_en = DBEN & M_IO; writable = 0; sdr_addr = REGION_CPU_ROM.base_addr[24:1] | A[18:1]; end + 4'b1010: begin ls245_en = DBEN & M_IO; writable = 1; sdr_addr = REGION_CPU_RAM.base_addr[24:0] | A[16:0]; end + 4'b0xxx: begin ls245_en = DBEN & M_IO; writable = 0; sdr_addr = REGION_CPU_ROM.base_addr[24:0] | A[18:0]; end + 4'b1111: begin ls245_en = DBEN & M_IO; writable = 0; sdr_addr = REGION_CPU_ROM.base_addr[24:0] | A[18:0]; end default: begin ls245_en = 0; writable = 0; sdr_addr = 24'd0; end endcase end 2: begin casex (A[19:16]) - 4'b100x: begin ls245_en = DBEN & M_IO; writable = 1; sdr_addr = REGION_CPU_RAM.base_addr[24:1] | A[16:1]; end - 4'b0xxx: begin ls245_en = DBEN & M_IO; writable = 0; sdr_addr = REGION_CPU_ROM.base_addr[24:1] | A[18:1]; end - 4'b1111: begin ls245_en = DBEN & M_IO; writable = 0; sdr_addr = REGION_CPU_ROM.base_addr[24:1] | A[18:1]; end + 4'b100x: begin ls245_en = DBEN & M_IO; writable = 1; sdr_addr = REGION_CPU_RAM.base_addr[24:0] | A[16:0]; end + 4'b0xxx: begin ls245_en = DBEN & M_IO; writable = 0; sdr_addr = REGION_CPU_ROM.base_addr[24:0] | A[18:0]; end + 4'b1111: begin ls245_en = DBEN & M_IO; writable = 0; sdr_addr = REGION_CPU_ROM.base_addr[24:0] | A[18:0]; end default: begin ls245_en = 0; writable = 0; sdr_addr = 24'd0; end endcase end - - default: begin - ls245_en = 0; - writable = 0; - sdr_addr = 0; - end - + + 3,4: begin + casex (A[19:16]) + 4'b1110: begin ls245_en = DBEN & M_IO; writable = 1; sdr_addr = REGION_CPU_RAM.base_addr[24:0] | A[16:0]; end + 4'b0xxx: begin ls245_en = DBEN & M_IO; writable = 0; sdr_addr = REGION_CPU_ROM.base_addr[24:0] | A[18:0]; end + 4'b1111: begin ls245_en = DBEN & M_IO; writable = 0; sdr_addr = REGION_CPU_ROM.base_addr[24:0] | A[18:0]; end + default: begin ls245_en = 0; writable = 0; sdr_addr = 24'd0; end + endcase + end + + default: begin + ls245_en = 0; + writable = 0; + sdr_addr = 0; + end + endcase - - S = COD[11]; end -endmodule - -module pal_4d -( - input logic IOWR, - input logic IORD, - input logic [7:0] A, - - output logic SW, - output logic FLAG, - output logic DSW, - output logic SND, - output logic SND2, - output logic FSET, - output logic DMA_ON, - output logic ISET, - output logic INTCS -); - always_comb begin - SW = IORD & !A[7] & !A[6] & !A[3] & !A[2] & !A[1]; - FLAG = IORD & !A[7] & !A[6] & !A[3] & !A[2] & A[1]; - DSW = IORD & !A[7] & !A[6] & !A[3] & A[2] & !A[1]; - SND = IOWR & !A[7] & !A[6] & !A[3] & !A[2] & !A[1]; - SND2 = IOWR & A[7] & A[6] & !A[3] & !A[2] & !A[1]; - FSET = IOWR & !A[7] & !A[6] & !A[3] & !A[2] & A[1]; - DMA_ON = IOWR & !A[7] & !A[6] & !A[3] & A[2] & !A[1]; - ISET = IOWR & !A[7] & !A[6] & !A[3] & A[2] & A[1]; - INTCS = (IOWR | IORD) & !A[7] & A[6]; + bg_a_memrq = 0; + bg_b_memrq = 0; + bg_palette_memrq = 0; + sprite_memrq = 0; + sprite_palette_memrq = 0; + sound_memrq = 0; + + case (board_cfg.memory_map) + // M84 rtype2 + 3: begin + casex (A[19:12]) + // 0xc0xxx + 8'b1100_0000: sprite_memrq = 1; + // 0xc8xxx + 8'b1100_1000: sprite_palette_memrq = 1; + // 0xd8xxx + 8'b1101_1000: bg_palette_memrq = 1; + // 0xd0000 - 0xd3fff + 8'b1101_00xx: bg_a_memrq = 1; + // 0xd4000 - 0xd7fff + 8'b1101_01xx: bg_b_memrq = 1; + default: begin end// nothing + endcase + end + // M84 Hammerin' Harry + 4: begin + casex (A[19:12]) + // 0xc0xxx + 8'b1100_0000: sprite_memrq = 1; + // 0xa0xxx + 8'b1010_0000: sprite_palette_memrq = 1; + // 0xa8xxx + 8'b1010_1000: bg_palette_memrq = 1; + // 0xd0000 - 0xd3fff + 8'b1101_00xx: bg_a_memrq = 1; + // 0xd4000 - 0xd7fff + 8'b1101_01xx: bg_b_memrq = 1; + default: begin end// nothing + endcase + end + + // M72 + default: begin + casex (A[19:12]) + // 0xc0xxx + 8'b1100_0000: sprite_memrq = 1; + // 0xc8xxx + 8'b1100_1000: sprite_palette_memrq = 1; + // 0xccxxx + 8'b1100_1100: bg_palette_memrq = 1; + // 0xd0000 - 0xd3fff + 8'b1101_00xx: bg_a_memrq = 1; + // 0xd8000 - 0xdbfff + 8'b1101_10xx: bg_b_memrq = 1; + // 0xexxxx + 8'b1110_xxxx: sound_memrq = 1; + default: begin end// nothing + endcase + end + endcase end -endmodule - -module pal_3d -( - input logic [19:0] A, - input logic M_IO, - input logic DBEN, - input logic TNSL, - input logic BRQ, - - output logic BUFDBEN, - output logic BUFCS, - output logic OBJ_P, - output logic CHARA_P, - output logic CHARA, - output logic SOUND, - output logic SDBEN -); - always_comb begin - BUFDBEN = A[19] & A[18] & !A[17] & !A[16] & !A[15] & !A[14] & M_IO & !DBEN & TNSL; + sprite_dma = 0; + iset_data = 16'd0; + iset = 2'b00; - BUFCS = TNSL & (!A[19] | !A[18] | A[17] | A[16] | A[15] | A[14] | !M_IO); // TODO unused, neg M_IO is not safe here - - OBJ_P = A[19] & A[18] & !A[17] & !A[16] & A[15] & !A[14] & M_IO; - - CHARA_P = A[19] & A[18] & !A[17] & !A[16] & A[15] & A[14] & M_IO; - - CHARA = A[19] & A[18] & !A[17] & A[16] & M_IO; - - SOUND = A[19] & A[18] & A[17] & !A[16] & M_IO; - - SDBEN = A[19] & A[18] & A[17] & !A[16] & M_IO & !DBEN & BRQ; + // M84 + if (board_cfg.m84) begin + if (M_IO & wr) begin + sprite_dma = A == 20'hbc000; + if (A == 20'hb0000) begin + iset = bytesel; + iset_data = data; + end else if (A == 20'hb0001) begin + iset = 2'b10; + iset_data = { data[7:0], 8'h00 }; + end + end + end else begin + if (!M_IO & wr) begin + sprite_dma = A == 8'h04; + if (A == 8'h06) begin + iset = 2'b01; + iset_data = { 8'h00, data[7:0] }; + end else if (A == 8'h07) begin + iset = 2'b10; + iset_data = { data[7:0], 8'h00 }; + end + end + end end - endmodule - diff --git a/Arcade_MiST/IremM72 Hardware/rtl/rom.sv b/Arcade_MiST/IremM72 Hardware/rtl/rom.sv index a9b2b8c5..7ceb27f4 100644 --- a/Arcade_MiST/IremM72 Hardware/rtl/rom.sv +++ b/Arcade_MiST/IremM72 Hardware/rtl/rom.sv @@ -30,7 +30,7 @@ module rom_loader output ioctl_wait, - output [24:1] sdr_addr, + output [24:0] sdr_addr, output [15:0] sdr_data, output [1:0] sdr_be, output reg sdr_req, @@ -38,7 +38,7 @@ module rom_loader output [19:0] bram_addr, output [7:0] bram_data, - output reg [1:0] bram_cs, + output reg [3:0] bram_cs, output bram_wr, output board_cfg_t board_cfg @@ -47,14 +47,14 @@ module rom_loader reg [24:0] base_addr; reg reorder_64; reg [24:0] offset; -reg [31:0] size; +reg [23:0] size; enum { BOARD_CFG, + REGION_IDX, SIZE_0, SIZE_1, SIZE_2, - SIZE_3, SDR_DATA, BRAM_DATA } stage = BOARD_CFG; @@ -73,20 +73,23 @@ always @(posedge sys_clk) begin if (ioctl_wr) begin case (stage) - BOARD_CFG: begin board_cfg <= board_cfg_t'(ioctl_data); stage <= SIZE_0; end - SIZE_0: begin size[31:24] <= ioctl_data; stage <= SIZE_1; end - SIZE_1: begin size[23:16] <= ioctl_data; stage <= SIZE_2; end - SIZE_2: begin size[15:8] <= ioctl_data; stage <= SIZE_3; end - SIZE_3: begin + BOARD_CFG: begin board_cfg <= board_cfg_t'(ioctl_data); stage <= REGION_IDX; end + REGION_IDX: begin + if (ioctl_data == 8'hff) region <= region + 4'd1; + else region <= ioctl_data[3:0]; + stage <= SIZE_0; + end + SIZE_0: begin size[23:16] <= ioctl_data; stage <= SIZE_1; end + SIZE_1: begin size[15:8] <= ioctl_data; stage <= SIZE_2; end + SIZE_2: begin size[7:0] <= ioctl_data; base_addr <= LOAD_REGIONS[region].base_addr; reorder_64 <= LOAD_REGIONS[region].reorder_64; bram_cs <= LOAD_REGIONS[region].bram_cs; - region <= region + 4'd1; offset <= 25'd0; - if ({size[31:8], ioctl_data} == 32'd0) - stage <= SIZE_0; + if ({size[23:8], ioctl_data} == 24'd0) + stage <= REGION_IDX; else if (LOAD_REGIONS[region].bram_cs != 0) stage <= BRAM_DATA; else @@ -94,16 +97,16 @@ always @(posedge sys_clk) begin end SDR_DATA: begin if (reorder_64) - sdr_addr <= base_addr[24:1] + {offset[24:7], offset[5:2], offset[6], offset[1]}; + sdr_addr <= base_addr[24:0] + {offset[24:7], offset[5:2], offset[6], offset[1:0]}; else - sdr_addr <= base_addr[24:1] + offset[24:1]; + sdr_addr <= base_addr[24:0] + offset[24:0]; sdr_data = {ioctl_data, ioctl_data}; sdr_be <= { offset[0], ~offset[0] }; offset <= offset + 25'd1; sdr_req <= ~sdr_req; ioctl_wait <= 1; - if (offset == ( size - 1)) stage <= SIZE_0; + if (offset == ( size - 1)) stage <= REGION_IDX; end BRAM_DATA: begin bram_addr <= offset[19:0]; @@ -111,7 +114,7 @@ always @(posedge sys_clk) begin bram_wr <= 1; offset <= offset + 25'd1; - if (offset == ( size - 1)) stage <= SIZE_0; + if (offset == ( size - 1)) stage <= REGION_IDX; end endcase end diff --git a/Arcade_MiST/IremM72 Hardware/rtl/sample_rom.sv b/Arcade_MiST/IremM72 Hardware/rtl/sample_rom.sv new file mode 100644 index 00000000..1248a70b --- /dev/null +++ b/Arcade_MiST/IremM72 Hardware/rtl/sample_rom.sv @@ -0,0 +1,49 @@ +module sample_rom( + input clk, + input reset, + + input [7:0] sample_addr_in, + input [1:0] sample_addr_wr, + + output reg [7:0] sample_data, + input sample_inc, + + // ioctl + output reg [24:0] sample_rom_addr, + input [63:0] sample_rom_dout, + output reg sample_rom_req = 0, + input sample_rom_ack +); + +reg [17:0] sample_addr = 0; + +always_ff @(posedge clk) begin + if (sample_inc) begin + sample_addr <= sample_addr + 18'd1; + sample_rom_addr <= {REGION_SAMPLES.base_addr[24:18], sample_addr[17:0]}; + if(sample_addr[17:3] != sample_rom_addr[17:3]) + sample_rom_req <= ~sample_rom_req; + end + + if (sample_addr_wr[0]) sample_addr[12:0] <= {sample_addr_in, 5'd0}; + if (sample_addr_wr[1]) begin + sample_addr[17:13] <= sample_addr_in[4:0]; + sample_rom_addr <= {REGION_SAMPLES.base_addr[24:18], sample_addr_in[4:0], sample_addr[12:0]}; + sample_rom_req <= ~sample_rom_req; + end +end + +always @(*) begin + case(sample_rom_addr[2:0]) + 3'd0: sample_data = sample_rom_dout[ 7: 0]; + 3'd1: sample_data = sample_rom_dout[15: 8]; + 3'd2: sample_data = sample_rom_dout[23:16]; + 3'd3: sample_data = sample_rom_dout[31:24]; + 3'd4: sample_data = sample_rom_dout[39:32]; + 3'd5: sample_data = sample_rom_dout[47:40]; + 3'd6: sample_data = sample_rom_dout[55:48]; + default: sample_data = sample_rom_dout[63:56]; + endcase; +end + +endmodule diff --git a/Arcade_MiST/IremM72 Hardware/rtl/sdram_4w.sv b/Arcade_MiST/IremM72 Hardware/rtl/sdram_4w.sv index ba594201..a5804623 100644 --- a/Arcade_MiST/IremM72 Hardware/rtl/sdram_4w.sv +++ b/Arcade_MiST/IremM72 Hardware/rtl/sdram_4w.sv @@ -98,7 +98,7 @@ module sdram_4w ( input sample_req, output reg sample_ack = 0, input [22:1] sample_addr, - output reg [63:0] sample_data, + output reg [63:0] sample_q, input sp_req, output reg sp_ack = 0, @@ -434,7 +434,7 @@ always @(posedge clk) begin PORT_REQ : port2_q[15:0] <= sd_din; PORT_GFX1 : gfx1_q[15:0] <= sd_din; PORT_GFX2 : gfx2_q[15:0] <= sd_din; - PORT_SAMPLE: sample_data[15:0] <= sd_din; + PORT_SAMPLE: sample_q[15:0] <= sd_din; PORT_SP : sp_q[15:0] <= sd_din; default: ; endcase; @@ -449,22 +449,22 @@ always @(posedge clk) begin PORT_REQ : begin port2_q[31:16] <= sd_din; port2_ack <= port2_req; end PORT_GFX1 : begin gfx1_q[31:16] <= sd_din; gfx1_ack <= gfx1_req; end PORT_GFX2 : begin gfx2_q[31:16] <= sd_din; gfx2_ack <= gfx2_req; end - PORT_SAMPLE: sample_data[31:16] <= sd_din; + PORT_SAMPLE: sample_q[31:16] <= sd_din; PORT_SP : sp_q[31:16] <= sd_din; default: ; endcase; end if(t == STATE_READ1c && oe_latch[1]) begin case(port[1]) - PORT_SAMPLE: sample_data[47:32] <= sd_din; - PORT_SP: sp_q[47:32] <= sd_din; + PORT_SAMPLE: sample_q[47:32] <= sd_din; + PORT_SP: sp_q[47:32] <= sd_din; default: ; endcase; end if(t == STATE_READ1d && oe_latch[1]) begin case(port[1]) - PORT_SAMPLE: begin sample_data[63:48] <= sd_din; sample_ack <= sample_req; end - PORT_SP: begin sp_q[63:48] <= sd_din; sp_ack <= sp_req; end + PORT_SAMPLE: begin sample_q[63:48] <= sd_din; sample_ack <= sample_req; end + PORT_SP: begin sp_q[63:48] <= sd_din; sp_ack <= sp_req; end default: ; endcase; end diff --git a/Arcade_MiST/IremM72 Hardware/rtl/sound.sv b/Arcade_MiST/IremM72 Hardware/rtl/sound.sv index 0f092395..6a7af489 100644 --- a/Arcade_MiST/IremM72 Hardware/rtl/sound.sv +++ b/Arcade_MiST/IremM72 Hardware/rtl/sound.sv @@ -29,13 +29,21 @@ module sound ( output [7:0] snd_io_data, output snd_io_req, - input SOUND, + output reg sample_inc, + output [7:0] sample_addr, + output reg [1:0] sample_addr_wr, + output reg [7:0] sample_out, + input [7:0] sample_in, + input sample_ready, + input SND, input SND2, input BRQ, input pause, + input m84, + output [15:0] ym_audio_l, output [15:0] ym_audio_r, @@ -58,14 +66,15 @@ jtframe_frac_cen #(2) jt51_cen .cen({CE_AUDIO_P1, CE_AUDIO}) ); +wire ram_region = m84 ? &ram_addr[15:12] : 1'b1; assign ram_cs = ~z80_MREQ_n & z80_IORQ_n & z80_RFSH_n; -assign ram_we = ~z80_WR_n; +assign ram_we = ~z80_WR_n & ram_region; wire [7:0] SD_IN = z80_dout; wire [7:0] SD_OUT; wire SA0 = z80_addr[0]; -wire SCS = ~z80_IORQ_n && (z80_addr[2:1] == 2'b00); +wire SCS = ~z80_IORQ_n & ~|z80_addr[7:1]; wire SIRQ_N; wire SRESET; wire SWR_N = z80_WR_n; @@ -74,15 +83,38 @@ wire M1_n; wire [15:0] z80_addr; wire z80_IORQ_n, z80_RD_n, z80_WR_n, z80_MREQ_n, z80_M1_n, z80_RFSH_n; -assign ram_addr = {REGION_CPU2_RAM.base_addr[24:16], z80_addr}; +assign ram_addr = {REGION_SOUND.base_addr[24:16], z80_addr}; assign ram_data = z80_dout; -wire [7:0] z80_din = ( ~z80_M1_n & ~z80_IORQ_n ) ? {2'b11, ~snd_latch1_ready, SIRQ_N, 4'b1111} : - ( ~z80_RD_n & ~z80_IORQ_n & (z80_addr[2:1] == 2'b01)) ? snd_latch1 : - ( ~z80_RD_n & ~z80_IORQ_n & (z80_addr[2:1] == 2'b10)) ? snd_latch2 : - ( ~z80_RD_n & SCS ) ? SD_OUT : - ( ~z80_RD_n ) ? ram_dout : 8'hff; +reg [7:0] z80_din; wire [7:0] z80_dout; +always_comb begin + z80_din = 8'hff; + if ( ~z80_M1_n & ~z80_IORQ_n ) begin + z80_din = {2'b11, ~snd_latch1_ready, SIRQ_N, 4'b1111}; + end else if ( ~z80_RD_n ) begin + if (SCS) begin + z80_din = SD_OUT; + end else if (~z80_IORQ_n) begin + if (m84) begin + casex (z80_addr[7:0]) + 8'h80: z80_din = snd_latch1; + 8'h84: z80_din = sample_in; + default: z80_din = 8'hff; + endcase + end else begin + casex (z80_addr[7:0]) + 8'bxxxx_x01x: z80_din = snd_latch1; + 8'bxxxx_x10x: z80_din = snd_latch2; + default: z80_din = 8'hff; + endcase + end + end else begin + z80_din = ram_dout; + end + end +end + assign snd_io_addr = z80_addr[7:0]; assign snd_io_req = ~z80_IORQ_n; assign snd_io_data = z80_dout; @@ -90,7 +122,7 @@ assign snd_io_data = z80_dout; T80s z80( .RESET_n(~BRQ & reset_n), .CLK(CLK_32M), - .CEN(CE_AUDIO & ~pause & ~(ram_cs & ~ram_valid)), + .CEN(CE_AUDIO & ~pause & ~(ram_cs & ~ram_valid) & sample_ready), .INT_n(~(~SIRQ_N | snd_latch1_ready)), .BUSRQ_n(~BRQ), .M1_n(z80_M1_n), @@ -102,7 +134,7 @@ T80s z80( .A(z80_addr), .DI(z80_din), .DO(z80_dout), - .NMI_n(~snd_latch2_ready) + .NMI_n(m84 ? ~m84_nmi : ~snd_latch2_ready) ); jt51 ym2151( @@ -126,11 +158,23 @@ reg snd_latch1_ready = 0; reg [7:0] snd_latch2; reg snd_latch2_ready = 0; +reg [11:0] nmi_counter = 0; +reg m84_nmi = 0; +reg z80_IORQ_n_old; +assign sample_addr = z80_dout; + always @(posedge CLK_32M) begin + sample_inc <= 0; + sample_addr_wr <= 2'b00; + if (~reset_n) begin - snd_latch1_ready <= 0; - snd_latch2_ready <= 0; - end else begin + m84_nmi <= 0; + nmi_counter <= 0; + end else if (~pause) begin + + nmi_counter <= nmi_counter + 12'd1; + if (&nmi_counter) m84_nmi <= 1; + if (SND & ~IO_A[0]) begin snd_latch1 <= IO_DIN[7:0]; snd_latch1_ready <= 1; @@ -141,10 +185,33 @@ always @(posedge CLK_32M) begin snd_latch2_ready <= 1; end - if (~z80_IORQ_n & ~z80_WR_n & z80_addr[2:1] == 2'b11) snd_latch1_ready <= 0; - if (~z80_IORQ_n & ~z80_RD_n & (z80_addr[2:1] == 2'b10)) snd_latch2_ready <= 0; - end + if (~z80_M1_n && ~z80_MREQ_n && z80_addr == 16'h0066) + m84_nmi <= 0; + z80_IORQ_n_old <= z80_IORQ_n; + if (z80_IORQ_n_old & ~z80_IORQ_n) begin + + if (m84) begin + if (~z80_WR_n & z80_addr[7:0] == 8'h80) begin + sample_addr_wr <= 2'b01; + end + + if (~z80_WR_n & z80_addr[7:0] == 8'h81) begin + sample_addr_wr <= 2'b10; + end + + if (~z80_WR_n & z80_addr[7:0] == 8'h82) begin + sample_out <= z80_dout; + sample_inc <= 1; + end + + if (~z80_WR_n & z80_addr[7:0] == 8'h83) snd_latch1_ready <= 0; + end else begin + if (~z80_WR_n & z80_addr[2:1] == 2'b11) snd_latch1_ready <= 0; + if (~z80_RD_n & (z80_addr[2:1] == 2'b10)) snd_latch2_ready <= 0; + end + end + end end endmodule diff --git a/Arcade_MiST/IremM72 Hardware/rtl/sprite.sv b/Arcade_MiST/IremM72 Hardware/rtl/sprite.sv index 6678c687..dca16b0e 100644 --- a/Arcade_MiST/IremM72 Hardware/rtl/sprite.sv +++ b/Arcade_MiST/IremM72 Hardware/rtl/sprite.sv @@ -230,7 +230,7 @@ always_ff @(posedge CLK_96M) begin st <= st; // wait else begin line_buffer_color <= obj_color; - line_buffer_x = obj_org_x + ( 10'd16 * span ); + line_buffer_x <= obj_org_x + ( 10'd16 * span ); line_buffer_req <= ~line_buffer_ack; end end