From 56ca4e31374de47fef08ce84b942b6d7e8355d67 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Mon, 3 Feb 2020 22:12:15 +0100 Subject: [PATCH] Scramble HW: add more games --- .../Scramble_MiST/README.txt | 8 + .../Scramble_MiST/Scramble.qsf | 2 + .../Scramble_MiST/meta/Atlantis.arc | 4 + .../Scramble_MiST/meta/Dark Planet.arc | 4 + .../Scramble_MiST/meta/Lost Tomb.arc | 1 + .../Scramble_MiST/meta/Mars.arc | 4 + .../Scramble_MiST/meta/Mighty Monkey.arc | 5 + .../Scramble_MiST/meta/Minefield.arc | 7 + .../Scramble_MiST/meta/Rescue.arc | 7 + .../Scramble_MiST/meta/StrategyX.arc | 4 + .../Scramble_MiST/meta/Turtles.arc | 4 + .../Scramble_MiST/meta/amidar.mra | 27 ++++ .../Scramble_MiST/meta/anteater.mra | 24 +++ .../Scramble_MiST/meta/armorcar.mra | 23 +++ .../Scramble_MiST/meta/atlantis.mra | 31 ++++ .../Scramble_MiST/meta/calipso.mra | 23 +++ .../Scramble_MiST/meta/darkplnt.mra | 21 +++ .../Scramble_MiST/meta/frogger.mra | 22 +++ .../Scramble_MiST/meta/losttomb.mra | 24 +++ .../Scramble_MiST/meta/mars.mra | 31 ++++ .../Scramble_MiST/meta/mimonkey.mra | 24 +++ .../Scramble_MiST/meta/minefld.mra | 23 +++ .../Scramble_MiST/meta/moonwar.mra | 23 +++ .../Scramble_MiST/meta/rescue.mra | 23 +++ .../Scramble_MiST/meta/scobra.mra | 23 +++ .../Scramble_MiST/meta/scramble.mra | 31 ++++ .../Scramble_MiST/meta/spdcoin.mra | 23 +++ .../Scramble_MiST/meta/stratgyx.mra | 23 +++ .../Scramble_MiST/meta/tazmania.mra | 23 +++ .../Scramble_MiST/meta/turtles.mra | 21 +++ .../Scramble_MiST/rtl/ScrambleMist.sv | 142 ++++++++++++++---- .../Scramble_MiST/rtl/scramble.vhd | 96 +++++++++--- .../Scramble_MiST/rtl/scramble_audio.vhd | 37 ++++- .../Scramble_MiST/rtl/scramble_pack.vhd | 12 +- .../Scramble_MiST/rtl/scramble_top.vhd | 6 +- .../Scramble_MiST/rtl/scramble_video.vhd | 136 +++++++++++++---- .../Scramble_MiST/rtl/spinner.vhd | 46 ++++++ 37 files changed, 903 insertions(+), 85 deletions(-) create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Atlantis.arc create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Dark Planet.arc create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Mars.arc create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Mighty Monkey.arc create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Minefield.arc create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Rescue.arc create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/StrategyX.arc create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Turtles.arc create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/amidar.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/anteater.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/armorcar.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/atlantis.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/calipso.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/darkplnt.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/frogger.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/losttomb.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/mars.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/mimonkey.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/minefld.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/moonwar.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/rescue.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/scobra.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/scramble.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/spdcoin.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/stratgyx.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/tazmania.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/turtles.mra create mode 100644 Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/spinner.vhd diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/README.txt b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/README.txt index 7e3dc221..f51e3b49 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/README.txt +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/README.txt @@ -3,6 +3,14 @@ -- Arcade: Scramble port to MiST by Gehstock -- 10 November 2017 -- +-- Usage: +-- Copy the RBF and the ARC files to the same folder. +-- Create ROM files from MAME ROM zip files using the mra utility and the MRA files. +-- Example: mra -z /path/to/mame/roms scramble.mra +-- Copy the ROM files to the root of the SD Card. +-- +-- MRA utilty: https://github.com/sebdel/mra-tools-c +-- --------------------------------------------------------------------------------- -- A simulation model of Scramble hardware -- Copyright (c) MikeJ - Feb 2007 diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/Scramble.qsf b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/Scramble.qsf index bd915723..1987d007 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/Scramble.qsf +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/Scramble.qsf @@ -211,5 +211,7 @@ set_global_assignment -name VHDL_FILE rtl/i82c55.vhd set_global_assignment -name QIP_FILE rtl/pll.qip set_global_assignment -name VHDL_FILE rtl/dpram.vhd set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv +set_global_assignment -name VHDL_FILE rtl/spinner.vhd set_global_assignment -name SIGNALTAP_FILE output_files/scr.stp +set_global_assignment -name SIGNALTAP_FILE output_files/vid.stp set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Atlantis.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Atlantis.arc new file mode 100644 index 00000000..1f3d7c46 --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Atlantis.arc @@ -0,0 +1,4 @@ +[ARC] +RBF=SCRAMBLE +MOD=13 +CONF=O7,Lives,3,5 diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Dark Planet.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Dark Planet.arc new file mode 100644 index 00000000..58ee2160 --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Dark Planet.arc @@ -0,0 +1,4 @@ +[ARC] +RBF=SCRAMBLE +MOD=9 + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Lost Tomb.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Lost Tomb.arc index bda920e2..aa537248 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Lost Tomb.arc +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Lost Tomb.arc @@ -1,4 +1,5 @@ [ARC] RBF=SCRAMBLE MOD=11 +CONF=O78,Lives,3,5,Free Play,Invuln. CONF=OA,Demo Sounds,Off,On diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Mars.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Mars.arc new file mode 100644 index 00000000..a93c5876 --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Mars.arc @@ -0,0 +1,4 @@ +[ARC] +RBF=SCRAMBLE +MOD=12 +CONF=O7,Lives,3,Unl diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Mighty Monkey.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Mighty Monkey.arc new file mode 100644 index 00000000..686c7ce0 --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Mighty Monkey.arc @@ -0,0 +1,5 @@ +[ARC] +RBF=SCRAMBLE +MOD=18 +CONF=O78,Lives,3,4,5,6 +CONF=O9,Infinite Lives,Off,On diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Minefield.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Minefield.arc new file mode 100644 index 00000000..45fcca0d --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Minefield.arc @@ -0,0 +1,7 @@ +[ARC] +RBF=SCRAMBLE +MOD=16 +CONF=O7,Lives,3,5 +CONF=O89,Difficulty,Easy,Medium,Hard,Hardest +CONF=OB,Start Level,1,3 +CONF=OA,Demo Sounds,Off,On diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Rescue.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Rescue.arc new file mode 100644 index 00000000..41890e67 --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Rescue.arc @@ -0,0 +1,7 @@ +[ARC] +RBF=SCRAMBLE +MOD=17 +CONF=O7,Lives,3,5 +CONF=O8,Difficulty,Easy,Hard +CONF=O9,Start Level,1,3 +CONF=OA,Demo Sounds,Off,On diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/StrategyX.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/StrategyX.arc new file mode 100644 index 00000000..01cf90fa --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/StrategyX.arc @@ -0,0 +1,4 @@ +[ARC] +RBF=SCRAMBLE +MOD=14 +CONF=O78,Lives,3,4,5,Unl diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Turtles.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Turtles.arc new file mode 100644 index 00000000..f0cbc5d2 --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Turtles.arc @@ -0,0 +1,4 @@ +[ARC] +RBF=SCRAMBLE +MOD=15 +CONF=O78,Lives,3,4,5,Unl diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/amidar.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/amidar.mra new file mode 100644 index 00000000..caeda697 --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/amidar.mra @@ -0,0 +1,27 @@ + + Amidar (Scramble hardware) + 0209 + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/anteater.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/anteater.mra new file mode 100644 index 00000000..438719bc --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/anteater.mra @@ -0,0 +1,24 @@ + + Ant Eater + 0209 + + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/armorcar.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/armorcar.mra new file mode 100644 index 00000000..800231da --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/armorcar.mra @@ -0,0 +1,23 @@ + + Armored Car + 0209 + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/atlantis.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/atlantis.mra new file mode 100644 index 00000000..332a5536 --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/atlantis.mra @@ -0,0 +1,31 @@ + + Battle of Atlantis + scramble + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/calipso.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/calipso.mra new file mode 100644 index 00000000..1f9d9347 --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/calipso.mra @@ -0,0 +1,23 @@ + + Calipso + 0209 + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/darkplnt.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/darkplnt.mra new file mode 100644 index 00000000..539be507 --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/darkplnt.mra @@ -0,0 +1,21 @@ + + Dark Planet + 0209 + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/frogger.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/frogger.mra new file mode 100644 index 00000000..2fabbfee --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/frogger.mra @@ -0,0 +1,22 @@ + + Frogger (Sega set 2) + 0209 + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/losttomb.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/losttomb.mra new file mode 100644 index 00000000..4a9bd17a --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/losttomb.mra @@ -0,0 +1,24 @@ + + Lost Tomb + 0209 + + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/mars.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/mars.mra new file mode 100644 index 00000000..9bbdfc52 --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/mars.mra @@ -0,0 +1,31 @@ + + Mars + scramble + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/mimonkey.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/mimonkey.mra new file mode 100644 index 00000000..2965d346 --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/mimonkey.mra @@ -0,0 +1,24 @@ + + Mighty Monkey + 0209 + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/minefld.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/minefld.mra new file mode 100644 index 00000000..d500174a --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/minefld.mra @@ -0,0 +1,23 @@ + + Minefield + 0209 + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/moonwar.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/moonwar.mra new file mode 100644 index 00000000..6cfc37cc --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/moonwar.mra @@ -0,0 +1,23 @@ + + Moonwar + 0209 + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/rescue.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/rescue.mra new file mode 100644 index 00000000..a58b56d4 --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/rescue.mra @@ -0,0 +1,23 @@ + + Rescue + 0209 + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/scobra.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/scobra.mra new file mode 100644 index 00000000..0166e106 --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/scobra.mra @@ -0,0 +1,23 @@ + + Super Cobra + 0209 + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/scramble.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/scramble.mra new file mode 100644 index 00000000..08a2653e --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/scramble.mra @@ -0,0 +1,31 @@ + + Scramble (Stern Electronics set 1) + 0209 + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/spdcoin.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/spdcoin.mra new file mode 100644 index 00000000..a9f7d359 --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/spdcoin.mra @@ -0,0 +1,23 @@ + + Speed Coin + 0209 + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/stratgyx.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/stratgyx.mra new file mode 100644 index 00000000..9db82b2d --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/stratgyx.mra @@ -0,0 +1,23 @@ + + Strategy X + scramble + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/tazmania.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/tazmania.mra new file mode 100644 index 00000000..25c03b86 --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/tazmania.mra @@ -0,0 +1,23 @@ + + Tazmania + 0209 + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/turtles.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/turtles.mra new file mode 100644 index 00000000..167eafbf --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/turtles.mra @@ -0,0 +1,21 @@ + + Turtles + 0209 + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/ScrambleMist.sv b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/ScrambleMist.sv index fa03e1cc..80c93704 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/ScrambleMist.sv +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/ScrambleMist.sv @@ -2,6 +2,9 @@ // Scramble Arcade HW top-level for MiST // // Scramble/Amidar/Frogger/Super Cobra/Tazzmania/Armored Car +// Moon War/Speed Coin/Calipso/Dark Planet/Anteater/Lost Tomb +// Mars/Battle Of Attlantis/Strategy X/Turtles/Rescue/Minefield +// Mighty Monkey // // 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 @@ -68,38 +71,40 @@ reg [8*8-1:0] core_name; reg [7:0] input0; reg [7:0] input1; reg [7:0] input2; +reg [1:0] orientation; always @(*) begin + orientation = 2'b11; // portrait, left input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_fireA, /*service*/1'b0, m_fireB, m_up2 }; input1 = ~{ m_one_player, m_two_players, m_left2, m_right2, m_fire2A, m_fire2B, /*lives*/~status[8:7] }; input2 = ~{ 1'b1, m_down, 1'b1, m_up, /*cabinet*/1'b1, /*coinage*/2'b11, m_down2 }; case (core_mod) - 6'h0: + 7'h0: begin core_name = "SCRAMBLE"; hwsel = 0; end - 6'h1: + 7'h1: begin core_name = "AMIDAR "; hwsel = 0; input1[1:0] = ~status[8:7]; // lives345unl //input2[1] = status[10]; // demo sounds - no effect end - 6'h2: + 7'h2: begin core_name = "FROGGER "; hwsel = 1; end - 6'h3: + 7'h3: begin core_name = "SCOBRA "; hwsel = 2; input1[0] = status[9]; // allow continue input1[1] = status[7]; // lives34 end - 6'h4: + 7'h4: begin core_name = "TAZMANIA"; hwsel = 2; @@ -107,14 +112,14 @@ always @(*) begin input1 = ~{ m_fire2A, m_fire2B, m_left2, m_right2, m_up2, m_down2, /*demosnd*/status[10], /*lives35*/status[7] }; input2 = ~{ 1'b1, m_two_players, 2'b10, 3'b111, m_one_player }; // unknown, start2, 2xunknown, cabinet, 2xcoinage, start1 end - 6'h5: + 7'h5: begin core_name = "ARMORCAR"; hwsel = 2; input1[0] = ~status[7]; //lives35 input1[1] = ~status[10]; // demo sounds end - 6'h6: + 7'h6: begin core_name = "MOONWAR "; hwsel = 2; @@ -122,7 +127,7 @@ always @(*) begin input1 = ~{ m_fireA, m_fireB, m_fireC, m_fireD, m_two_players, m_one_player, /*live345*/~status[8:7] }; input2 = ~{ 4'h0, 1'b1, 2'b11, 1'b0 }; // 4xunused, cabinet, coinage, p2fire(cocktail) end - 6'h7: + 7'h7: begin core_name = "SPDCOIN "; hwsel = 2; @@ -130,7 +135,7 @@ always @(*) begin input1 = { 4'hf, 2'b00, 1'b0, 1'b0 }; // 6xunused, freeplay, freeze input2 = { 4'hf, ~status[7], status[11], 1'b1, 1'b1}; // 4xunused, lives35, difficulty, unknown, unused end - 6'h8: + 7'h8: begin core_name = "CALIPSO "; hwsel = 3; @@ -138,31 +143,85 @@ always @(*) begin input1 = ~{ 1'b1, 1'b1, m_left2, m_right2, m_down2, m_up2, status[10], status[7] }; // unused, unused, left, right, down, up, demo sounds, lives 3/5 input2 = ~{ 5'b0, 2'b10, m_fireA | m_one_player }; // unused[7:3], coin dip[2:1], start 1p / player1 fire end - 6'h9: + 7'h9: begin - // buggy core_name = "DARKPLNT"; hwsel = 4; input0 = ~{ m_coin1, m_coin2, 3'b000, m_two_players | m_fireB, m_one_player | m_fireA, m_fireC }; - input1 = 8'h00; - input2 = 8'h00; + input1 = { darkplnt_dial_scrambled, /*lives*/status[7], /*bonus*/1'b0 }; + input2 = { /*unk*/4'hf, /*bonus life*/1'b0, /*coinage*/ 2'b10, /*unk*/1'b1 }; end - 6'hA: + 7'hA: begin core_name = "ANTEATER"; - hwsel = 5; + hwsel = 6; input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_down, m_up, m_fireA, m_fireB }; input1 = ~{ m_fire2A, m_fire2B, m_left2, m_right2, m_up2, m_down2, /*demosdns*/status[10], /*lives35*/status[7] }; input2 = ~{ 1'b1, m_two_players, 2'b10, 3'b111, m_one_player }; end - 6'hB: + 7'hB: begin core_name = "LOSTTOMB"; - hwsel = 6; + hwsel = 7; input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_down, m_up, m_one_player, m_two_players }; - input1 = ~{ 1'b0, m_fireA, m_left2, m_right2, m_down2, m_up2, 2'b01 }; + input1 = ~{ 1'b0, m_fireA, m_left2, m_right2, m_down2, m_up2, /*lives35/free play/invulnerability*/~(status[8:7]+1'd1) }; input2 = ~{ 4'h0, status[10], 2'b10, 1'b0 }; //4xunused, demo sounds, 2xcoinage, unused end + 7'hC: + begin + core_name = "MARS "; + hwsel = 10; + input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_left2 | m_fireA, m_right2 | m_fireB, 1'b0, 1'b0 }; + input1 = ~{ m_one_player, m_two_players, 4'h0, /*coinage*/2'b11 }; + input2 = ~{ m_up2 | m_fireC, m_down, m_down2 | m_fireD, m_up, /*lives*/status[7], /*unk*/1'b0, /*cabinet*/1'b1, 1'b0 }; + end + 7'hD: + begin + core_name = "ATLANTIS"; + hwsel = 0; + input1[0] = 1'b0; // upright + input1[1] = ~status[7]; // lives35 + end + 7'hE: + begin + core_name = "STRATGYX"; + hwsel = 5; + orientation = 2'b10; + input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_fireA, 1'b0, m_fireB, m_up2 }; + input1 = ~{ m_one_player, m_two_players, m_left2, m_right2, m_fire2A, m_fire2B, ~status[8:7] }; + input2 = ~{ m_fire2C, m_down, m_fireC, m_up, /*upright*/1'b1, /*coinage*/2'b00, m_down2 }; + end + 7'hF: + begin + core_name = "TURTLES "; + hwsel = 11; + input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_fireA, 1'b0, 1'b0, m_up2 }; + input1 = ~{ m_one_player, m_two_players, m_left2, m_right2, m_fire2A, 1'b0, ~status[8:7] }; + input2 = ~{ 1'b0, m_down, 1'b0, m_up, /*upright*/1'b1, /*coinage*/2'b00, m_down2 }; + end + 7'h10: + begin + core_name = "MINEFLD "; + hwsel = 8; + input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_down, m_up, /*start level*/status[11], m_fireA }; + input1 = ~{ /*2xunk*/2'b00, m_left2, m_right2, m_down2, m_up2, /*demosnd*/status[10], /*lives35*/status[7] }; + input2 = ~{ /*unk*/1'b0, m_two_players, /*2xunk*/2'b00, /*difficulty*/status[9:8], /*coinage*/1'b0, m_one_player }; + end + 7'h11: + begin + core_name = "RESCUE "; + hwsel = 9; + input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_down, m_up, /*start level*/status[9], m_fireA }; + input1 = ~{ /*2xunk*/2'b00, m_left2, m_right2, m_down2, m_up2, /*demosnd*/status[10], /*lives35*/status[7] }; + input2 = ~{ /*unk*/1'b0, m_two_players, /*2xunk*/2'b00, /*difficulty*/~status[8], /*coinage*/2'b11, m_one_player }; + end + 7'h12: + begin + core_name = "MIMONKEY"; + hwsel = 12; + input2[5] = status[9]; // infinite lives + end + default: begin hwsel = 0; @@ -190,6 +249,18 @@ pll pll( .locked(pll_locked) ); +// reset generation +reg reset = 1; +reg rom_loaded = 0; +always @(posedge clk_sys) begin + reg ioctl_downlD; + ioctl_downlD <= ioctl_downl; + + if (ioctl_downlD & ~ioctl_downl) rom_loaded <= 1; + reset <= status[0] | buttons[1] | ~rom_loaded | ioctl_downl; +end + +// clock enables reg ce_6p, ce_6n, ce_12, ce_1p79; always @(negedge clk_sys) begin reg [1:0] div = 0; @@ -207,6 +278,7 @@ always @(negedge clk_sys) begin end end +// ARM connection wire [31:0] status; wire [1:0] buttons; wire [1:0] switches; @@ -250,7 +322,7 @@ A000-A7FF 2k gfx1 5H A800-AFFF 2k gfx2 5F B000-B01F 32b palette LUT -Calipso: +Calipso, Mighty Monkey: A000-BFFF 8k gfx1 5H C000-DFFF 8k gfx2 5F E000-E01F 32b palette LUT @@ -312,7 +384,7 @@ wire hs, vs; //wire blankn = ~(hb | vb); wire blankn = ~vb; wire hb, vb; -wire [3:0] r,b,g; +wire [5:0] r,b,g; scramble_top scramble( .O_VIDEO_R(r), @@ -327,7 +399,7 @@ scramble_top scramble( .I_PA(input0), .I_PB(input1), .I_PC(input2), - .RESET(status[0] | buttons[1] | ioctl_downl), + .RESET(reset), .clk(clk_sys), .ena_12(ce_12), .ena_6(ce_6p), @@ -342,14 +414,14 @@ scramble_top scramble( .dl_data(ioctl_dout) ); -mist_video #(.COLOR_DEPTH(4),.SD_HCNT_WIDTH(10)) mist_video( +mist_video #(.COLOR_DEPTH(6),.SD_HCNT_WIDTH(10)) mist_video( .clk_sys(clk_sys), .SPI_SCK(SPI_SCK), .SPI_SS3(SPI_SS3), .SPI_DI(SPI_DI), - .R(blankn ? r : 0), - .G(blankn ? g : 0), - .B(blankn ? b : 0), + .R(blankn ? r : 6'd0), + .G(blankn ? g : 6'd0), + .B(blankn ? b : 6'd0), .HSync(~hs), .VSync(~vs), .VGA_R(VGA_R), @@ -357,6 +429,7 @@ mist_video #(.COLOR_DEPTH(4),.SD_HCNT_WIDTH(10)) mist_video( .VGA_B(VGA_B), .VGA_VS(VGA_VS), .VGA_HS(VGA_HS), + .no_csync(no_csync), .rotate({1'b1,rotate}), .ce_divider(1'b1), .blend(blend), @@ -380,6 +453,23 @@ moonwar_dial moonwar_dial ( .dialout(dial) ); +wire [6:0] darkplnt_dial; +spinner spinner ( + .clock(clk_sys), + .reset(reset), + .btn_left(m_left | m_up), + .btn_right(m_right | m_down), + .strobe(vs), + .spin_angle(darkplnt_dial) +); +wire [5:0] darkplnt_dial_scrambled = { + darkplnt_dial[3], + darkplnt_dial[5], + darkplnt_dial[6], + darkplnt_dial[4], + darkplnt_dial[2:1] +}; + wire m_up, m_down, m_left, m_right, m_fireA, m_fireB, m_fireC, m_fireD, m_fireE, m_fireF; wire m_up2, m_down2, m_left2, m_right2, m_fire2A, m_fire2B, m_fire2C, m_fire2D, m_fire2E, m_fire2F; wire m_tilt, m_coin1, m_coin2, m_coin3, m_coin4, m_one_player, m_two_players, m_three_players, m_four_players; @@ -392,7 +482,7 @@ arcade_inputs inputs ( .joystick_0 ( joystick_0 ), .joystick_1 ( joystick_1 ), .rotate ( rotate ), - .orientation ( 2'b11 ), + .orientation ( orientation ), .joyswap ( joyswap ), .oneplayer ( 1'b0 ), .controls ( {m_tilt, m_coin4, m_coin3, m_coin2, m_coin1, m_four_players, m_three_players, m_two_players, m_one_player} ), diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble.vhd b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble.vhd index fe552f8f..4645d1ca 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble.vhd +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble.vhd @@ -50,9 +50,9 @@ entity SCRAMBLE is port ( I_HWSEL : in integer; -- - O_VIDEO_R : out std_logic_vector(3 downto 0); - O_VIDEO_G : out std_logic_vector(3 downto 0); - O_VIDEO_B : out std_logic_vector(3 downto 0); + O_VIDEO_R : out std_logic_vector(5 downto 0); + O_VIDEO_G : out std_logic_vector(5 downto 0); + O_VIDEO_B : out std_logic_vector(5 downto 0); O_HSYNC : out std_logic; O_VSYNC : out std_logic; O_HBLANK : out std_logic; @@ -134,10 +134,13 @@ architecture RTL of SCRAMBLE is signal control_reg : std_logic_vector(7 downto 0); signal intst_l : std_logic; signal iopc7 : std_logic; - signal pout1 : std_logic; + signal bcb : std_logic; -- scramble: pout1 + signal bcg : std_logic; + signal bcr : std_logic; signal starson : std_logic; signal hcma : std_logic; signal vcma : std_logic; + signal gfxbank : std_logic_vector(1 downto 0); signal pgm_rom_0_wr : std_logic; signal pgm_rom_1_wr : std_logic; @@ -257,7 +260,11 @@ begin I_OBJEN_L => objen_l, -- I_STARSON => starson, - I_POUT1 => pout1, + I_BCB => bcb, + I_BCG => bcg, + I_BCR => bcr, + -- + I_GFXBANK => gfxbank, -- O_VIDEO_R => O_VIDEO_R, O_VIDEO_G => O_VIDEO_G, @@ -267,7 +274,7 @@ begin ENAB => ENAB, ENA_12 => ENA_12, CLK => CLK, - -- + -- dl_addr => dl_addr, dl_wr => dl_wr, dl_data => dl_data @@ -383,9 +390,9 @@ begin cpu_busrq_l <= cpu_addr(15); end if; - if I_HWSEL = I_HWSEL_DARKPLNT then + if I_HWSEL = I_HWSEL_DARKPLNT or I_HWSEL = I_HWSEL_STRATGYX then if cpu_addr(15) = '1' then page_4to7_l <= '0'; end if; - elsif I_HWSEL = I_HWSEL_SCRAMBLE then + elsif I_HWSEL = I_HWSEL_SCRAMBLE or I_HWSEL = I_HWSEL_MARS or I_HWSEL = I_HWSEL_MIMONKEY then if (cpu_addr(15 downto 14) = "01") then page_4to7_l <= '0'; end if; else if (cpu_addr(15 downto 14) = "10") then page_4to7_l <= '0'; end if; @@ -398,11 +405,16 @@ begin begin waen_l <= '1'; objen_l <= '1'; - if I_HWSEL = I_HWSEL_DARKPLNT then + if I_HWSEL = I_HWSEL_TURTLES then if (page_4to7_l = '0') and (cpu_rfsh_l = '1') then if (cpu_addr(13 downto 11) = "010") then waen_l <= '0'; end if; if (cpu_addr(13 downto 11) = "011") then objen_l <= '0'; end if; end if; + elsif I_HWSEL = I_HWSEL_DARKPLNT or I_HWSEL = I_HWSEL_STRATGYX then + if (page_4to7_l = '0') and (cpu_rfsh_l = '1') then + if (cpu_addr(13 downto 11) = "010") then waen_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "001") then objen_l <= '0'; end if; -- error on the schematic, should be Y1, not Y3 + end if; elsif I_HWSEL /= I_HWSEL_FROGGER then if (page_4to7_l = '0') and (cpu_rfsh_l = '1') then if (cpu_addr(13 downto 11) = "001") then waen_l <= '0'; end if; @@ -419,7 +431,7 @@ begin vramrd_l <= '1'; objramrd_l <= '1'; - if I_HWSEL = I_HWSEL_DARKPLNT then + if I_HWSEL = I_HWSEL_DARKPLNT or I_HWSEL = I_HWSEL_STRATGYX or I_HWSEL = I_HWSEL_TURTLES then if (page_4to7_l = '0') and (cpu_rd_l = '0') then if (cpu_addr(13 downto 11) = "010") then vramrd_l <= '0'; end if; end if; @@ -438,7 +450,13 @@ begin objramwr_l <= '1'; select_l <= '1'; - if I_HWSEL = I_HWSEL_DARKPLNT then + if I_HWSEL = I_HWSEL_TURTLES then + if (page_4to7_l = '0') and (cpu_wr_l = '0') and (wren = '1') then + if (cpu_addr(13 downto 11) = "010") then vramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "011") then objramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "100") then select_l <= '0'; end if; -- control reg + end if; + elsif I_HWSEL = I_HWSEL_DARKPLNT or I_HWSEL = I_HWSEL_STRATGYX then if (page_4to7_l = '0') and (cpu_wr_l = '0') and (wren = '1') then if (cpu_addr(13 downto 11) = "010") then vramwr_l <= '0'; end if; if (cpu_addr(13 downto 11) = "001") then objramwr_l <= '0'; end if; @@ -473,8 +491,12 @@ begin --6805 ? (POUT2) --6806 screen vertical flip --6807 screen horizontal flip - if I_HWSEL = I_HWSEL_DARKPLNT then + if I_HWSEL = I_HWSEL_TURTLES then + addr := cpu_addr(5 downto 3); + elsif I_HWSEL = I_HWSEL_DARKPLNT or I_HWSEL = I_HWSEL_STRATGYX then addr := cpu_addr(3 downto 1); + elsif I_HWSEL = I_HWSEL_MARS then + addr := cpu_addr(3) & cpu_addr(1 downto 0); elsif I_HWSEL /= I_HWSEL_FROGGER then addr := cpu_addr(2 downto 0); else @@ -510,25 +532,51 @@ begin p_control_reg_assign : process(control_reg, I_HWSEL) begin - if I_HWSEL = I_HWSEL_DARKPLNT then - intst_l <= control_reg(2); - iopc7 <= '0'; - pout1 <= '0'; + bcb <= '0'; + bcg <= '0'; + bcr <= '0'; + gfxbank <= "00"; + + if I_HWSEL = I_HWSEL_TURTLES then + intst_l <= control_reg(1); + bcb <= control_reg(5); + bcg <= control_reg(4); + bcr <= control_reg(0); + iopc7 <= control_reg(6); starson <= '0'; - hcma <= control_reg(7); - vcma <= not control_reg(6); + hcma <= control_reg(3); + vcma <= control_reg(7); + elsif I_HWSEL = I_HWSEL_DARKPLNT or I_HWSEL = I_HWSEL_STRATGYX then + intst_l <= control_reg(2); + bcg <= control_reg(0); + bcb <= control_reg(1); + bcr <= control_reg(5); + iopc7 <= '0'; + starson <= '0'; + hcma <= '0';--control_reg(7); + vcma <= '0';--control_reg(6); + elsif I_HWSEL = I_HWSEL_MARS then + iopc7 <= control_reg(0); + starson <= control_reg(1); + intst_l <= control_reg(2); + hcma <= control_reg(5); + vcma <= control_reg(7); elsif I_HWSEL /= I_HWSEL_FROGGER then -- Scramble intst_l <= control_reg(1); iopc7 <= control_reg(2); - pout1 <= control_reg(3); + bcb <= control_reg(3); -- pout1 starson <= control_reg(4); hcma <= control_reg(6); vcma <= control_reg(7); + if I_HWSEL = I_HWSEL_MIMONKEY then + gfxbank(0) <= control_reg(0); + gfxbank(1) <= control_reg(2); + end if; else intst_l <= control_reg(2); iopc7 <= control_reg(6); - pout1 <= control_reg(7); + bcb <= control_reg(7); -- pout1 starson <= '0'; hcma <= control_reg(4); vcma <= control_reg(3); @@ -559,7 +607,7 @@ begin -- when others => null; -- end case; -- end process; - rom_addr <= cpu_addr(14 downto 0); + rom_addr <= cpu_addr(14 downto 4) & cpu_addr(2) & cpu_addr(0) & cpu_addr(3) & cpu_addr(1) when I_HWSEL = I_HWSEL_MARS else cpu_addr(14 downto 0); u_cpu_ram : work.dpram generic map (11,8) port map @@ -588,7 +636,7 @@ begin variable ram_addr : std_logic_vector(1 downto 0); begin - if I_HWSEL = I_HWSEL_SCRAMBLE then + if I_HWSEL = I_HWSEL_SCRAMBLE or I_HWSEL = I_HWSEL_MARS or I_HWSEL = I_HWSEL_MIMONKEY then ram_addr := "01"; else ram_addr := "10"; @@ -602,7 +650,9 @@ begin cpu_data_in <= I_DATA; -- elsif (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then - if (cpu_addr(15) = '0') and (I_HWSEL /= I_HWSEL_SCRAMBLE or cpu_addr(14) = '0') and (cpu_rd_l = '0') and (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + if I_HWSEL = I_HWSEL_MIMONKEY and (cpu_addr(15 downto 14) = "11" or cpu_addr(15 downto 14) = "00") and (cpu_rd_l = '0') then + cpu_data_in <= rom_dout; + elsif (cpu_addr(15) = '0') and I_HWSEL /= I_HWSEL_MIMONKEY and ((I_HWSEL /= I_HWSEL_SCRAMBLE and I_HWSEL /= I_HWSEL_MARS) or cpu_addr(14) = '0') and (cpu_rd_l = '0') then cpu_data_in <= rom_dout; -- elsif (cpu_addr(15 downto 14) = ram_addr) then diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_audio.vhd b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_audio.vhd index fa71c335..2bdc1312 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_audio.vhd +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_audio.vhd @@ -398,7 +398,18 @@ begin i8255_1D_cs_l <= '1'; i8255_1E_cs_l <= '1'; - if I_HWSEL = I_HWSEL_DARKPLNT then + if I_HWSEL = I_HWSEL_TURTLES then + -- the interface one + if (I_ADDR(13 downto 11) = "111") and (I_ADDR(15) = '1') then + i8255_1D_cs_l <= '0'; + end if; + + -- the button one + if (I_ADDR(13 downto 11) = "110") and (I_ADDR(15) = '1') then + i8255_1E_cs_l <= '0'; + end if; + i8255_addr <= I_ADDR(5 downto 4); + elsif I_HWSEL = I_HWSEL_DARKPLNT or I_HWSEL = I_HWSEL_STRATGYX then -- the interface one if (I_ADDR(13 downto 11) = "101") and (I_ADDR(15) = '1') then i8255_1D_cs_l <= '0'; @@ -409,7 +420,8 @@ begin i8255_1E_cs_l <= '0'; end if; i8255_addr <= I_ADDR(3 downto 2); - elsif I_HWSEL = I_HWSEL_SCOBRA or I_HWSEL = I_HWSEL_CALIPSO or I_HWSEL = I_HWSEL_ANTEATER or I_HWSEL = I_HWSEL_LOSTTOMB then + elsif I_HWSEL = I_HWSEL_SCOBRA or I_HWSEL = I_HWSEL_CALIPSO or I_HWSEL = I_HWSEL_ANTEATER or I_HWSEL = I_HWSEL_LOSTTOMB or + I_HWSEL = I_HWSEL_MINEFLD or I_HWSEL = I_HWSEL_RESCUE then -- the interface one if (I_ADDR(13 downto 11) = "100") and (I_ADDR(15) = '1') then i8255_1D_cs_l <= '0'; @@ -430,7 +442,18 @@ begin if (I_ADDR(8) = '1') and (I_ADDR(15) = '1') then i8255_1E_cs_l <= '0'; end if; - i8255_addr <= I_ADDR(1 downto 0); + + if I_HWSEL = I_HWSEL_MIMONKEY and I_ADDR(14) = '1' then + -- This is ROM access in mimonkeyscr + i8255_1D_cs_l <= '1'; + i8255_1E_cs_l <= '1'; + end if; + + if I_HWSEL = I_HWSEL_MARS then + i8255_addr <= I_ADDR(3) & I_ADDR(1); + else + i8255_addr <= I_ADDR(1 downto 0); + end if; else -- the interface one if (I_ADDR(12) = '1') and (I_ADDR(15 downto 14) = "11") then @@ -503,8 +526,14 @@ begin i8255_1E_pc <= I_PC when I_HWSEL = I_HWSEL_SCOBRA or I_HWSEL = I_HWSEL_CALIPSO or I_HWSEL = I_HWSEL_DARKPLNT or + I_HWSEL = I_HWSEL_STRATGYX or I_HWSEL = I_HWSEL_ANTEATER or - I_HWSEL = I_HWSEL_LOSTTOMB + I_HWSEL = I_HWSEL_LOSTTOMB or + I_HWSEL = I_HWSEL_MARS or + I_HWSEL = I_HWSEL_TURTLES or + I_HWSEL = I_HWSEL_MINEFLD or + I_HWSEL = I_HWSEL_RESCUE or + I_HWSEL = I_HWSEL_MIMONKEY else I_PC or net_1e10_i&'0'&net_1e12_i&"00000"; O_COIN_COUNTER <= not I_IOPC7; -- open drain actually diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_pack.vhd b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_pack.vhd index dd96162a..0cbccfe0 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_pack.vhd +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_pack.vhd @@ -7,8 +7,14 @@ package scramble_pack is constant I_HWSEL_FROGGER : integer := 1; -- this MUST be set true for frogger constant I_HWSEL_SCOBRA : integer := 2; -- SuperCobra, TazzMania constant I_HWSEL_CALIPSO : integer := 3; -- Calipso - constant I_HWSEL_DARKPLNT : integer := 4; -- Dark Planet - constant I_HWSEL_ANTEATER : integer := 5; -- Ant Eater (SCOBRA with obj_ram address line obfuscation) - constant I_HWSEL_LOSTTOMB : integer := 6; -- Lost Tomb (SCOBRA with obj_ram address line obfuscation) + constant I_HWSEL_DARKPLNT : integer := 4; -- Dark Planet + constant I_HWSEL_STRATGYX : integer := 5; -- Strategy X + constant I_HWSEL_ANTEATER : integer := 6; -- Ant Eater (SCOBRA with obj_ram address line obfuscation) + constant I_HWSEL_LOSTTOMB : integer := 7; -- Lost Tomb (SCOBRA with obj_ram address line obfuscation) + constant I_HWSEL_MINEFLD : integer := 8; -- Minefield (SCOBRA with obj_ram address line obfuscation) + constant I_HWSEL_RESCUE : integer := 9; -- Rescue (SCOBRA with obj_ram address line obfuscation) + constant I_HWSEL_MARS : integer := 10; -- Mars + constant I_HWSEL_TURTLES : integer := 11; -- Turtles + constant I_HWSEL_MIMONKEY : integer := 12; -- Mighty Monkey (use mimonscr bootleg ROMs to avoid writing the ROM decryptor) end; diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_top.vhd b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_top.vhd index 2756bde2..0082ec17 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_top.vhd +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_top.vhd @@ -48,9 +48,9 @@ library ieee; entity SCRAMBLE_TOP is port ( - O_VIDEO_R : out std_logic_vector(3 downto 0); - O_VIDEO_G : out std_logic_vector(3 downto 0); - O_VIDEO_B : out std_logic_vector(3 downto 0); + O_VIDEO_R : out std_logic_vector(5 downto 0); + O_VIDEO_G : out std_logic_vector(5 downto 0); + O_VIDEO_B : out std_logic_vector(5 downto 0); O_HSYNC : out std_logic; O_VSYNC : out std_logic; O_HBLANK : out std_logic; diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_video.vhd b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_video.vhd index dd4b207c..380d5dda 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_video.vhd +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_video.vhd @@ -70,11 +70,15 @@ entity SCRAMBLE_VIDEO is I_OBJEN_L : in std_logic; -- I_STARSON : in std_logic; - I_POUT1 : in std_logic; + I_BCB : in std_logic; + I_BCG : in std_logic; + I_BCR : in std_logic; -- - O_VIDEO_R : out std_logic_vector(3 downto 0); - O_VIDEO_G : out std_logic_vector(3 downto 0); - O_VIDEO_B : out std_logic_vector(3 downto 0); + I_GFXBANK : in std_logic_vector(1 downto 0); + -- + O_VIDEO_R : out std_logic_vector(5 downto 0); + O_VIDEO_G : out std_logic_vector(5 downto 0); + O_VIDEO_B : out std_logic_vector(5 downto 0); -- ENA : in std_logic; ENAB : in std_logic; @@ -159,6 +163,7 @@ architecture RTL of SCRAMBLE_VIDEO is signal obj_video_out_reg : std_logic_vector(4 downto 0); signal vidout_l : std_logic; signal obj_lut_out : std_logic_vector(7 downto 0); + signal obj_lut_out2 : std_logic_vector(7 downto 0); signal cntr_addr : std_logic_vector(7 downto 0); signal cntr_addr_xor : std_logic_vector(10 downto 0); @@ -184,14 +189,17 @@ architecture RTL of SCRAMBLE_VIDEO is signal frogger_blue_reg : std_logic; signal frogger_blue : std_logic; signal frogger_blue_out_reg : std_logic; - -- scramble blue - signal pout1_reg : std_logic; + -- background color shade + signal bcb_reg : std_logic; + signal bcg_reg : std_logic; + signal bcr_reg : std_logic; signal obj_dl_addr : std_logic_vector(12 downto 0); signal obj_rom_0_wr : std_logic; signal obj_rom_1_wr : std_logic; signal col_rom_wr : std_logic; - + signal col_rom2_wr : std_logic; + begin p_hcnt_decode : process(I_HCNT) begin @@ -406,14 +414,14 @@ begin end if; end process; - p_obj_rom_addr : process(h256, vram_addr_xor, vram_dout, objdata, I_HCNT, I_HWSEL) + p_obj_rom_addr : process(h256, vram_addr_xor, vram_dout, objdata, I_HCNT, I_GFXBANK, I_HWSEL) variable obj_rom_addr_base : std_logic_vector(12 downto 0); begin obj_rom_addr_base( 2 downto 0) := vram_addr_xor(2 downto 0); if (h256 = '0') then - obj_rom_addr_base(12 downto 3) := "00" & vram_dout; -- background objects + obj_rom_addr_base(12 downto 3) := I_GFXBANK & vram_dout; -- background objects else - obj_rom_addr_base(12 downto 11) := "00"; + obj_rom_addr_base(12 downto 11) := I_GFXBANK; if I_HWSEL = I_HWSEL_CALIPSO then obj_rom_addr_base(12 downto 11) := objdata(7 downto 6); end if; @@ -432,13 +440,28 @@ begin (obj_rom_addr_base(7) xor (obj_rom_addr_base(1) and (obj_rom_addr_base(7) xor obj_rom_addr_base(10)))) & ((obj_rom_addr_base(1) and obj_rom_addr_base(8)) or (not obj_rom_addr_base(1) and obj_rom_addr_base(10))) & obj_rom_addr_base(6 downto 0); + elsif I_HWSEL = I_HWSEL_MINEFLD then + obj_rom_addr <= "00" & obj_rom_addr_base(10) & + (obj_rom_addr_base(0) xor obj_rom_addr_base(5) xor (obj_rom_addr_base(3) and obj_rom_addr_base(7))) & + obj_rom_addr_base(8) & + (obj_rom_addr_base(2) xor obj_rom_addr_base(9) xor (obj_rom_addr_base(0) and obj_rom_addr_base(5)) xor + (obj_rom_addr_base(3) and obj_rom_addr_base(7) and (obj_rom_addr_base(0) xor obj_rom_addr_base(5)))) & + obj_rom_addr_base(6) & + (obj_rom_addr_base(3) xor obj_rom_addr_base(7)) & + obj_rom_addr_base(4 downto 0); + elsif I_HWSEL = I_HWSEL_RESCUE then + obj_rom_addr <= "00" & (obj_rom_addr_base(0) xor obj_rom_addr_base(8)) & + obj_rom_addr_base(9) & + (obj_rom_addr_base(1) xor obj_rom_addr_base(7)) & + (obj_rom_addr_base(3) xor obj_rom_addr_base(10)) & + obj_rom_addr_base(6 downto 0); else obj_rom_addr <= obj_rom_addr_base; end if; end process; - obj_dl_addr <= dl_addr(12 downto 0) when I_HWSEL = I_HWSEL_CALIPSO else "00"&dl_addr(10 downto 0); + obj_dl_addr <= dl_addr(12 downto 0) when I_HWSEL = I_HWSEL_CALIPSO or I_HWSEL = I_HWSEL_MIMONKEY else "00"&dl_addr(10 downto 0); obj_rom0 : work.dpram generic map (13,8) --5H port map @@ -455,8 +478,8 @@ begin data_b_o => obj_rom_0_dout ); obj_rom_0_wr <= '1' when dl_wr = '1' and - ((I_HWSEL /= I_HWSEL_CALIPSO and dl_addr(15 downto 11) = "10100") or -- A000-A7FF - (I_HWSEL = I_HWSEL_CALIPSO and dl_addr(15 downto 13) = "101")) -- A000-BFFF + ((I_HWSEL /= I_HWSEL_CALIPSO and I_HWSEL /= I_HWSEL_MIMONKEY and dl_addr(15 downto 11) = "10100") or -- A000-A7FF + ((I_HWSEL = I_HWSEL_CALIPSO or I_HWSEL = I_HWSEL_MIMONKEY) and dl_addr(15 downto 13) = "101")) -- A000-BFFF else '0'; obj_rom1 : work.dpram generic map (13,8) --5F @@ -474,8 +497,8 @@ begin data_b_o => obj_rom_1_dout ); obj_rom_1_wr <= '1' when dl_wr = '1' and - ((I_HWSEL /= I_HWSEL_CALIPSO and dl_addr(15 downto 11) = "10101") or -- A800-AFFF - (I_HWSEL = I_HWSEL_CALIPSO and dl_addr(15 downto 13) = "110")) -- C000-DFFF + ((I_HWSEL /= I_HWSEL_CALIPSO and I_HWSEL /= I_HWSEL_MIMONKEY and dl_addr(15 downto 11) = "10101") or -- A800-AFFF + ((I_HWSEL = I_HWSEL_CALIPSO or I_HWSEL = I_HWSEL_MIMONKEY) and dl_addr(15 downto 13) = "110")) -- C000-DFFF else '0'; -- obj_rom0 : entity work.ROM_OBJ_0 -- 5H @@ -665,7 +688,9 @@ begin shell_reg <= '0'; frogger_blue_out_reg <= '0'; star_out_reg <= '0'; - pout1_reg <= '0'; + bcb_reg <= '0'; + bcg_reg <= '0'; + bcr_reg <= '0'; else obj_video_out_reg(4 downto 2) <= col(2 downto 0); @@ -680,7 +705,9 @@ begin star_out_reg <= (vcnt_f(0) xor hcnt_f(3)) and (not star_shift(16)); end if; - pout1_reg <= I_POUT1; + bcb_reg <= I_BCB; + bcg_reg <= I_BCG; + bcr_reg <= I_BCR; end if; end if; @@ -709,8 +736,8 @@ begin data_b_o => obj_lut_out ); col_rom_wr <= '1' when dl_wr = '1' and - ((I_HWSEL /= I_HWSEL_CALIPSO and dl_addr(15 downto 5) = x"B0"&"000") or -- B000-B01F - (I_HWSEL = I_HWSEL_CALIPSO and dl_addr(15 downto 5) = x"E0"&"000")) -- E000-E01F + ((I_HWSEL /= I_HWSEL_CALIPSO and I_HWSEL /= I_HWSEL_MIMONKEY and dl_addr(15 downto 5) = x"B0"&"000") or -- B000-B01F + ((I_HWSEL = I_HWSEL_CALIPSO or I_HWSEL = I_HWSEL_MIMONKEY) and dl_addr(15 downto 5) = x"E0"&"000")) -- E000-E01F else '0'; -- col_rom : entity work.ROM_LUT @@ -720,8 +747,29 @@ begin -- DATA => obj_lut_out -- ); + -- 10K + col_rom2 : work.dpram generic map (5,8) + port map + ( + clk_a_i => clk, + en_a_i => '1', + we_i => col_rom2_wr, + + addr_a_i => dl_addr(4 downto 0), + data_a_i => dl_data, + + clk_b_i => clk, + addr_b_i => cntr_addr_xor(7 downto 3), + data_b_o => obj_lut_out2 + ); + col_rom2_wr <= '1' when dl_wr = '1' and + (I_HWSEL /= I_HWSEL_CALIPSO and I_HWSEL /= I_HWSEL_MIMONKEY and dl_addr(15 downto 5) = x"B0"&"001") -- B020-B03F + else '0'; + p_col_rom_ce : process variable video : array_3x5; + variable bgc_dis: std_logic_vector(2 downto 0); + variable i_hcnt_adj: std_logic_vector(8 downto 0); begin wait until rising_edge(CLK); if (ENA = '1') then @@ -763,11 +811,28 @@ begin video(1) := video(1) + ( '0' & star_shift_t1(11 downto 10) & "00"); video(2) := video(2) + ( '0' & star_shift_t1( 9 downto 8) & "00"); end if; - - if (pout1_reg = '1') and (vidout_l = '1') then - video(0) := video(0) + ("00011"); - end if; end if; + + if I_HWSEL = I_HWSEL_STRATGYX then + -- bit 1 and 0 from the second LUT ROM disables bcX_regs + bgc_dis := obj_lut_out2(1) & obj_lut_out2(1 downto 0); + elsif I_HWSEL = I_HWSEL_MINEFLD or I_HWSEL = I_HWSEL_RESCUE or I_HWSEL = I_HWSEL_FROGGER then + -- these are handling the bg registers differently + bgc_dis := "111"; + else + bgc_dis := "000"; + end if; + + if (bcb_reg = '1') and (vidout_l = '1') and (bgc_dis(0) = '0') then + video(0) := video(0) + ("00011"); + end if; + if (bcg_reg = '1') and (vidout_l = '1') and (bgc_dis(1) = '0') then + video(1) := video(1) + ("00011"); + end if; + if (bcr_reg = '1') and (vidout_l = '1') and (bgc_dis(2) = '0') then + video(2) := video(2) + ("00011"); + end if; + -- check for clip for i in 0 to 2 loop if video(i)(4) = '1' or video(i)(3) = '1' then @@ -775,9 +840,28 @@ begin end if; end loop; - O_VIDEO_B <= video(0)(2 downto 0) & video(0)(2); - O_VIDEO_G <= video(1)(2 downto 0) & video(1)(2); - O_VIDEO_R <= video(2)(2 downto 0) & video(2)(2); + i_hcnt_adj := I_HCNT - "1001"; + if (I_HWSEL = I_HWSEL_RESCUE or (I_HWSEL = I_HWSEL_MINEFLD and i_hcnt_adj(7) = '0')) and + bcb_reg = '1' and I_HCNT(8) = '1' and + video(0) = "0000" and video(1) = "0000" and video(2) = "0000" + then + -- Rescue and Minefield blue graduated background, no schematics, just guessing + O_VIDEO_B <= i_hcnt_adj(6 downto 1); + O_VIDEO_G <= '0' & i_hcnt_adj(6 downto 2); + O_VIDEO_R <= (others => '0'); + elsif I_HWSEL = I_HWSEL_MINEFLD and i_hcnt_adj(7) = '1' and + bcb_reg = '1' and I_HCNT(8) = '1' and + video(0) = "0000" and video(1) = "0000" and video(2) = "0000" + then + -- Minefield brown graduated background + O_VIDEO_B <= (others => '0'); + O_VIDEO_G <= '0' & i_hcnt_adj(6 downto 2); + O_VIDEO_R <= i_hcnt_adj(6 downto 1); + else + O_VIDEO_B <= video(0)(2 downto 0) & video(0)(2 downto 0); + O_VIDEO_G <= video(1)(2 downto 0) & video(1)(2 downto 0); + O_VIDEO_R <= video(2)(2 downto 0) & video(2)(2 downto 0); + end if; end if; end process; diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/spinner.vhd b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/spinner.vhd new file mode 100644 index 00000000..9839ca5a --- /dev/null +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/spinner.vhd @@ -0,0 +1,46 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity spinner is +port( + clock : in std_logic; + reset : in std_logic; + btn_left : in std_logic; + btn_right : in std_logic; + btn_acc : in std_logic; -- speed up button + strobe : in std_logic; + spin_angle : out std_logic_vector(6 downto 0) +); +end spinner; + +architecture rtl of spinner is + +signal strobe_r : std_logic; +signal spin_count : std_logic_vector(9 downto 0); + +begin + +spin_angle <= spin_count(9 downto 3); + +process (clock, reset) +begin + if reset = '1' then + spin_count <= (others => '0'); + elsif rising_edge(clock) then + strobe_r <= strobe; + + if strobe_r ='0' and strobe = '1' then + if btn_acc = '0' then -- space -- speed up + if btn_left = '1' then spin_count <= spin_count - 8; end if; -- left + if btn_right = '1' then spin_count <= spin_count + 8; end if; -- right + else + if btn_left = '1' then spin_count <= spin_count - 55; end if; + if btn_right = '1' then spin_count <= spin_count + 55; end if; + end if; + end if; + end if; +end process; + +end rtl; \ No newline at end of file