From c43fd58c3a451a6dd7f7bf195e770e8b656607a0 Mon Sep 17 00:00:00 2001 From: Gehstock Date: Sat, 4 Jan 2020 15:35:44 +0100 Subject: [PATCH] Move Midway 8080 --- Arcade_MiST/.gitignore | 1 + .../280ZZZAP_MiST/280ZZZAP.qpf | 30 + .../280ZZZAP_MiST/280ZZZAP.qsf | 172 ++ .../280ZZZAP_MiST/280ZZZAP.sdc | 126 ++ .../280ZZZAP_MiST/README.txt | 27 + .../280ZZZAP_MiST/Snapshot/280ZZZAP.rbf | Bin 0 -> 240973 bytes .../280ZZZAP_MiST/clean.bat | 15 + .../280ZZZAP_MiST/doc/Schematic.png | Bin 0 -> 594972 bytes .../280ZZZAP_MiST/rtl/D280ZZZAP_Overlay.vhd | 111 + .../280ZZZAP_MiST/rtl/D280ZZZAP_memory.sv | 104 + .../280ZZZAP_MiST/rtl/D280ZZZAP_mist.sv | 228 ++ .../280ZZZAP_MiST/rtl/T80/T80.vhd | 1080 +++++++++ .../280ZZZAP_MiST/rtl/T80/T8080se.vhd | 194 ++ .../280ZZZAP_MiST/rtl/T80/T80_ALU.vhd | 361 +++ .../280ZZZAP_MiST/rtl/T80/T80_MCode.vhd | 1944 +++++++++++++++++ .../280ZZZAP_MiST/rtl/T80/T80_Pack.vhd | 217 ++ .../280ZZZAP_MiST/rtl/T80/T80_Reg.vhd | 114 + .../280ZZZAP_MiST/rtl/build_id.tcl | 35 + .../280ZZZAP_MiST/rtl/invaders.vhd | 245 +++ .../280ZZZAP_MiST/rtl/invaders_audio.vhd | 496 +++++ .../280ZZZAP_MiST/rtl/mw8080.vhd | 335 +++ .../280ZZZAP_MiST/rtl/pll.qip | 4 + .../280ZZZAP_MiST/rtl/pll.vhd | 382 ++++ .../280ZZZAP_MiST/rtl/roms/zzzap_c.hex | 65 + .../280ZZZAP_MiST/rtl/roms/zzzap_d.hex | 65 + .../280ZZZAP_MiST/rtl/roms/zzzap_e.hex | 65 + .../280ZZZAP_MiST/rtl/roms/zzzap_f.hex | 65 + .../280ZZZAP_MiST/rtl/roms/zzzap_g.hex | 65 + .../280ZZZAP_MiST/rtl/roms/zzzap_h.hex | 65 + .../280ZZZAP_MiST/rtl/spram.vhd | 55 + .../280ZZZAP_MiST/rtl/sprom.vhd | 82 + .../BalloonBomber_MiST/BalloonBomber.qpf | 30 + .../BalloonBomber_MiST/BalloonBomber.qsf | 177 ++ .../README.txt} | 0 .../BalloonBomber_MiST/clean.bat | 16 + .../rtl/BalloonBomber_Overlay.vhd | 366 ++++ .../rtl/BalloonBomber_memory.sv | 72 + .../rtl/BalloonBomber_mist.sv | 208 ++ .../BalloonBomber_MiST/rtl/T80/T80.vhd | 1080 +++++++++ .../BalloonBomber_MiST/rtl/T80/T8080se.vhd | 194 ++ .../BalloonBomber_MiST/rtl/T80/T80_ALU.vhd | 361 +++ .../BalloonBomber_MiST/rtl/T80/T80_MCode.vhd | 1944 +++++++++++++++++ .../BalloonBomber_MiST/rtl/T80/T80_Pack.vhd | 217 ++ .../BalloonBomber_MiST/rtl/T80/T80_Reg.vhd | 114 + .../BalloonBomber_MiST/rtl/build_id.tcl | 35 + .../BalloonBomber_MiST/rtl/invaders.vhd | 281 +++ .../BalloonBomber_MiST/rtl/invaders_audio.vhd | 496 +++++ .../BalloonBomber_MiST/rtl/mw8080.vhd | 336 +++ .../BalloonBomber_MiST/rtl/pll.qip | 4 + .../BalloonBomber_MiST/rtl/pll.vhd | 382 ++++ .../BalloonBomber_MiST/rtl/roms/ballbomb.zip | Bin 0 -> 7424 bytes .../BalloonBomber_MiST/rtl/roms/tn01 | Bin 0 -> 2048 bytes .../BalloonBomber_MiST/rtl/roms/tn01.vhd | 150 ++ .../BalloonBomber_MiST/rtl/roms/tn02 | Bin 0 -> 2048 bytes .../BalloonBomber_MiST/rtl/roms/tn02.vhd | 150 ++ .../BalloonBomber_MiST/rtl/roms/tn03 | Bin 0 -> 2048 bytes .../BalloonBomber_MiST/rtl/roms/tn03.vhd | 150 ++ .../BalloonBomber_MiST/rtl/roms/tn04 | Bin 0 -> 2048 bytes .../BalloonBomber_MiST/rtl/roms/tn04.vhd | 150 ++ .../BalloonBomber_MiST/rtl/roms/tn05-1 | Bin 0 -> 2048 bytes .../BalloonBomber_MiST/rtl/roms/tn05-1.vhd | 150 ++ .../BalloonBomber_MiST/rtl/roms/tn06 | 1 + .../BalloonBomber_MiST/rtl/roms/tn06.vhd | 86 + .../BalloonBomber_MiST/rtl/roms/tn07 | 1 + .../BalloonBomber_MiST/rtl/roms/tn07.vhd | 86 + .../BalloonBomber_MiST/rtl/spram.vhd | 55 + .../BlueShark_MiST/BlueShark.qpf | 30 + .../BlueShark_MiST/BlueShark.qsf | 172 ++ .../BlueShark_MiST/BlueShark.sdc | 126 ++ .../BlueShark_MiST/README.txt | 26 + .../BlueShark_MiST/Snapshot/BlueShark.rbf | Bin 0 -> 241979 bytes .../BlueShark_MiST/clean.bat | 15 + .../doc/Blue_Shark_-_1978_-_Midway_Games.pdf | Bin 0 -> 2564891 bytes .../BlueShark_MiST/rtl/BlueShark_Overlay.vhd | 112 + .../BlueShark_MiST/rtl/BlueShark_memory.sv | 68 + .../BlueShark_MiST/rtl/BlueShark_mist.sv | 214 ++ .../BlueShark_MiST/rtl/T80/T80.vhd | 1080 +++++++++ .../BlueShark_MiST/rtl/T80/T8080se.vhd | 194 ++ .../BlueShark_MiST/rtl/T80/T80_ALU.vhd | 361 +++ .../BlueShark_MiST/rtl/T80/T80_MCode.vhd | 1944 +++++++++++++++++ .../BlueShark_MiST/rtl/T80/T80_Pack.vhd | 217 ++ .../BlueShark_MiST/rtl/T80/T80_Reg.vhd | 114 + .../BlueShark_MiST/rtl/build_id.tcl | 35 + .../BlueShark_MiST/rtl/invaders.vhd | 243 +++ .../BlueShark_MiST/rtl/invaders_audio.vhd | 496 +++++ .../BlueShark_MiST/rtl/mw8080.vhd | 335 +++ .../BlueShark_MiST/rtl/pll.qip | 4 + .../BlueShark_MiST/rtl/pll.vhd | 382 ++++ .../BlueShark_MiST/rtl/roms/blueshrk_f.hex | 129 ++ .../BlueShark_MiST/rtl/roms/blueshrk_g.hex | 129 ++ .../BlueShark_MiST/rtl/roms/blueshrk_h.hex | 129 ++ .../BlueShark_MiST/rtl/spram.vhd | 55 + .../BlueShark_MiST/rtl/sprom.vhd | 82 + .../Boothill_MiST/Boothill.qpf | 30 + .../Boothill_MiST/Boothill.qsf | 176 ++ .../Boothill_MiST/README.txt | 26 + .../Boothill_MiST/clean.bat | 15 + .../Boothill_MiST/rtl/SpaceWalk_mist.sv | 198 ++ .../Boothill_MiST/rtl/T80/T80.vhd | 1080 +++++++++ .../Boothill_MiST/rtl/T80/T8080se.vhd | 194 ++ .../Boothill_MiST/rtl/T80/T80_ALU.vhd | 361 +++ .../Boothill_MiST/rtl/T80/T80_MCode.vhd | 1944 +++++++++++++++++ .../Boothill_MiST/rtl/T80/T80_Pack.vhd | 217 ++ .../Boothill_MiST/rtl/T80/T80_Reg.vhd | 114 + .../Boothill_MiST/rtl/build_id.tcl | 35 + .../Boothill_MiST/rtl/invaders.vhd | 283 +++ .../Boothill_MiST/rtl/invaders_audio.vhd | 498 +++++ .../Boothill_MiST/rtl/invaders_memory.sv | 66 + .../Boothill_MiST/rtl/invaders_video.vhd | 127 ++ .../Boothill_MiST/rtl/mw8080.vhd | 336 +++ .../Boothill_MiST/rtl/pll.qip | 4 + .../Boothill_MiST/rtl/pll.vhd | 382 ++++ .../Boothill_MiST/rtl/roms/rome.vhd | 150 ++ .../Boothill_MiST/rtl/roms/romf.vhd | 150 ++ .../Boothill_MiST/rtl/roms/romg.vhd | 150 ++ .../Boothill_MiST/rtl/roms/romh.vhd | 150 ++ .../Boothill_MiST/rtl/spram.vhd | 55 + .../Boothill_MiST/rtl/sprom.vhd | 82 + .../BowlingAlley_MiST/BowlingAlley.qpf | 30 + .../BowlingAlley_MiST/BowlingAlley.qsf | 171 ++ .../BowlingAlley_MiST/BowlingAlley.sdc | 126 ++ .../BowlingAlley_MiST/README.txt | 26 + .../Snapshot/BowlingAlley.rbf | Bin 0 -> 245721 bytes .../BowlingAlley_MiST/clean.bat | 15 + .../rtl/BowlingAlley_memory.sv | 92 + .../rtl/BowlingAlley_mist.sv | 196 ++ .../BowlingAlley_MiST/rtl/T80/T80.vhd | 1080 +++++++++ .../BowlingAlley_MiST/rtl/T80/T8080se.vhd | 194 ++ .../BowlingAlley_MiST/rtl/T80/T80_ALU.vhd | 361 +++ .../BowlingAlley_MiST/rtl/T80/T80_MCode.vhd | 1944 +++++++++++++++++ .../BowlingAlley_MiST/rtl/T80/T80_Pack.vhd | 217 ++ .../BowlingAlley_MiST/rtl/T80/T80_Reg.vhd | 114 + .../BowlingAlley_MiST/rtl/build_id.tcl | 35 + .../BowlingAlley_MiST/rtl/dac.vhd | 48 + .../BowlingAlley_MiST/rtl/invaders.vhd | 283 +++ .../BowlingAlley_MiST/rtl/invaders_audio.vhd | 496 +++++ .../BowlingAlley_MiST/rtl/mw8080.vhd | 336 +++ .../BowlingAlley_MiST/rtl/pll.qip | 4 + .../BowlingAlley_MiST/rtl/pll.vhd | 382 ++++ .../BowlingAlley_MiST/rtl/roms/d.cpu.hex | 129 ++ .../BowlingAlley_MiST/rtl/roms/e.cpu.hex | 129 ++ .../BowlingAlley_MiST/rtl/roms/f.cpu.hex | 129 ++ .../BowlingAlley_MiST/rtl/roms/g.cpu.hex | 129 ++ .../BowlingAlley_MiST/rtl/roms/h.cpu.hex | 129 ++ .../BowlingAlley_MiST/rtl/spram.vhd | 55 + .../BowlingAlley_MiST/rtl/sprom.vhd | 82 + .../GunFight_MiST/GunFight.qpf | 30 + .../GunFight_MiST/GunFight.qsf | 178 ++ .../GunFight_MiST/GunFight.sdc | 126 ++ .../README.txt} | 0 .../GunFight_MiST/clean.bat | 15 + .../GunFight_MiST/rtl/GunFight_memory.sv | 129 ++ .../GunFight_MiST/rtl/GunFight_mist.sv | 197 ++ .../GunFight_MiST/rtl/GunFight_overlay.vhd | 127 ++ .../GunFight_MiST/rtl/T80/T80.vhd | 1080 +++++++++ .../GunFight_MiST/rtl/T80/T8080se.vhd | 194 ++ .../GunFight_MiST/rtl/T80/T80_ALU.vhd | 361 +++ .../GunFight_MiST/rtl/T80/T80_MCode.vhd | 1944 +++++++++++++++++ .../GunFight_MiST/rtl/T80/T80_Pack.vhd | 217 ++ .../GunFight_MiST/rtl/T80/T80_Reg.vhd | 114 + .../GunFight_MiST/rtl/build_id.tcl | 35 + .../GunFight_MiST/rtl/gun.sv | 13 + .../GunFight_MiST/rtl/invaders.vhd | 307 +++ .../GunFight_MiST/rtl/invaders_audio.vhd | 496 +++++ .../GunFight_MiST/rtl/mw8080.vhd | 336 +++ .../GunFight_MiST/rtl/pll.qip | 4 + .../GunFight_MiST/rtl/pll.vhd | 350 +++ .../GunFight_MiST/rtl/roms/gf-a.hex | 18 + .../GunFight_MiST/rtl/roms/gf-b.hex | 18 + .../GunFight_MiST/rtl/roms/gf-c.hex | 18 + .../GunFight_MiST/rtl/roms/gf-d.hex | 18 + .../GunFight_MiST/rtl/roms/gf-e.hex | 18 + .../GunFight_MiST/rtl/roms/gf-f.hex | 18 + .../GunFight_MiST/rtl/roms/gf-g.hex | 18 + .../GunFight_MiST/rtl/roms/gf-h.hex | 18 + .../GunFight_MiST/rtl/spram.vhd | 55 + .../GunFight_MiST/rtl/sprom.vhd | 82 + .../Lunar Rescue_MiST/LunarRescue.qpf | 30 + .../Lunar Rescue_MiST/LunarRescue.qsf | 168 ++ .../Lunar Rescue_MiST/LunarRescue.sdc | 126 ++ .../README.txt} | 0 .../Lunar Rescue_MiST/clean.bat | 15 + .../rtl/LunarRescue_Overlay.vhd | 366 ++++ .../rtl/LunarRescue_memory.sv | 103 + .../Lunar Rescue_MiST/rtl/LunarRescue_mist.sv | 209 ++ .../Lunar Rescue_MiST/rtl/build_id.tcl | 35 + .../Lunar Rescue_MiST/rtl/invaders.vhd | 245 +++ .../Lunar Rescue_MiST/rtl/invaders_audio.vhd | 496 +++++ .../Lunar Rescue_MiST/rtl/mw8080.vhd | 337 +++ .../Lunar Rescue_MiST/rtl/pll.qip | 4 + .../Lunar Rescue_MiST/rtl/pll.vhd | 350 +++ .../Lunar Rescue_MiST/rtl/roms/col.bin | 1 + .../Lunar Rescue_MiST/rtl/roms/col.vhd | 86 + .../Lunar Rescue_MiST/rtl/roms/lrescue_1.hex | 129 ++ .../Lunar Rescue_MiST/rtl/roms/lrescue_2.hex | 129 ++ .../Lunar Rescue_MiST/rtl/roms/lrescue_3.hex | 129 ++ .../Lunar Rescue_MiST/rtl/roms/lrescue_4.hex | 129 ++ .../Lunar Rescue_MiST/rtl/roms/lrescue_5.hex | 129 ++ .../Lunar Rescue_MiST/rtl/roms/lrescue_6.hex | 129 ++ .../Lunar Rescue_MiST/rtl/spram.vhd | 55 + .../Lunar Rescue_MiST/rtl/sprom.vhd | 82 + .../Ozma Wars_MiST/OzmaWars.qpf | 30 + .../Ozma Wars_MiST/OzmaWars.qsf | 178 ++ .../Ozma Wars_MiST/OzmaWars.sdc | 126 ++ .../README.txt} | 0 .../Ozma Wars_MiST/clean.bat | 15 + .../Ozma Wars_MiST/rtl/OzmaWars_memory.sv | 80 + .../Ozma Wars_MiST/rtl/OzmaWars_mist.sv | 210 ++ .../Ozma Wars_MiST/rtl/OzmaWars_overlay.vhd | 225 ++ .../Ozma Wars_MiST/rtl/T80/T80.vhd | 1080 +++++++++ .../Ozma Wars_MiST/rtl/T80/T8080se.vhd | 194 ++ .../Ozma Wars_MiST/rtl/T80/T80_ALU.vhd | 361 +++ .../Ozma Wars_MiST/rtl/T80/T80_MCode.vhd | 1944 +++++++++++++++++ .../Ozma Wars_MiST/rtl/T80/T80_Pack.vhd | 217 ++ .../Ozma Wars_MiST/rtl/T80/T80_Reg.vhd | 114 + .../Ozma Wars_MiST/rtl/build_id.tcl | 35 + .../Ozma Wars_MiST/rtl/dac.vhd | 48 + .../Ozma Wars_MiST/rtl/invaders.vhd | 273 +++ .../Ozma Wars_MiST/rtl/invaders_audio.vhd | 496 +++++ .../Ozma Wars_MiST/rtl/mw8080.vhd | 336 +++ .../Ozma Wars_MiST/rtl/pll.qip | 4 + .../Ozma Wars_MiST/rtl/pll.vhd | 382 ++++ .../Ozma Wars_MiST/rtl/roms/mw01.vhd | 150 ++ .../Ozma Wars_MiST/rtl/roms/mw02.vhd | 150 ++ .../Ozma Wars_MiST/rtl/roms/mw03.vhd | 150 ++ .../Ozma Wars_MiST/rtl/roms/mw04.vhd | 150 ++ .../Ozma Wars_MiST/rtl/roms/mw05.vhd | 150 ++ .../Ozma Wars_MiST/rtl/roms/mw06.vhd | 150 ++ .../Ozma Wars_MiST/rtl/spram.vhd | 55 + .../Ozma Wars_MiST/rtl/sprom.vhd | 82 + .../Shuffleboard_MiST/README.txt | 26 + .../Shuffleboard_MiST/Shuffleboard.qpf | 30 + .../Shuffleboard_MiST/Shuffleboard.qsf | 173 ++ .../Shuffleboard_MiST/Shuffleboard.sdc | 126 ++ .../Snapshot/Shuffleboard.rbf | Bin 0 -> 246209 bytes .../Shuffleboard_MiST/clean.bat | 15 + .../rtl/Shuffleboard_memory.sv | 80 + .../rtl/Shuffleboard_mist.sv | 196 ++ .../Shuffleboard_MiST/rtl/T80/T80.vhd | 1080 +++++++++ .../Shuffleboard_MiST/rtl/T80/T8080se.vhd | 194 ++ .../Shuffleboard_MiST/rtl/T80/T80_ALU.vhd | 361 +++ .../Shuffleboard_MiST/rtl/T80/T80_MCode.vhd | 1944 +++++++++++++++++ .../Shuffleboard_MiST/rtl/T80/T80_Pack.vhd | 217 ++ .../Shuffleboard_MiST/rtl/T80/T80_Reg.vhd | 114 + .../Shuffleboard_MiST/rtl/build_id.tcl | 35 + .../Shuffleboard_MiST/rtl/dac.vhd | 48 + .../Shuffleboard_MiST/rtl/invaders.vhd | 243 +++ .../Shuffleboard_MiST/rtl/invaders_audio.vhd | 496 +++++ .../Shuffleboard_MiST/rtl/mw8080.vhd | 335 +++ .../Shuffleboard_MiST/rtl/pll.qip | 4 + .../Shuffleboard_MiST/rtl/pll.vhd | 350 +++ .../Shuffleboard_MiST/rtl/roms/shuffle.e.bin | Bin 0 -> 2048 bytes .../Shuffleboard_MiST/rtl/roms/shuffle.e.hex | 129 ++ .../Shuffleboard_MiST/rtl/roms/shuffle.f.bin | Bin 0 -> 2048 bytes .../Shuffleboard_MiST/rtl/roms/shuffle.f.hex | 129 ++ .../Shuffleboard_MiST/rtl/roms/shuffle.g.bin | Bin 0 -> 2048 bytes .../Shuffleboard_MiST/rtl/roms/shuffle.g.hex | 129 ++ .../Shuffleboard_MiST/rtl/roms/shuffle.h.bin | Bin 0 -> 2048 bytes .../Shuffleboard_MiST/rtl/roms/shuffle.h.hex | 129 ++ .../Shuffleboard_MiST/rtl/spram.vhd | 55 + .../Shuffleboard_MiST/rtl/sprom.vhd | 82 + .../Space Invaders 2_MiST/Invaders2.qpf | 30 + .../Space Invaders 2_MiST/Invaders2.qsf | 173 ++ .../Space Invaders 2_MiST/Invaders2.sdc | 126 ++ .../README.txt} | 0 .../Space Invaders 2_MiST/clean.bat | 15 + .../rtl/Invaders2_mist.sv | 211 ++ .../Space Invaders 2_MiST/rtl/T80/T80.vhd | 1080 +++++++++ .../Space Invaders 2_MiST/rtl/T80/T8080se.vhd | 194 ++ .../Space Invaders 2_MiST/rtl/T80/T80_ALU.vhd | 361 +++ .../rtl/T80/T80_MCode.vhd | 1944 +++++++++++++++++ .../rtl/T80/T80_Pack.vhd | 217 ++ .../Space Invaders 2_MiST/rtl/T80/T80_Reg.vhd | 114 + .../Space Invaders 2_MiST/rtl/build_id.tcl | 35 + .../Space Invaders 2_MiST/rtl/dac.vhd | 48 + .../Space Invaders 2_MiST/rtl/invaders.vhd | 271 +++ .../rtl/invaders_audio.vhd | 496 +++++ .../rtl/invaders_memory.sv | 104 + .../rtl/invaders_video.vhd | 127 ++ .../Space Invaders 2_MiST/rtl/mw8080.vhd | 336 +++ .../Space Invaders 2_MiST/rtl/pll.qip | 4 + .../Space Invaders 2_MiST/rtl/pll.vhd | 350 +++ .../rtl/roms/invad2ct.a.hex | 129 ++ .../rtl/roms/invad2ct.b.hex | 129 ++ .../rtl/roms/invad2ct.e.hex | 129 ++ .../rtl/roms/invad2ct.f.hex | 129 ++ .../rtl/roms/invad2ct.g.hex | 129 ++ .../rtl/roms/invad2ct.h.hex | 129 ++ .../Space Invaders 2_MiST/rtl/spram.vhd | 55 + .../Space Invaders 2_MiST/rtl/sprom.vhd | 82 + .../README.txt} | 0 .../Space Invaders_MiST/SpaceInvaders.qpf | 30 + .../Space Invaders_MiST/SpaceInvaders.qsf | 173 ++ .../Space Invaders_MiST/SpaceInvaders.sdc | 126 ++ .../Space Invaders_MiST/clean.bat | 15 + .../Space Invaders_MiST/rtl/T80/T80.vhd | 1080 +++++++++ .../Space Invaders_MiST/rtl/T80/T8080se.vhd | 194 ++ .../Space Invaders_MiST/rtl/T80/T80_ALU.vhd | 361 +++ .../Space Invaders_MiST/rtl/T80/T80_MCode.vhd | 1944 +++++++++++++++++ .../Space Invaders_MiST/rtl/T80/T80_Pack.vhd | 217 ++ .../Space Invaders_MiST/rtl/T80/T80_Reg.vhd | 114 + .../Space Invaders_MiST/rtl/build_id.tcl | 35 + .../Space Invaders_MiST/rtl/dac.vhd | 48 + .../Space Invaders_MiST/rtl/invaders.vhd | 271 +++ .../rtl/invaders_audio.vhd | 496 +++++ .../Space Invaders_MiST/rtl/mw8080.vhd | 336 +++ .../Space Invaders_MiST/rtl/pll.qip | 4 + .../Space Invaders_MiST/rtl/pll.vhd | 350 +++ .../rtl/roms/invaders_e.hex | 129 ++ .../rtl/roms/invaders_f.hex | 129 ++ .../rtl/roms/invaders_g.hex | 129 ++ .../rtl/roms/invaders_h.hex | 129 ++ .../rtl/spaceinvaders_memory.sv | 82 + .../rtl/spaceinvaders_mist.sv | 211 ++ .../rtl/spaceinvaders_overlay.vhd | 127 ++ .../Space Invaders_MiST/rtl/spram.vhd | 55 + .../Space Invaders_MiST/rtl/sprom.vhd | 82 + .../README.txt} | 0 .../SpaceLaser_MiST/SpaceLaser.qpf | 30 + .../SpaceLaser_MiST/SpaceLaser.qsf | 173 ++ .../SpaceLaser_MiST/SpaceLaser.sdc | 126 ++ .../SpaceLaser_MiST/clean.bat | 15 + .../SpaceLaser_MiST/rtl/T80/T80.vhd | 1080 +++++++++ .../SpaceLaser_MiST/rtl/T80/T8080se.vhd | 194 ++ .../SpaceLaser_MiST/rtl/T80/T80_ALU.vhd | 361 +++ .../SpaceLaser_MiST/rtl/T80/T80_MCode.vhd | 1944 +++++++++++++++++ .../SpaceLaser_MiST/rtl/T80/T80_Pack.vhd | 217 ++ .../SpaceLaser_MiST/rtl/T80/T80_Reg.vhd | 114 + .../SpaceLaser_MiST/rtl/build_id.tcl | 35 + .../SpaceLaser_MiST/rtl/invaders.vhd | 245 +++ .../SpaceLaser_MiST/rtl/invaders_audio.vhd | 496 +++++ .../SpaceLaser_MiST/rtl/mw8080.vhd | 336 +++ .../SpaceLaser_MiST/rtl/pll.qip | 4 + .../SpaceLaser_MiST/rtl/pll.vhd | 382 ++++ .../SpaceLaser_MiST/rtl/roms/clr.vhd | 38 + .../SpaceLaser_MiST/rtl/roms/la01.hex | 129 ++ .../SpaceLaser_MiST/rtl/roms/la02.hex | 129 ++ .../SpaceLaser_MiST/rtl/roms/la03.hex | 129 ++ .../SpaceLaser_MiST/rtl/roms/la04.hex | 129 ++ .../SpaceLaser_MiST/rtl/spacelaser_memory.sv | 81 + .../SpaceLaser_MiST/rtl/spacelaser_mist.sv | 208 ++ .../rtl/spacelaser_overlay.vhd | 228 ++ .../SpaceLaser_MiST/rtl/spram.vhd | 55 + .../SpaceLaser_MiST/rtl/sprom.vhd | 82 + .../SpaceWalk_MiST/README.txt | 26 + .../SpaceWalk_MiST/SpaceWalk.qpf | 30 + .../SpaceWalk_MiST/SpaceWalk.qsf | 172 ++ .../SpaceWalk_MiST/SpaceWalk.sdc | 126 ++ .../SpaceWalk_MiST/clean.bat | 15 + .../SpaceWalk_MiST/rtl/SpaceWalk.sv | 187 ++ .../SpaceWalk_MiST/rtl/Spacewalk_memory.sv | 132 ++ .../SpaceWalk_MiST/rtl/Spacewalk_overlay.vhd | 127 ++ .../SpaceWalk_MiST/rtl/T80/T80.vhd | 1080 +++++++++ .../SpaceWalk_MiST/rtl/T80/T8080se.vhd | 194 ++ .../SpaceWalk_MiST/rtl/T80/T80_ALU.vhd | 361 +++ .../SpaceWalk_MiST/rtl/T80/T80_MCode.vhd | 1944 +++++++++++++++++ .../SpaceWalk_MiST/rtl/T80/T80_Pack.vhd | 217 ++ .../SpaceWalk_MiST/rtl/T80/T80_Reg.vhd | 114 + .../SpaceWalk_MiST/rtl/build_id.tcl | 35 + .../SpaceWalk_MiST/rtl/invaders.vhd | 281 +++ .../SpaceWalk_MiST/rtl/invaders_audio.vhd | 496 +++++ .../SpaceWalk_MiST/rtl/mw8080.vhd | 336 +++ .../SpaceWalk_MiST/rtl/pll.qip | 4 + .../SpaceWalk_MiST/rtl/pll.vhd | 382 ++++ .../SpaceWalk_MiST/rtl/roms/sw.a.bin | Bin 0 -> 1024 bytes .../SpaceWalk_MiST/rtl/roms/sw.a.hex | 65 + .../SpaceWalk_MiST/rtl/roms/sw.b.bin | Bin 0 -> 1024 bytes .../SpaceWalk_MiST/rtl/roms/sw.b.hex | 65 + .../SpaceWalk_MiST/rtl/roms/sw.c.bin | Bin 0 -> 1024 bytes .../SpaceWalk_MiST/rtl/roms/sw.c.hex | 65 + .../SpaceWalk_MiST/rtl/roms/sw.d.bin | Bin 0 -> 1024 bytes .../SpaceWalk_MiST/rtl/roms/sw.d.hex | 65 + .../SpaceWalk_MiST/rtl/roms/sw.e.bin | Bin 0 -> 1024 bytes .../SpaceWalk_MiST/rtl/roms/sw.e.hex | 65 + .../SpaceWalk_MiST/rtl/roms/sw.f.bin | Bin 0 -> 1024 bytes .../SpaceWalk_MiST/rtl/roms/sw.f.hex | 65 + .../SpaceWalk_MiST/rtl/roms/sw.g.bin | Bin 0 -> 1024 bytes .../SpaceWalk_MiST/rtl/roms/sw.g.hex | 65 + .../SpaceWalk_MiST/rtl/roms/sw.h.bin | Bin 0 -> 1024 bytes .../SpaceWalk_MiST/rtl/roms/sw.h.hex | 65 + .../SpaceWalk_MiST/rtl/spram.vhd | 55 + .../SpaceWalk_MiST/rtl/sprom.vhd | 82 + .../README.txt} | 0 .../SuperEarthInvasion.qpf | 30 + .../SuperEarthInvasion.qsf | 172 ++ .../SuperEarthInvasion.sdc | 126 ++ .../Super Earth Invasion_MiST/clean.bat | 15 + .../rtl/SuperEarthInvasion_memory.sv | 81 + .../rtl/SuperEarthInvasion_mist.sv | 212 ++ .../rtl/SuperEarthInvasion_overlay.vhd | 128 ++ .../Super Earth Invasion_MiST/rtl/T80/T80.vhd | 1080 +++++++++ .../rtl/T80/T8080se.vhd | 194 ++ .../rtl/T80/T80_ALU.vhd | 361 +++ .../rtl/T80/T80_MCode.vhd | 1944 +++++++++++++++++ .../rtl/T80/T80_Pack.vhd | 217 ++ .../rtl/T80/T80_Reg.vhd | 114 + .../rtl/build_id.tcl | 35 + .../Super Earth Invasion_MiST/rtl/dac.vhd | 48 + .../rtl/invaders.vhd | 243 +++ .../rtl/invaders_audio.vhd | 496 +++++ .../Super Earth Invasion_MiST/rtl/mw8080.vhd | 335 +++ .../Super Earth Invasion_MiST/rtl/pll.qip | 4 + .../Super Earth Invasion_MiST/rtl/pll.vhd | 382 ++++ .../rtl/roms/earthinv_e.hex | 129 ++ .../rtl/roms/earthinv_f.hex | 129 ++ .../rtl/roms/earthinv_g.hex | 129 ++ .../rtl/roms/earthinv_h.hex | 129 ++ .../Super Earth Invasion_MiST/rtl/spram.vhd | 55 + .../Super Earth Invasion_MiST/rtl/sprom.vhd | 82 + .../Vortex_MiST/README.txt | 26 + .../Vortex_MiST/Vortex.qpf | 30 + .../Vortex_MiST/Vortex.qsf | 176 ++ .../Vortex_MiST/clean.bat | 16 + .../Vortex_MiST/rtl/T80/T80.vhd | 1080 +++++++++ .../Vortex_MiST/rtl/T80/T8080se.vhd | 194 ++ .../Vortex_MiST/rtl/T80/T80_ALU.vhd | 361 +++ .../Vortex_MiST/rtl/T80/T80_MCode.vhd | 1944 +++++++++++++++++ .../Vortex_MiST/rtl/T80/T80_Pack.vhd | 217 ++ .../Vortex_MiST/rtl/T80/T80_Reg.vhd | 114 + .../Vortex_MiST/rtl/Vortex_memory.sv | 80 + .../Vortex_MiST/rtl/Vortex_mist.sv | 191 ++ .../Vortex_MiST/rtl/build_id.tcl | 35 + .../Vortex_MiST/rtl/invaders.vhd | 283 +++ .../Vortex_MiST/rtl/invaders_audio.vhd | 496 +++++ .../Vortex_MiST/rtl/mw8080.vhd | 336 +++ .../Vortex_MiST/rtl/pll.qip | 4 + .../Vortex_MiST/rtl/pll.vhd | 382 ++++ .../Vortex_MiST/rtl/roms/1.t36.vhd | 150 ++ .../Vortex_MiST/rtl/roms/2.t35.vhd | 150 ++ .../Vortex_MiST/rtl/roms/3.t34.vhd | 150 ++ .../Vortex_MiST/rtl/roms/4.t33.vhd | 150 ++ .../Vortex_MiST/rtl/roms/5.t32.vhd | 150 ++ .../Vortex_MiST/rtl/roms/6.t31.vhd | 150 ++ .../Vortex_MiST/rtl/spram.vhd | 55 + .../WesternGunPtII_MiST/README.txt | 27 + .../WesternGunPtII_MiST/WesternGunPtII.qpf | 31 + .../WesternGunPtII_MiST/WesternGunPtII.qsf | 172 ++ .../WesternGunPtII_MiST/WesternGunPtII.sdc | 126 ++ .../WesternGunPtII_MiST/clean.bat | 15 + .../WesternGunPtII_MiST/rtl/T80/T80.vhd | 1080 +++++++++ .../WesternGunPtII_MiST/rtl/T80/T8080se.vhd | 194 ++ .../WesternGunPtII_MiST/rtl/T80/T80_ALU.vhd | 361 +++ .../WesternGunPtII_MiST/rtl/T80/T80_MCode.vhd | 1944 +++++++++++++++++ .../WesternGunPtII_MiST/rtl/T80/T80_Pack.vhd | 217 ++ .../WesternGunPtII_MiST/rtl/T80/T80_Reg.vhd | 114 + .../WesternGunPtII_MiST/rtl/build_id.tcl | 35 + .../WesternGunPtII_MiST/rtl/invaders.vhd | 277 +++ .../rtl/invaders_audio.vhd | 496 +++++ .../WesternGunPtII_MiST/rtl/mw8080.vhd | 336 +++ .../WesternGunPtII_MiST/rtl/pll.qip | 4 + .../WesternGunPtII_MiST/rtl/pll.vhd | 382 ++++ .../WesternGunPtII_MiST/rtl/roms/ic32.hex | 66 + .../WesternGunPtII_MiST/rtl/roms/ic33.hex | 66 + .../WesternGunPtII_MiST/rtl/roms/ic34.hex | 66 + .../WesternGunPtII_MiST/rtl/roms/ic35.hex | 66 + .../rtl/roms/ic35sound.hex | 66 + .../WesternGunPtII_MiST/rtl/roms/ic36.hex | 66 + .../WesternGunPtII_MiST/rtl/spram.vhd | 55 + .../WesternGunPtII_MiST/rtl/sprom.vhd | 82 + .../rtl/westerngun_memory.sv | 93 + .../rtl/westerngun_mist.sv | 218 ++ .../rtl/westerngun_overlay.vhd | 127 ++ 462 files changed, 107070 insertions(+) create mode 100644 Arcade_MiST/.gitignore create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/280ZZZAP.qpf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/280ZZZAP.qsf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/280ZZZAP.sdc create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/README.txt create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/Snapshot/280ZZZAP.rbf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/clean.bat create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/doc/Schematic.png create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/D280ZZZAP_Overlay.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/D280ZZZAP_memory.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/D280ZZZAP_mist.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T8080se.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80_ALU.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80_MCode.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80_Pack.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80_Reg.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/invaders.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/invaders_audio.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/mw8080.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/pll.qip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/pll.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_c.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_d.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_e.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_f.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_g.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_h.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/sprom.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/BalloonBomber.qpf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/BalloonBomber.qsf rename Arcade_MiST/Midway-Taito 8080 Hardware/{README Vortex.txt => BalloonBomber_MiST/README.txt} (100%) create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/clean.bat create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/BalloonBomber_Overlay.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/BalloonBomber_memory.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/BalloonBomber_mist.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T8080se.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80_ALU.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80_MCode.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80_Pack.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80_Reg.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/invaders.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/invaders_audio.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/mw8080.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/pll.qip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/pll.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/ballbomb.zip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn01 create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn01.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn02 create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn02.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn03 create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn03.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn04 create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn04.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn05-1 create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn05-1.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn06 create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn06.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn07 create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn07.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/BlueShark.qpf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/BlueShark.qsf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/BlueShark.sdc create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/README.txt create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/Snapshot/BlueShark.rbf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/clean.bat create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/doc/Blue_Shark_-_1978_-_Midway_Games.pdf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/BlueShark_Overlay.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/BlueShark_memory.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/BlueShark_mist.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T8080se.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80_ALU.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80_MCode.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80_Pack.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80_Reg.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/invaders.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/invaders_audio.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/mw8080.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/pll.qip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/pll.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/roms/blueshrk_f.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/roms/blueshrk_g.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/roms/blueshrk_h.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/sprom.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/Boothill.qpf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/Boothill.qsf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/README.txt create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/clean.bat create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/SpaceWalk_mist.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T8080se.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80_ALU.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80_MCode.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80_Pack.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80_Reg.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/invaders.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/invaders_audio.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/invaders_memory.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/invaders_video.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/mw8080.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/pll.qip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/pll.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/roms/rome.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/roms/romf.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/roms/romg.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/roms/romh.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/sprom.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/BowlingAlley.qpf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/BowlingAlley.qsf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/BowlingAlley.sdc create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/README.txt create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/Snapshot/BowlingAlley.rbf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/clean.bat create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/BowlingAlley_memory.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/BowlingAlley_mist.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T8080se.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80_ALU.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80_MCode.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80_Pack.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80_Reg.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/dac.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/invaders.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/invaders_audio.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/mw8080.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/pll.qip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/pll.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/d.cpu.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/e.cpu.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/f.cpu.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/g.cpu.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/h.cpu.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/sprom.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/GunFight.qpf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/GunFight.qsf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/GunFight.sdc rename Arcade_MiST/Midway-Taito 8080 Hardware/{README GunFight.txt => GunFight_MiST/README.txt} (100%) create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/clean.bat create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/GunFight_memory.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/GunFight_mist.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/GunFight_overlay.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T8080se.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80_ALU.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80_MCode.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80_Pack.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80_Reg.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/gun.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/invaders.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/invaders_audio.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/mw8080.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/pll.qip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/pll.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-a.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-b.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-c.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-d.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-e.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-f.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-g.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-h.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/sprom.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/LunarRescue.qpf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/LunarRescue.qsf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/LunarRescue.sdc rename Arcade_MiST/Midway-Taito 8080 Hardware/{README LunarRescue.txt => Lunar Rescue_MiST/README.txt} (100%) create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/clean.bat create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/LunarRescue_Overlay.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/LunarRescue_memory.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/LunarRescue_mist.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/invaders.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/invaders_audio.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/mw8080.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/pll.qip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/pll.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/col.bin create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/col.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_1.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_2.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_3.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_4.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_5.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_6.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/sprom.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/OzmaWars.qpf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/OzmaWars.qsf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/OzmaWars.sdc rename Arcade_MiST/Midway-Taito 8080 Hardware/{README OzmaWars.txt => Ozma Wars_MiST/README.txt} (100%) create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/clean.bat create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/OzmaWars_memory.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/OzmaWars_mist.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/OzmaWars_overlay.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T8080se.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80_ALU.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80_MCode.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80_Pack.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80_Reg.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/dac.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/invaders.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/invaders_audio.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/mw8080.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/pll.qip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/pll.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw01.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw02.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw03.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw04.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw05.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw06.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/sprom.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/README.txt create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/Shuffleboard.qpf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/Shuffleboard.qsf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/Shuffleboard.sdc create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/Snapshot/Shuffleboard.rbf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/clean.bat create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/Shuffleboard_memory.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/Shuffleboard_mist.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T8080se.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80_ALU.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80_MCode.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80_Pack.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80_Reg.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/dac.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/invaders.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/invaders_audio.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/mw8080.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/pll.qip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/pll.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.e.bin create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.e.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.f.bin create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.f.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.g.bin create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.g.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.h.bin create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.h.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/sprom.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/Invaders2.qpf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/Invaders2.qsf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/Invaders2.sdc rename Arcade_MiST/Midway-Taito 8080 Hardware/{README SpaceInvaders2.txt => Space Invaders 2_MiST/README.txt} (100%) create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/clean.bat create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/Invaders2_mist.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T8080se.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80_ALU.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80_MCode.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80_Pack.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80_Reg.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/dac.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/invaders.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/invaders_audio.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/invaders_memory.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/invaders_video.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/mw8080.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/pll.qip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/pll.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.a.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.b.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.e.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.f.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.g.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.h.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/sprom.vhd rename Arcade_MiST/Midway-Taito 8080 Hardware/{README SpaceInvaders.txt => Space Invaders_MiST/README.txt} (100%) create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/SpaceInvaders.qpf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/SpaceInvaders.qsf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/SpaceInvaders.sdc create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/clean.bat create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T8080se.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80_ALU.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80_MCode.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80_Pack.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80_Reg.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/dac.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/invaders.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/invaders_audio.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/mw8080.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/pll.qip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/pll.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/roms/invaders_e.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/roms/invaders_f.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/roms/invaders_g.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/roms/invaders_h.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/spaceinvaders_memory.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/spaceinvaders_mist.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/spaceinvaders_overlay.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/sprom.vhd rename Arcade_MiST/Midway-Taito 8080 Hardware/{README SpaceLaser.txt => SpaceLaser_MiST/README.txt} (100%) create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/SpaceLaser.qpf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/SpaceLaser.qsf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/SpaceLaser.sdc create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/clean.bat create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T8080se.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80_ALU.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80_MCode.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80_Pack.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80_Reg.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/invaders.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/invaders_audio.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/mw8080.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/pll.qip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/pll.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/clr.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/la01.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/la02.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/la03.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/la04.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/spacelaser_memory.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/spacelaser_mist.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/spacelaser_overlay.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/sprom.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/README.txt create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/SpaceWalk.qpf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/SpaceWalk.qsf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/SpaceWalk.sdc create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/clean.bat create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/SpaceWalk.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/Spacewalk_memory.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/Spacewalk_overlay.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T8080se.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80_ALU.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80_MCode.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80_Pack.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80_Reg.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/invaders.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/invaders_audio.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/mw8080.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/pll.qip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/pll.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.a.bin create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.a.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.b.bin create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.b.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.c.bin create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.c.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.d.bin create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.d.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.e.bin create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.e.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.f.bin create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.f.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.g.bin create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.g.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.h.bin create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.h.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/sprom.vhd rename Arcade_MiST/Midway-Taito 8080 Hardware/{README SuperEarthInvasion.txt => Super Earth Invasion_MiST/README.txt} (100%) create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/SuperEarthInvasion.qpf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/SuperEarthInvasion.qsf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/SuperEarthInvasion.sdc create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/clean.bat create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/SuperEarthInvasion_memory.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/SuperEarthInvasion_mist.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/SuperEarthInvasion_overlay.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T8080se.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80_ALU.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80_MCode.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80_Pack.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80_Reg.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/dac.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/invaders.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/invaders_audio.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/mw8080.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/pll.qip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/pll.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/roms/earthinv_e.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/roms/earthinv_f.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/roms/earthinv_g.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/roms/earthinv_h.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/sprom.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/README.txt create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/Vortex.qpf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/Vortex.qsf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/clean.bat create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T8080se.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80_ALU.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80_MCode.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80_Pack.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80_Reg.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/Vortex_memory.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/Vortex_mist.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/invaders.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/invaders_audio.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/mw8080.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/pll.qip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/pll.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/1.t36.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/2.t35.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/3.t34.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/4.t33.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/5.t32.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/6.t31.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/README.txt create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/WesternGunPtII.qpf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/WesternGunPtII.qsf create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/WesternGunPtII.sdc create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/clean.bat create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T8080se.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80_ALU.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80_MCode.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80_Pack.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80_Reg.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/invaders.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/invaders_audio.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/mw8080.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/pll.qip create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/pll.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic32.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic33.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic34.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic35.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic35sound.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic36.hex create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/spram.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/sprom.vhd create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/westerngun_memory.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/westerngun_mist.sv create mode 100644 Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/westerngun_overlay.vhd diff --git a/Arcade_MiST/.gitignore b/Arcade_MiST/.gitignore new file mode 100644 index 00000000..345e6aef --- /dev/null +++ b/Arcade_MiST/.gitignore @@ -0,0 +1 @@ +Test diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/280ZZZAP.qpf b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/280ZZZAP.qpf new file mode 100644 index 00000000..78f1c762 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/280ZZZAP.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2013 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.0 Build 162 10/23/2013 SJ Web Edition +# Date created = 21:27:39 November 20, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "21:27:39 November 20, 2017" + +# Revisions + +PROJECT_REVISION = "280ZZZAP" diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/280ZZZAP.qsf b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/280ZZZAP.qsf new file mode 100644 index 00000000..d88d2228 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/280ZZZAP.qsf @@ -0,0 +1,172 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 20:51:02 August 09, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# 280ZZZAP_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/D280ZZZAP_mist.sv +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/D280ZZZAP_memory.sv +set_global_assignment -name VHDL_FILE rtl/D280ZZZAP_Overlay.vhd +set_global_assignment -name VHDL_FILE rtl/sprom.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name QIP_FILE ../../../../common/mist/mist.qip + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY D280ZZZAP_mist +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== + set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# ---------------------------- +# start ENTITY(D280ZZZAP_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top + set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top + set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(D280ZZZAP_mist) +# -------------------------- \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/280ZZZAP.sdc b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/280ZZZAP.sdc new file mode 100644 index 00000000..f91c127c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/280ZZZAP.sdc @@ -0,0 +1,126 @@ +## Generated SDC file "vectrex_MiST.out.sdc" + +## Copyright (C) 1991-2013 Altera Corporation +## Your use of Altera Corporation's design tools, logic functions +## and other software and tools, and its AMPP partner logic +## functions, and any output files from any of the foregoing +## (including device programming or simulation files), and any +## associated documentation or information are expressly subject +## to the terms and conditions of the Altera Program License +## Subscription Agreement, Altera MegaCore Function License +## Agreement, or other applicable license agreement, including, +## without limitation, that your use is for the sole purpose of +## programming logic devices manufactured by Altera and sold by +## Altera or its authorized distributors. Please refer to the +## applicable agreement for further details. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition" + +## DATE "Sun Jun 24 12:53:00 2018" + +## +## DEVICE "EP3C25E144C8" +## + +# Clock constraints + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty + +# tsu/th constraints + +# tco constraints + +# tpd constraints + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + + + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] + +#************************************************************** +# Create Generated Clock +#************************************************************** + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + +#************************************************************** +# Set Input Delay +#************************************************************** + +set_input_delay -add_delay -clock_fall -clock [get_clocks {CLOCK_27}] 1.000 [get_ports {CLOCK_27}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {CONF_DATA0}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DI}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SCK}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}] + +#************************************************************** +# Set Output Delay +#************************************************************** + +set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_L}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_R}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {LED}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {VGA_*}] + +#************************************************************** +# Set Clock Groups +#************************************************************** + +set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}] + +#************************************************************** +# Set False Path +#************************************************************** + + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + +set_multicycle_path -to {VGA_*[*]} -setup 2 +set_multicycle_path -to {VGA_*[*]} -hold 1 + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/README.txt b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/README.txt new file mode 100644 index 00000000..50120049 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/README.txt @@ -0,0 +1,27 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: 280zzzap port to MiST by Gehstock +-- 05 June 2019 +-- +--------------------------------------------------------------------------------- +-- +-- Midway 8080 Hardware +-- Audio based on work by Paul Walsh. +-- Audio and scan converter by MikeJ. +--------------------------------------------------------------------------------- +-- +-- +-- Keyboard inputs : +-- +-- F1 : Start +-- SPACE : Fire +-- RIGHT/LEFT : Movement +-- +-- Joystick support. +-- +-- +--------------------------------------------------------------------------------- +ToDo: Color Prom + Controls + DIP + + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/Snapshot/280ZZZAP.rbf b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/Snapshot/280ZZZAP.rbf new file mode 100644 index 0000000000000000000000000000000000000000..8a3c29315269bd4862e31974a9333cda577923cb GIT binary patch literal 240973 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 H0}KBjs+AYU literal 0 HcmV?d00001 diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/clean.bat b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/doc/Schematic.png b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/doc/Schematic.png new file mode 100644 index 0000000000000000000000000000000000000000..14892003c5b9de7ce7e86c16612fccf7bf803161 GIT binary patch literal 594972 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ð=Iv`)_b?tdnS&sKGR>4q6T^YJT6n{WYpTe^Ob(yas|JvHD`WVn@KhD z72aRHz|*lbGcJ#2;FlHt^})-VlKDK6t}Ihz{H9`cWy@5@ljoCY9jua%A>;8oYaoyJ z!~Aq*>3BHh6W5MCb@>jMA;=ogO`bEtF9Xudj&q@(livX6Y60{oLzH^8u!&N?RJbxt z4o6@516*rYfd13>m(<&Z_ulzG-kI*Rf4K5q&+mJCfULHmhm}^An*HUOIGgQXa?q9i z%_pyJ=>4hVCy>|uwjGWQ4>%s!@xYEdvdCM$k`KS^Z}4MT_@n~)WqgmAl0~7vAtvQ5 z=haVd@%PkO%`bbo=jL4lGpKl!;{Wy3CG{IZZ9 zzpS=m_+`bjW1l3sZuS(qvfnYOLT?t`UZ%;EOJ@-j+ek>oHUu#I&m*?4#HssCn{8n} zB-Nt%nhn{@me$`v#3nEk)RBM7eD`$~%OOs9GDLC`&Og8T{04Gzn~x@yKP2C$tCIo7 zu7MxmU+?)*%#Cgejm*jwYjBZ|TN)mBIv;I0Gcx>dox`4^C%!x}+|~)p$-Nh^P9ASN zbYlP^LEgUp>yJJQTs`{VV0h>Ri`27Gf7thabMyW64fW3Y=A97Dd=CUKcN}kVcD4?W zg2CWhCx(s=3=a=cJHkYAV16~0y}hhUZ65wW^C70@#|+iqUw?>Xme?szgP9cZ>!)*- zfMSzkK$er0yQPrV>d1TB6n@O@=6;uSd)aBd+rcD;K#(u)cEe~CQ)~%htz~v<9J9!5&(ENl9KlE{#&rkkD)yiPQzX)pu=$V10Qq(D^14gG>zVX;jDLL6JFPg;R zt*GK-A)#O|Z1P*-c;a{3AV|F#RoCdRjpMTXdH*DEp`yAo=6|7cRtyP~khO#+E1^** zBDJ99hs|_xnaTFD^njBQeHeF>T1Yi@!$VNL7;H4iUpv)r@T+y=^D^qf2ed)HLhoPE zM#(X@q;K~9; zqY>Ueb~m>_gn#`gHLtx%I)x9&+y1PpHm&+(J%dv8D>ro??q`dkSMiCliNs;Leh2_O zthzh`{QSDtX9&hc^6+CyE1>ACDBeFpDKk^@XcFLiO$eJXx)x~}Yx`;rk2@+C>8IZW0@U#>OA`{#9Kd&@r##au1s z&mmSxToqT(E>F=xC$1*$VUYmhYHlA}S3ur>Pj*VPht@_`LNgHIV&1#1TLs?#vP&Kh z4{`wztKAMEOWr?U{acmF`!8NmaM()jLvEB>6Q z*2lz-gP52*#rgr3uLv7ULbf$l`vYBjS$LoK2QWOZu`1%@sXiAlIdp599V1S+(lLpf z>*D6yh+o4pq4@N?{Ft=mDzsZC1bsx7mkFA2o?88r9X2m}zrtRItaQbt+soe2yZzqj zqa^aHx&3C&5F!65lrVUG^%&m}i6u>u&P-ERR*|=yZ@gOj+siULql#P^G?^ISF|dbE`Oe>Rx(FUQ<2DhOxgw7rNbypBc{sHpLL1}9qOKn^S)mUV(}Mm8 zC^uZjLA2tGO@+NI3*JAE%l0}N+;)9SM(t(k@tBVlzw(qQ8(>1&1lxJ2RD!)M=NFXo zG9qYI%Ra6cjJzNGW6J$&0q9#f7{@ms?)xXl4U1G4J98Xz%V+lYd zHuk3wz?8TQ@2BK4x>S83;1TJrXC;FewU>FnrMd!Uz-3w6(9bJWaw}vIi19a#7~c#D zw1fF!CKKR771b1a;IU0Bzyc#l zQsc36=Cz~vt{$!JQy=*$9DJNYD~l&}hJ@AM_%!mCM<4z}twb1mIR3!!InpQd%g9afdJU zQmqkw*)6TS<+rMN%L`pj^7gVU{Fpag<+6hd8nl;{fKCQd*?3|ahRFiUg_P~3-Hd0m zq*^qK>7IjGmPhZ6Hbl-)S(p!hO zWBq4S_tm=gGO)OelT_~8mvI|b;{qayv{Xv7W7N50BQvbT+(`!xj@!$S(#Rr}bbA?J zwXFS^koKUlGP`wx{KACG-teQ8P|dvOFW!&2K&&+RcnqAewy<95CsE2#sZVW|7RaE)luWtpFQD!o>Z;>52X7=m*{3nx3tWqFDO*;sWGMV z!N=e@zpVZ0K|>hX1V5&`VtY1oVb0UncXiB7lVb`2Yz`yiE$+8#mJX<*<1*|5l62&s z$oanL(suFs_Q~_U7!B;1fYJJF=&{%14olG>F5`E}oZdewf8Kuylv6n;-7Oz`nL;Y_ zsMdWYq+f=TKQU95l?eY>LTPf4ldZ}}mANVzD;6+1zIaGptElk*J>+c$Z4yM1P)o1`2_0P4o9#Cf_xz}QdpI8U z4xJbp>>M6C(lKym_yqhI92)R+o*D8E4W8-r3?CmD92o8FJU;MiPg_7_kxbCV#QbxV z=<@zeh8F24Y)Gd`ghcN%ubCUcQ5%J%X)f|7H~GRx*Q#hex_LK54DH8FKZ;K@qEDwU zhq{v68t%eE#oEh?R!-*5`>!jPxkF(u>(sh0U6Q`geoU0Mo(Ck`7*%8xXc{JDkE}~s z<1$Rju^7e9`_1Syit@I5G}4OLZbQ6F+MA%njyd#N(Az~8H%nXUQ}s27JSJV!@ME4K z=XZTaf+)-uG5;Ntn@SIt!FHs9MpZuna<-iSsaQ4Iulkt-6UQ^|-gG$BgfA#GOLV?p z!v7gA`x0?|E;&QYnQkvD>*Sb`p%dQTVXw!_$}sz{$J0CH@eCdv9P)Yqv<(jr!{y=b z{wF{ug9wu1Kh9>`qFNgDaGB-#F?H-^kv?i(2Bv=39xrO2XaidLUL{hhXx!*434rArGzv*GLb1e&}4U zbaT`}zIg?7mZyaGrdGveVFq|yZGV{hTv-0}l|M|aP4)DA`btlCYxm1QAJGvnex?@jT-Eat7O&rFEEQut&;cTNB|+f z003Ry|HD@E{ztWMrt+-^R>J>4poafJeq$2v|8LONj@AbtwB_ZMO)JqlMsL4k<7~Als+sg{AE1POHLV|2Cqo*lx7PuK~ ztC>iYX{$18j>oS&i|M>@MCo5AedHxfeS6|&*_SVEjDhhJ@@#-aF<>tfw<8q03op4u zmn4FuD}owvk*|-hKj9;9xXteQdJl~HB2W85efW7$f{pe4Qqo9>?j%d@`HS;`iP(hq zqj}F+z-9M<{B^yv+3D;!-ZDHe2-cc2-l0Zj-H3XDp0)s=GI2Y7(`lA zH2s)CzK-|VzE?W3nkq{Gm$ma&Prqhe#lWfBGR0-39FNJr1?Fp^|L76IQodiC`Y}VK zGD=RQ67y4OQ2N(wm-rTSs`!U%(fQ%=R6pkIr0eUq@a!Xq)HfW)OvvB;jTi zXy;DSz(<$I{g|R+rtM-ot_kmJaH+q=>A9253C3&2i?)&D+2b;I`F3}eFcHKZC7_uw z4!cW);`3PE%OP(zu$K3qRo-$sdv5_>l(X936m^T_BxFzD=9j$$n^uz9o!qCfi zlF;4yJ34*|54kjOnZl20|ApU?(dv;j_gZ2c=z1=l$PU zPyg$5`fr{X?u)d8nX7|tM?!CGX z`75yeBM=SXyU^}CRkyz`Ipc>sym6g@?#O+5p1gmJd{1REw`R0Guw5mP%J4;z1uw}N z0P-I3hxKro$p+}G^!~x9O#1I>`w?jwr|{pLsx$^WM{l^>qqV1M_Jer~@+iHy0i_Df zsuqQ=Y;rfn=V2;8-hUSSGNCy9vOezIF5W5c*!ARwCtF*cJ+!9gQf;x)vEqE@XHvx zPG-)DOjmZncpVk|vhM8pW$%_RzbvF*$5nDJt}A=)?6R;TiV|=>Lhr>4`MxToINX@tUK-Rh4!@hL3ZQLy1i6hicz}P6oVE!JNggQO{mxvLEw|fip>a8FaAWYpx&B z8eS&huDoZ?Ezo z5P>OTAkdOU)06YST1Em^+k56v6n;!(B`zDz2A5I&vNxl?Hs(MdcIN%z?Gw&4mKtvQ z=f@5FsisbbZhp)vF0;Oz=bQXRzB5-OE*sXmFP$^cR%BFwiOesfa7@{EDCLRl`czT?AlA$UfQ%O4vcNHax=kYNQeb|Ro#g_%@h>b&&*s*!#^8VT zD~)L}Eoih^dvO|R`2oLI%NdttZ!arnKW0SFk107YsVH^~2k_*43=C(2ltT_9OL_m6 z=V2NuTob=Y-uEf6((CuqSRq)*n)IUz6uf`82CNKLGVh<10`Gr>Cri32f@iJJmF>~G zc_HmgYcaWwP-`(RFe@f>WtTgTR($T0 zhb?NyS2bAWmwyf)%M<7SL+d%U#-DsSXWoBL)~`6aQog)@QKgRRQn9PT=VXP-$*uyC z-E=KxYkB|aEdPigiw}H}Zt?nahwRC0q>IZ!~e^u3$wW6HlH+$_B zX)o(Dw$({D=@i+IN%xhqA5&!7vY3XN%Yuzkt~uN2OU&A{?_{HanR^I^`TcBZpPDgM zK_tQ1S<9f@bB|RGtvVGgBJ!;?W7>5sM=IWI{K?t)F@1TytEEGvY|El*>Z`aZpVG=` zC`$u-#Fn<=>Kq!(e09Y`ekOj;=E~R1`0R@9ccG+ ze$4PTKeMqP1W!dR>G7D476XcLjwWfO z&=nuF%ce2)Y}!-mYnD_?;c!{xPNdeU61uV|x$E8R%{$m=bI2Xh*7lbG$1;_ZlTr=M4Eww_2NEwvkd~U zvci76)9IssadX>UW*miUrEzzfyJ?5@=W^VpmmIK{hFsqW7P5 ziCWRm7S%pHq7IWu|%aqxr%c;aRXPnF6 zC;&lA6mu=2Khql)5wz}pf+_J4KN8spJCp@CuERf|?+57aaPtvEn4{2o z{{?)bA?LFUXv(lEwnsuyhsjX5W^WD3377GK3?aXP?TxK)S?Tl3c-QgE+{Ivp@XPwR zGrcz8mkAP^OcwnFF4>F-XFy<9m|;q@cJccsRZKsr0Df7{Ihfl_uj9);wM*eXPOLJ1 z>0Al4<8vCqq^(aLO3f`V>haq)l_tL|_0!6YUq-^4RO-l>i;NsAtbv#;9T>tlhgPD$ ze{kwOv4^a5&x8bMM{xzTerqXriZYyl2K+L45DueHk)9B6(1M@_{4+>7r2hGQPVOLo zkIUS494#il43uQaDzwopY49F%#lQdPO3!cB={}Ngqgy_W>W8cRGIIj zy~Wwy4yk*ao1M+hUnD?VyRLYe4!2GhR6E}gs24lEQ#qN`W29CqBTw*#m&K^gmK%| zKbc><&RdGh(wB_WmbU7ao!j>AzPqO8{^sUwdutk+>p>6W#VzZh>y3OTiA$-0K_8d# zZIsfIBU%?MXuK*eQz_5u;j&7xm+`nvQ@<>I4_&+o6~(o(*~A9S3_91b-DrR&WU}E) zsG=|JVnN)mR~2G(r7xl-g3%_tUhim8quN@>O*{1_H;W`ao|qci$p2ajkkPM1f> z?EL#Egz#aFv91lPcrcr_y-a+od^>LVuCyK`O;yPg^goccoW$ltB2qqoZ|o4<^1RUD zqq72}kZ6=lIgl>zGHIpuvN~zH0N*4;9R>~IvY_5Y3vk(prOleA<&PUBQRu~FdbRxq zo}jf>D2F;~bhuR*!{F?+ME zeY=z~^?tIj^$rs2rcaw~Ef=ZT4>dt2iieIfwSNKpm~i9=u-zMVY;DA+i37IFq4^OX zIeZn7eIkj~k>lhDdfrbnGu(s*qR!1Wg|w3v^iudSO^(M*-^yF-$4tXq)XfjDYU%dm zj@(F2U49#uVix1qKzsTzb!3Tb!27S$hdJ7XAsVDFFcN9udg2 z@_~)`n3t=%vIXS*i)-Etynj2jqpT|%elEk!Ki7;X_~cv=2&k`qKXOh{$Eg)TNZut%)7caREeXr<$e0<{LtBCO z|EXgGS=-@ot$gAT$WKQ5$Sub|5a9i3cdfT2t;4A3WhwkJo_)H&zl~bk&#AV|3WI4PfsVKluH*U z$Y5|8iWeyhQb-sh#2-R2DUK~0T*fzAZw~c$lHmAA7jXU}Ad=fhL4=KQStFUFZ)CWe z%|I{qadRmaRYn8LUykQ!HaQf(2j#o3)YX+W8J870Z+SZA+D`EE-z9nCGA({ts6z9W zpDUijRgsePol4}Fg?WD2Xv!s_g!7hDLX52bNtqdpXtu19Z@QYdymb0wjwAh$`E?xS z`jNVTBo!)7lDJBkU-l{?{~=_)`4!bm5(h5SEHGTH-!NT<=fZDYCFjEw6X&Qr zDkjshdCAxx*V9OJ8JuIE(6N_U9*;RQqNSE-D{WQ_SS zXn4Mk*E zve(VSB$n10HK|d;FsIJ(+_Axm(-Fq@&*K*>Q;rwwKE+#Eo*IrhZ@t8C& z`-Ydwhto3b@%FxE5SInh&J;r@Lk`1~qsb*z3`oBOlG!u?9kK<v(`WA_{0vE&&u3-RXkLj$K@hnU*qk*}9 zQj~JZrO#kFO=&KjN!{#t%=G?OXq^m{wmccp$>7)b1udP71-F%;wg|wi^mS!Fc5&xU zDK6TMXD!ai2fj~VS@C}QUp?{C-Q#R(awN;TpB(7k^*!e^&Ify(+Pr_F&--^4hwCV= z2vm_#r2JSAW?Ypny~lX}GqP%dG2D=u^FC<%KRPX0hxW@3mS z_=DK5^fdKjGUf(T&LH+sGOOClwD)*|1$kIKsV1>_2hsIo+P{6(O$c3ic1N5)@84g> zeR@~Msh!STkhh#R!W=dF%el=_e%+2=yA<4DlTAKtn#0SQ^0)za&f{6z6jO9%dHu4W z+e%|&5sFbJL{dz z4GnOvnf|AJu%)AINXBR0@v#Xp;H3;Jg6H!FAzARt+KY-*rLIE@q?ijxbTh7Pg{3W>cI$VLi`W4GiiaPKA1!sf2xr5DIe@jbqGaO_wvK9Je zIq1q3DQ`$Y%13=#T~WecI39O79T3^R64Py_G-E9Ym~pZ-RkjaZGOys25?#S z`ei{aep%3d@tDXITvoiIz-6cSiEgeS&29FMT zDBPO3UQLt)%8tOqtk-DP;#Fl*Tx;RHM;9&3@QQ^1q_uF>#g%=a=SJ zK`pBVGDTN5&rY}K1(k?aH(0DfW_Mq8dzpyl1Cw-DGr#D|WiMj_E^AKeL<_jAdis(w zZ@I{A8QHf5Iaw?K!wm8;$&52%LX63Ny-D34{To@k6}Zf=QGK5G zUrP3}9M?D-@XLymxBOOZRuY>9ZJO?q=a(gkX3Gi2nWQT_LzYDy8PF=f%%1$RUTbt^ zr<5YZdi=6N>B>q%q=!J+^`~aHV{e9gqBA+Y>vyyI5S4>thZG9dcITHR4wfHIuj8`R z>6W2G35lhrc_eO3LK}kF5FBz(^7m}Em+HB$sd8>fRt&@1gk~Ci!J$OCTqoMno11GKul+4 z${LZp-k3X`re9WsjwDs#aT1F3nf>TY)UPGT>X?GfPPZbC~g-TePPScN>&iijDA|PWv0Thsyb1X`EGpST#K=KkGdx5h&aG9^jmUQdO zKEWJZmQp@a!(93C{;?S?g5Nq0uCK2e$>P(3+0FP!hU*bu^jp8p`l8Mlc%j@N$M~!u-hc7Rd47kSudb}oIeDRkGd#Uv96A(5??0hG z9G~+9KxGh*iK(U;<7(iPOeS`LW;aO%m29EQu=#z+6R!r%6JaDCGwWSLj%CC6`y_fV zB8%I8XZE+wl+G&RkK};yG2dv%v;FgX^2D+(u<(aa$Q5(ZFX(M6rH(E>rq@SMTyv2o zkpq4iCsr4q1MVm7K+4!}q(0Q27SlX=W@tCUoG8TaFmFEfa<79y?SD`ei)^6wM0F zFRSAcsJ8-d^TD<5mCJhkGC`yI3Vzw9%F!`c zm5rYy&z^&Y0gS}N+Ngue3J%b&3ln4`8V6h!HJj{^$;B7-6OFV?S>UqcSyyW*KZ0Z< zdF!2s5AR-o7x<|<1Er;f7C~ye$#{37dr3NnVIW6Be@qY*CH*oivHr25?}f-X!CjXa zxO$UBwBA>(-t=NQE*r75RaF^YL6z_S!k(I)Aa*7;`2bsm`WAiMijFmLnIaF9{qkel z9+xTf%LJW^CYEpsKNfw#+5Sr$r9?8G?REo9)D}Fbn)elNYvhp0TyO zf5W=6{u@tE!?x>>hpEkLu`kl*Qb2kQT*gX$K9`CXMxGY7N0AbY+*RxQSf!=AR zFrBCm`yyE{+0lISFh%l1QeA*fPC^}GU96v+DXAvc{cdp$S&^y!``K>-4b{YKozn;~ z4pCIq=%WeJDX=hRFS}+bE=$Kr*6PZt<1$s=|A@R!f%@^HfE``K+PLhRmc1-wKfV79 zxXdu`Uo^&Bo3U6|_871JY8mf8TwA(4>&se~g2m$f3+hDKWX9j*fsmrN$7KaBXWqXY z?qEya|2M5`WQXHb;_TB=Ni>c3e=eo7&@&=`&$7!b!Q-6kC|LOVGEwrw?~)zsvVPZj z=PeJ<+9mGAaz6GJz-{Q8I)$pIkpxGn!NuI zeUGl+!xv`>yr0X3_g`23y0Uj9dH>=aQ=f}OLn}r|qjiOaD5Kkb-5@NCh=0GcxO=K(~lg&z{+RM(IaS`zgf9NRW z;%SU_so!L}N+rG;m}WsEycI0$((^WDXO+uwVxZDYSBN$K_l$l_pVBF5q-5{MR5WEY zKYJO~FN2zU#w8`c(z0vn+X9i~1A-sZnE2;0lJ$SE6w#!vlM#Y{v93RYaTk*g65AJ0 zfA)QfKjMnz`eoMY%BnKFcvtPBV?;(MALcaZ+$;Msf~A3&P+vXC)9rh3$Yz3gSB zkIVFQWv%lzMoZX_shO#<=zdJZA4!_Bg7iB^vYc!nKJz16fwK^))Z(JiTVvqI!7iRA1@-bU1uK&GuNfH_L`BAB$|6eB zG-h_Q01d?yDRqc)W<|RtVyakNw&Y?Vb=25#d!v=O3~Mg%^N9}S%lKComwy6~vgF%N zVy%Z$KHo0{=Eo*328fp{6BAzV#p&@IHzvm7r-p7!KYOBo^v%|Gr?cZ==V0fN&NCj* z*qNgj=jS|!Ex~1Z=Pi$z1VORC^m?~WlS=&$(`4n;!Vd>Dqk)RprvM5nb7&`ezzFP3FG}IoDBqmAKYES?gU1%{)w= z?EX(@kMrLT9O&tO+1Uf7`=>pHV*s(X*fTjP{JaclL83g{dWE|2}|U zmczS_zMCh%Ec&iF{ZV|b^oB|}gRU%_yk;n=aMd>xe|<9|Bhap%jdXRh)5vZ}7E^;YblF2Ag5FVo(T(9&PTYRW7ODU}H| z{ZE6XjMB|eJn5XRV(2P{UnbcD661`Dr-C8YP3>iy+mUtlGXBvcPYeF^^J2rG$K&<( z4h;?rdWMbuCbDL-tyecbSepoN-(*diY-tgTqKzmR0{)a zIM|OMLuP=f{YWP<@}syzAoT&p%z}-2=6I7OxY8Tm+IURWyyZNFi+-VG{Y4v z3G;Jg%sU=HzWK?y=?TahKR567dcI3d%%j6Y-l5*%QSY!;^(#rgtVG;QN`4uK%NDHT z{o9dWR!Y2oImn##BH&@5d4v*4GwGFi+X$Cc8ZJ|myATs2p93m0c7-)oR`d1#BOY)K zrq4+e-XZUaAT93xSdBeZ+YQy8LwZq zU>)zjwsf211LL@?zo-?Z(|G_(vl|no5+r$Sfm;@B!ZWiFm%*$*IgKw(ob`@NFk^Jc za{{o&@Gxu@Jws?kejShyMb_1#?rf4AV9+T3s%&R4(e{d`l62m6~E#!J#(w%~BoX45O=) zBme;b)c#Mc{t|7L#+V;dJmL$mNd5_s!b$yJz^^dY^2-ieJ7NvuseY6ZyD56E=5$xh z!&KxFEK)pXQQj>DEmv;nuya zBp@WaFLA~4{zYd?cgL?AUVrUC`?lu#o%Id%d%@A>Y;g`A9PIFTJiWui9){0;H!*+1 zcM*88(=A(#uXL*!Orz=FEYr-FkvZ2TkmvPpF9P(p29PT_P zaYDY{vFEqZ(i0y#?{I9^>v|I5LWI0vcp74rM1-d?jldLX^b*SyhC&Xn3TvZICPItq$2@cVmYWoktb&WV&UyG)6)s~UR66~Oxs_vQ2FwIvvbVm9x8 zM&|2_WfebR#(^ok|K4mr_Ljp@n_u;Vloa3Xc;Hnlnr7-7@th#{nQ!3t-%nkExpj23 zN3C?z|2?zeHs`K&yME$utb@t+j$}KoDn-&I z$98wai{7W-?5~L`rG7>V*LKp~2zy zgF`3!TNr`3c~`^EX399Ozkdslwzh3++IoL8HGb7MJG<+TbPgXKNb+OGrY~NaoDT%F zKQbcMDIb2>^jN`O9-{gNh;scg)A^y^%v41)G3m*)1O0!=EW2A?nH7s+#)W*4WL|$T zJZ8bjmn~9)-km}*>}AC(#_eUP4HHSRCd`w-_a~{@dVXRqIyW{sADh1z0F&qq@5M`A zJUt%uUb=WTfMGV8I6L8;^IjbvpLpKkxD!ZwRO(}tQvpf+#ltIvc!oxk7Y3O}56o`s z8k`*iFimz24;<<5?1u1)_J$)v9nSWa&fy_vqBO@3TBIM;V{rW7@s4)q-fuaZTXxp3 z11odGuI8Q8)GWnpK>S7v1a7o+w04XhJa`6t4a393L&F|QMfAV{P!WeI8*$7#cE#(T z6yZzL`6+Nx*IpJUmofd=>3~Spexk8)@M7M$5&w3cUpO2!o>7l?XvouY9KJ;>!4F** zz9838|596Oi@@gtEdh>(y@PP;2Iqj&*$?0GApL^7rElKQaDc53>){L5Z`--Gxnb|N zy$$s{_rR6=z0^7^f zbGR516f{KPy{9vWgp>cl|H!PWt3 zw%{<=mJQorFtIT(&~fmncX*Idl7WPbK!{~77NF9ErukO2{g`Q|x^^Xd4>juh6g++hI)sFkB$xu9Ut;~j=(v%&`Y4F0~U`!kAMmnCiHcP20GKy~V zWyWrNGZ^IkFSx6?tiVNSFUtv+;aK2o;8GxZ1@=qBY-a}((2L|l`Ti~Ix9#1! zPDM1OhW>AFy|gduZyOmLI(nk>1Or~&}jLSw+cFn%LjWt=%5WtHH zu<#`!k!J-de+j_?NlOk;>cuSHe>k^S5JSbnWudn1B)Y{%oGz^;GNNSI6bH1BN-Da{ z(XRncBqvIovT6aXGi%;|*x|@?+E~1FdRs3`T%OY`V(E5EkLHB1AZIS8Y%)JZJRmST z&2XC3;XpZqoVhd2Fa$jNyImx<**Gp+(7R|s8MgH4YSR?HJ9|}rgZ#3f+bmF9D!6Q| zcs^8P2SGi4*{x07?V+CD-!obPkg*SH~Wn+nTSg>^raKS=pdtgOFa4k~k1u z+8V-fnj?^7;ov>rvY09h{2o~qrM%_oOex1kI^(*sf3Z|omXtu=@?-Dnb(bBo@8D~Lfr-hO4lFH7#K#Sjg44}JeNOLL(h-UA>-G%+pk&$+w!VI(w9e=T{<48N?59;-R z+T+2~;OMH_%L-er>s=h-O|6_YfgCTw*pbW|(XP^KN33Hn6KO6?b^zA00Cr0PE=(qy z>HjeEBb<0Cr>>`1y9#VCE4&}`4P?+3X5^kKzpThb;m17R$E|Vv8wfg%q5!h4XQ`Da zt;YH%3NnSrgY~9nTcv&X*Ahp-IAP{?%Qb{j=O~0k#1i|8)SEet1mKg1EXy3R9UaIt zT;|Tr6=V#TMZVwhqn0BbZ3mBf&M=y`XSf$U?(=h(CN7RguLg2*7cKc7Cl^LY?6Af( ziFY{eETyHk5^&jw-bG%vFmL@b(@F{E$0RQG9)#rsrnyMTZ!mq)=?p+wOd`h$Sng=k z+jHr1ik#dETxL06VZhSiqE`JcznwKMtLm581(#jZvzOi6XWGY#MsXRP9~TP4+KTtL zYg#vak#^?oHs35ouVQ!#Pb0o0*@jOQH=q4iD((JW<7L{KX8*O^bi;Up1J}WvN zsHiU8g~>5#T@})9_-vbCPTw&;K2`26f8KvenKicPvcm5K4w7myvh*ha+B{XqrWP}i zMVSYf13)6oO4%cl>R_KaTMZ9y9=lkpU#5rat(b;YIsISl%Ls^#fM!Q9^8ix)k8)wG*$K%%eF;f%{sI_0( zS4v3D4>OxUx15+=O3J$1q?n~Eo0GjP>V1A+uiwCYoy28Ab}vk~d?ndBv_o8m3;#aS z#8oQGkNLIUMczrJu$P@6)soUUuFRu@<-)|2`$Dy`X>dJ3OwfqNXQC9#&js(?{E*Q( zjo)GgRkz^Ql>tkizCE=C69aShP?oqXH+xxS>B`O&hX@zsna;sJPNS38I}H8MJYCsM z25)xII&L`DSBMs=&7>B{oT*O&zmG^JGnL^=)7xe69Zqq(CYS8rdb8Ru0ldO3Q{ljAljF$&h*fnMfH~_%Rt9 z@utMbG;V8BH=BElU@tRpM(7bNZQ`}_N{{ECM4 z%PNBRFO*UZ6}qyg^l(|wJRhAwpar?n9JGRBAu{r2^kb$I&qj){SPBUfHsCQ4=C1(D z0gTvG#^_~C`k#naCzvixTo%o3^T6Y>2@-2nZMCTJju@nq*`J3wk4}U1A~8uh7U@S}`%Wy3uJS?xKe!7qzGMUFY1Gc2AObU+sSrU#p#`9@ay zQW!?L@XJ8N-LZ}y1O*e?XtV@4M`9K?2g$8<2hPDO{SEo}fM7=+N?5Osqx=~@UHJc2 z7QZYsV=$#Re=%juE<@jfscRKPv0?IB72{M)IGABdvvqN;(}g~s`j-WFDp*#!vYTX1 z?9a)X7bdtvK}YSHW5%FnZ1()JlFD0N8T_&Zg}GNxziiRGk2S250Q^7$zrn)vJ}QV% zM%-R@&A7>)bJ2j)^}fP-nk0G|^$7%+;Y?DRO-YT3xF6+bFY6cukAc?*5plmt^x0%z z`C>D{OI^{fXrs{@(1u!qip+{`b<>z(ewjG;&d~`rz|sr^IT)=hh{rV0Cvvx7UPGck zS~p7#kLMjeV#A{A$Mopg%PP!|d0vtS^2uEaPYN0)8IiZ#BRQ5(pxNXQSjVPm9wy4g zkY+KG2r7>|E}xafej~={Gzy^szE+mo%dEAUO4Sef;Zt6MAk4!-@+f(GpWgR3(Oy>7 zl`X__sK8~qIvFOe?{}46Q^fmQQ0s=9digO~I)vJSRv0m*48|q{Ek;n4C4PjmwSYB8L0+Q_;DT7Hlk{HB5IuX|CO|S%px6NU1YBa z&a%5@w^%{7i_>OXhR8l$SxSQr~UGzLe`k#g#A96O=cV&PF zD9$cJQWz7X#s=tICW-v8>?M-YEW1g5#C91i7))!x&&7((w&l>mT0iDyc|E>~aM#K2 zMqSsbz}4&fv&Cgb^JDVbL$O-h_gWj^GXB*Bxj80W61c2jAY-!@{ED|#+L_l*_W;KRXMhrfz)z_uSV+zBly$qwPemZSIelr@#G%rcYimcNe zmi~OZ%tki@mlaS~){1hMydK3iJdI{+UO-E1VmfswOI(&)JZ5a8?K^EYxU4t}sWJs- zUtw^WXbhLJVL4EsridH2HSJ}K`nW9WsIfi~ilFE+n5B}V;ur`7W|4HpFYs$=+4?aN zc{cQP$3K&MQs&vjD%pW|(U~XaFgTAyoDF-O&h`$0W=Eu1E7k5XZZDJ8oiS7P8y4xx zVypH%=aE>yM_4)>>VgGv(M9Z6bkl+dun6^KbBAFl(6Fi_| zfCXwYgBk6ZQu0g`_hY(Y7(^N#H;T&|^>CTxUDDE>l4B%VGxo zmFLTY=fe9pcCgX-&F>VdMK)&8m0eiT(UpaNmp2vQtqDqD&{cLY zBM9t(N;6X4|FT#ay0W98JIH^M+a5~x*#z$&QkMEw`&Pssb_?0o=<>?tN9i#j=;d%evLPhcZqjIoA zZ}_>(YE6}@EBl`MlY|*Ii_tD7OwkFB4h->}EHEp^+363nVersO*p~zE{}z9bs~mX$ z%8SR|&64-O%HOlB#rqHPy0V+fnD<{QCXBG2y-Z=%GEu)Q8$V{D^p7&~%R)%MYK2MY z`v0@{HLy`tY5$k96}vzeCAbomudPY9-d0JGhR#jfaXxPEJ*RI>j4^4N|8vg0 z^KtInx%b@p>I{06c6#T|+^=(<^PJ!Fdwvf}c|lpS(g1<|i8iA`Yt6wsVwn|T!db>K zL1;&wk1wHRNhnuMpcf+-R*+z%>xV2 zaJgG1;&eST>&mjH|9z`lUINX?FJqoml=Yrw ziT8i7*nU~YdzE(mui@e^By?X(bI>G2_5P{q{{R}$`To-EAr)C4H!FVGuqyz_mI!OZ zga@U1jrU8Vv2dJ${+%M6%0VnIX~M2!M*AIef|tbvVJ`QQjAGI14GG8go`@YXAk)W6 z;88j9?$>*?Wqb6d^vhV$Swr3O@0qTw)-K_;5I8%4*-Kj55yB$~sc$_i2y;62ZhP^K z4X(PzIqU0IELl^>RNE$?m=qw{O9U??!v9q7pY~5h`>MDT72cxUg1>Y_h5=WrpH;uC zpjo+Q006oJvwoR}<9j&sFnMakHoiIH-FvwYN7aLD#P&7Sc&<6pp(^5 zUHb391KQbMraTl&UD+$_mS>oK{!tdXvh(8o;j}u5KkYyHU4Ps0zxw`q<@i7PzdL@a z?Re|)R%m}bemVZK)z#X%`?v7>)!p#pw;O)6@yU&?k8gb3^{Q**{jHVwcOOkH7tC5E z{rGX;Ur)BRw*903)JKCUhUttLCta)4RJvF^t~Z{emmo%K z@}MhQQ|SKaD>lFEyUHXTOtjRD<>87P3GEpiJtUXkP z1StyZ&2?#yJfCq)4V^o&6?eXWkNPMgBjNy#dO8Vmmr!Ao@*WkDvVqMUE=-5LZ)5xb zM1+??3>72JftLFO{r{LQ|EHIR=AqsSIfa|ySKIZd_CK{JAFMq-*KPMHv<2B zo$#-x&DW;Ag4Z4N*IwUeKHrBYeJ8G581P+y&Aw(5$9(kUjo?7=vl}Y>7X)hrsM!~S zFh32JrrJJCh($WRcmgc6lzl+QJl3kqXDns|37~M4TT%9<6i!4a; zVh@=1h+z_lIU)>Sn!}NCaGs1auzV3Zd#Lq?Xh(B1ep3Oge4m};1)`tS+aC?~L4;h9 zj*hmDo)(wh8bMv;VVCQzUO3aJ^x;6?CruSN?1{MF!!hqMthgFo ziPm(;)l|2&SeE$SDhfF zEO`If;ALOj1)UOZdMXq6U_2}7i`OJ96AAJkkupbAhe=@ZPP54|N`Dacym^a~*oUuI}F2Kh$k( z*?y>FZ|9z#!&_f$0xznm+1K&nA>W@m_YzR#1At8cP3bv#;=>a+2GHn-Ae%Q39MB5s zq`?)#kYYP5g#zId12+cxMuSoxAwx2qvV^k(EKiLs24LWq`M!^S*?;h+khI0DdoN{e z5td?7LhYaY5Gex`43|cZ)u4YuG}}|Rytb~FY;&VHWA<3xM((O!>=k}dfcC6jPFB{8ar8@_B+4*AoWtrYjci4{L;&)h-_(iaO z8WRYTa!f>5R?El~bw$RqYOyT*vhAQK|1Riw)_D?}t_p(wlwMTa_$rjfR6Gu%fOKjZ zQ|1l@NbQk&z{}1v4_$UPpS@)NG=JvDp`U^(KFul_dU!kT@R1(4g8{AzAgvrqoi0-X z-}xvTMcTVhV`ctJSXq`?<3kFSaCfwNldZ#K(8(wZ-oF#S%y+_mpDXxJVafDKuS@M@ zq;rK+H;_)H(#55u^pRw8YQt#N67j;34j(aW*dx*afJ0J7{jB$Eq%lX>-oM<=v9s1OWTDbdLzrCj z?kZw$t3N`J6 zw$PQGt}bg`*=bYeebmqJ{@e4%`yXR?|IQ@u`7phE4(b9b(kE)F^d-MsIs}t zP+A|WNIvRx!C-AZe?j7?Io|YZ20!Kx{*6Yfg0ap|t6-rec_S>98X*Nq;*=y{dEHcqn z4x>%p!m*Ral#8@;Sdc6D&$9QtHC{$lVkP~dqZBJfO36X<(=wT~3=`>?VlYGsWx~5| zAZbWl>-|_EeD(`(@m->&ep$gSb!S1p-83+hVCQSL-)}OaC0@MDs&09S$1!=B)#aCu z={ECJ;xVE;^2;9K-?eDG|M@n4S-O5%7cP2-m9(Bm^<*WGlhqW1qyVBqT^jG78_zAJ zz>$L>`Bmy=?RgX9jgTX}y&ER~cRG8Zeds$N2y5GV2S`i=hmQp?VZER&idR#q%w#RY z+dH9)pL%-}z+dZD!b0}81@lk1MY>Pg7+O(AmO64`D z-6JbcO||z8OS6qwz4;z{V?0HSVCAVH9-ibU+C$pSAs9Bkbs<`^%7kW^@XHe2CuCS% zfelj$4MXvcA}N3eqyeN#ltKF+h-w~OT)TeGipCA@O|aqI`dhKG{RrPQ#6Fd=BKu{t zz%MhbfC6!Y6}#7iWA%7Q1d(6=QCEsb&Z{fS*2nxIAF~L}z%LuOs>75|UD>t#yB3XK zwlb6ZmGSzEkC*9!{{gHmD^(QVL^!iZ(pdlWSD7^@y#M6XH+Cm5nLtszeskPqOYqC! zzElF4pK#AUh|dMKoNT)!CWpL#d%tXCPv<~K=LsBX7L!X_rQ02yyNvp#|Uu+`kKPWi5?AILjh$6v|6 z^F)z#Wi!?-Pv@7tU36X9Gij{28PJg(6em@6nwG)_MaJoJjQcyOTkcD40rrv%JeXbk z<6D*+n2QZSwg~^$v>dO=i+y&y9A|aQ_wil-GdSwT?f6^a86%~$aCOTs=_E34U0KRF z+f1oGoAV{!TDtvFwz`jDb_>fdYbytSnQG53`$iBd^expnoLanYxjLn4lr`C8FHxN7 zp9Ti#ph)^75j+Mfrp^G->?w^dJ6SW&RSjjfFP(z1zb|)w*@By}Zh4CO>&2h%Zk_kr zUCTvMHy(tmr{o{u4QHYY@ZgH6us@UbZpw>R3x3(m&04p-l#=Bv^D%M3_+|J`{#}d4 zFSEnT(seQnrP_)F@Frz2Bpt!f05Yg4Cj}EdtjrY5oK!gK;eayZ?O$Z+-_DCW*>P8p zGrWwCWujE!p=v10{BdsphwJz*I8RuW(-FO$iB09&N;r;biI=hYn8;h`XH|g46OZ3x zFpQQqiNM{*JN&V220lW1J|^vRBBJ_bq(qvku`!T0AdLb!mc%i2E(QQ;9&Km5MZ(8o zUQu?x$*V-dK9!qFC&N6F7){=JolOUcnX((g>>(*8e6Y1WQt6ep61J^nC|^-p@O~j2b#YdT||8bta>2NH*iy6^LKvXo-jtcV3>; zBsxCc4WD1}8AetK>tu{LSQoIJ=96+5ZHUKI#V<3Kd1siT)yB0j{d@2^NvYf(X!N-< z`DJ=13Z-@^jrK{Zlm~IIiXyViWh{6FG!rL9rmddoA*Bp zep!n5l=RCKH{7*QKyDB|XphXe_01}0&t8;HR?7pGHPAk^Lw`&eDTul zj@KRZKX%qC3%!4?C8TyGsIk_fhb+Wr{lgv{UWT9b$G{cZlsfM-ewn2Aw2-!rq&6x@ zUQqZSa>xTxP^HC7057A)jFdDPrkT`BHh5K7oGe2T|8-t7%Z{T7c0?^J^!@E9ZIP4_*#3MOo~Qcv(Q-yJb`Y`z4j{CLXq;pCSY>XujIa&Hd&vRQ&QWP@ME z&N~LYERW~t051z+e{t?bm5uwEj+c$GcVuPpo*P|gN+fSklr+6;todeGt2U$5trkU;gc79bv>Giww0FLgx2D# zz1;xi9e%S>FeU+WHZaTex*=jky5W9%)6|Tao{PNPbz%OIJT1myr zXo6B$Umi%Xh@@jqBIV;i??0$gSy`=vKHN7R_aiCMGbsMz_K z1&wBh=9nxGQNvwHK&8di)Y9bIAQ4FHQJ6txPjjrD%=M4p*M_&)_X4YY%$q^)zua_X zS>FHTyn^xmHk0>%uYqE~_ffwf)lNZK z-j63{R)X@c{16!y-&9R)CVXx6iJL-K_L3Fve|K5%{;TtIe6>0{j~MfBD!&s>fdVbD zp*74t^JZu|5_zfF)d?+oO0!VY;u&JRXs*)9LC}@$2c2V)>SgQ6CjFOpxgIAU--l`a8^z-9o1~df_f2gCako{1h*UiEBPgr8ABpg71 ze~AG_$|;^%8vHW5IHp6q?A>0jj^{lqK^&9Bjg-x3YeDfciN(ttjA+`Kw8B!o@7f{Q zK<QZSV%I?yM&^;=W%%>m z5Bp-apcG8AS^If7#&LyUjJ{ zW$nw3fl%>CFW;%N(N30MR(R@qA$2l9hpaMv>yRL%bi@z#cJ}J#Kjw;WhfzCR=?N$F z=y>^MWm>m9bKfm}zf85_ml^Ug!+G?}mh$iVd9m(ARVMc9cUmfE@kDGN!6QIc5%B@B}^K!cTt z@cs!GgOtid^aa^T!UyP5Gq@%gr>D`{<~+?(@4vp#H~3HizZ?8A(r%x#X#H(-ZoB<9 zVe$GEbAJX~5|=Emn!C4U`CNb2*361u_Cr2qE-oSOGq&{0ST&1$^8WAO-?eC2TMyW{ zpC;g^GA-erK=D@Jj!|fRDh+b=Duv)>+cA0!67_KN*{bbiCVY!z?U#vP z=0I20z%ScV7Q>CNACEB@j9FWV4|pNw67CbO`(-a-Bp(T^O8tzoLSGE1dLIhuYfBtY zP*RDpf;1*S!OIB0Oj4=REO|RP77TvYhp3_T;%hbdz-@J5R};^aY1E zdTr$2dF+`Y-4Q+RK9P}Mb}H@E2HCj3pA?M+6Yve5u9=FSDkQ%wzD11J02a^qPh%?0 zI0Kxs@~d0^1phf6&-Ng;y0Yzd-_!2!KCa;1S^a1Gcdh#~>~lQ-oTISgucUo_TKF;7 z&d=bBP%K`328d?3ZQ_ZxDK{alTs*UDusn2SE%{}a%b#D?&b2f6W!2XEEWl$cclzAV5U$#?tBK^%MkpYhD%4%18(LWUi6m90D z{?Jdip5m-q?#rZDOJ4j?x4iJpfR~N4`1UOX5hKz~(I>G}zgH7F8EAfViIWzoI-y(??@$S#gKY9~166fZmC z103G{)IHC2k?9< zCrjg)0Fwoghv;Mk^(ZB=YXmhLdboFBZBGLrKX@+gnvY*6y$11wA!j#^Srtf#>qu;RYYIa}HmBM1l ze3v$2*$4gbSTA#Ek_yAVfUfMQgy99LTB0$~R9YjTp7tEHSZtY(5A=`~#Y-HAHt_x>3#YBz{4#U> zvauAse__e7JJ(kp=%aO1l*RxatAe7MN)_gGPuVzT_@>jzDB+Q*j}|Aq|2*PW-1(Sf zJU#0v$}NfGWtmJ-%v$e1a+kL0JY^TSO?J6XXxgfBdb`k;5rO`FgoVuABfKm3Y zUgki*%&`8tR1Skp;q%MXXV>O-oK+HIw}=-OqJ(~=vnpXdsY22cMgfAC(OPmev5CAX zYC?>NtaoAiT~*b$;se{@3%K-}*=}mU%L?w79W1D+G?fobQ5ge~ZotAKXNq zf%gwfn$J%bz?r6%FH`0>tso|NVL^#xn9~KOE-zbV?GHP+cl{vSW7zpOwy|F;3^dXQ zl}?40R?OQ5!yw#ZO2_{gJotgo*n=U zer>(uZm3^L{2lPiwsAn@>_{Es1d8(23W}FuyZV?Z*AMwrW6Cl-^xl@LG>-~#*2nyT z_g~BxDt%FHr7L?s%lprxuB?lHXIW@3D(^q)&#+HAk$>zI!*%>Sa81YX)QVka!b0U# zmr#+`=`}2Bmtmb1v0HTSSEbTkLK~8W7c}4KI?tD zpWN_dyY-lPBJ(+Z3+Wy(X57*Cx6f#V_it)=PEAYFcze3~Yy6b?K3@yJ&pQ` zz{mT)=*N%aUGS@mY}o}&@L%AK#+^%;_kY>yK1Qv0|Nm1KynoIPCFh#EbjhDQM^%>z zSIOKXYE}$hd`fbazEjVDl^^UUR;-_<1e~TOZxWIO+%v?AsWtz1@^?TInF@ol>HoDm z)Rn!+?o(6Ny#MJ1rb!y2nffc}b?+4B;W2d{OmCYFpQ_>^KN^w|lxCwa`1!05(kaMa(|`{9)j z-|soz)3JBko{q!YUOaSYPfKH+%eA3)wQI?}jcaPxG&bH_H+S*vw^b}!1*uFA2g*ak zEV4x8-}$|4;XoU_?E3K@pAA4@f#FB|AJe7ydswN)?xQrC!F-!VWLW|rp#Eca8J~P` z%Y|F=e#4!sxM*iDd$@KUs+Z@0HCZE_C4bF_!kC-WL#HLoFT0R6UREA;%Q<6Fa;_!} zZ57b~`I6qh=)f4|mjwYz4U!xsQjm$tnn?=imyJq1EIPVuEV_~g1JtEvgG@%fb-)E_sPt;if_Q6U+au22{b`4a8$q0WwjF0Iwo-n)2CtuS{H zQ4yR|TXEZlM(vFzSJR;$$hheQ2aSH}WYBj)8t6keNO0f=iWB}JV^gUwi-Dppb}|86 z%l0sxxt^zG-Eu0z`HtsJ63hCjmOk(w?#nuc>M!9cWfar=4JkM}(s|;-iO%D`3%+i6 z{CN*dXYCX5QFDeChAV-py_r%lm0yL)RCq3JK$UKXwA3$SlQogIh%<7&8n0iLbH9VK z=8c37)v-oW+6k>Koa7oJO(7c?W}vx<`bg|jAulDu*HE^BVWUf#bu{xFJU3tmz<7$) zHRG7%u%8ZDIc)`Kvk=FO`(-c%NJ+m;_Cv1HSYSvRf~Qa)WvCTd>it*aa&Kkem$4MW zFmunO!IhwETd%O=g4TG6Vc5gkR=Z zty%AZoJt`>uFxMqtv!Ix!kLGkJ}2S2+FQ%WFSFFih*;reWx@OBCBDaU?ROCv4MZ?V z!Y@PDIp>!MUPjB6NL18E)6O8UnevuO6ER6ggN&x27%w%4@6jxs!y~i#m=jrDe)g@f zS-IwZnLbV-OaisBQXoMn4k(4O{3}p)R(s7bwe;q*!prU{f4{86b!7+fWEHD6$qLr7 z{Ic+=+0d1p6!LM{Z^#SRr|EUuh4#dj-|E$rGxE#!o0L>fRDdQtpa)amRPPs|fcP2p zul=81>HlZ{KSja4iLFNn~QCR0=r&!{s%&=`bcfn4JtRsR%cw36ne zJn%#15%(82oY9y%gfiC(_iYfQNi*#pEfBv9Z)~&s9t(cicm5goR5vNljlaV`pVwy*8vr~S|kPOH!#`lrOVfiweEpAFxvRd)uztOWRFdcA2r zmFKRDm;R1t#x!EjMM2n)m*4L)?p(rk%cEBJQD(QWcjO*Q4P`7+sN?r9|WApD&Awq~Kxd6dPE2V(W;ZhY1TcPbmaY@{Ud zGPJDZ;+W`p^7)+vC=E9RlzZ>dEODZ^FQ$}>Anok~y`v-_6KMs@Nf}I}7i!wVL&!6 zJ2AS%%-E6zWnKcm%>8kSU&h=Sv|gM|zf6LhqlqZh4MzOf)ZPCRI0@dk3O45lO2_uGuB(q)9-+=p_=fMEIXp z{gnnlLSvN1FSB!^EbC+5jJ*E|zXd8FIa_5~>X+Tjy#G=Wm@?pHEWgZ%m*vqfd%?lJ z=kt(_MomL6Q_zME+=jY)()_YaGfz6djG>}M=CiY>6R7I2W;}d$H1U+TTdhw-Z$-W=w@dxO zKq&xK(>T+t*p`$IeVyqNX~gWhL0kXTebu!|v78(uGz?0X>unWjmON|oN$#4+IG|Ye> zm(E4}d)rz{c!&Bs6K?GC^`iOm-P&6<#qrB<_)&a*?{l~#yyG2@;#TG(`p{|RINeZb zc}pVJ7L@>#k)IF%0D;*cQO!o^=>+Rvba3R^)ybFz-v5MSzf9)z%f>u6n_pJqynlEx z&q7z$$ot=)zr$|e-?<@o-hWv5jUX(57u|`sx^`B!QW|79vGecro!hx}Wm9@So$W^hH<2gIpIBCwLC3leixe2~>^lk58-cmZ*{h07BDN z1fSdtY}Bggyj__o$Cnedf9Tx{p_^bY;IO9bMT4kaYnl$_x~qxagjGkapjl zn(=7o`|jvquBX;DGa)RPtejf@BdoToyWyeJubfsj-oFT@N+elO{nP!EkPbz(uqoYN zP3o9#Hs-xZEOdEsc%3gg$_Uz)z4O5$aEGQncza4yzMHYwV@BIo)-Zg|;<_#SUyiBvG5t4JdF zL-8^~$RM@mG+7`@2ZBXtnehJA>$JG&%b;T!^|~RB8LJPud2p74M3TW%v{kG_*^$_v zn2YpS#9_|_IOk4)lGC}Ws+cc@$FmGtJy`Wf7aqXXB1OtkgpfJ4gHf>sz=#`3d%fRSTn0 zCVKyAkA~$pB2S6>Wg(KsMG_I^Ii9=g@v2)0-Cx(Dswt9Rc6EpGHYT_qL~{`mli-(1 zdH(@eT_VW*r7jyH%T6$8D&_s7EKC@?AT2iUe-`4H1SB}$ILGDZMg=nO^AhvdgxCJ) zKlo+&ZI=A9TJ}wE{to*Fzvs9c*_Au8o5RtK z=lcQgDaK#x|V)8-CT|aA|Kz9|MMow`qOvoX7r?aa_qW zY;n=*k<#stmUYXoSs^o}!}}j6ei>nd$EsJmtMSv+Bz{1h?U>8D(c)4nKZ3Ylbs2lrynSk6{Ljp z0{yN3N?ec~zYOo6n95uT{-UtIJo#l|_8vV`lKe7xUbG!Y+b@EOtGuA=R5jt3$xnbr z=pU0jNqc@-j;Hoy`Z>l2?<91o{+WKz!tMu~HLac&|C#TwU3=fc z5yu3Hy+4Ov<~_z0>p12jtDM_X#>*mBL9tT7%fh!R^YPgL<(E~T^;Z*&NUp}OD;1cZ zUzTg6`3tYvSL$e)s+TM$=olC+Kh4A>U>c-hN&!&&L8=sOX>^f-WX=II1Ha7bkrklL zf__<;$;VW3;+J)peDlqOmpO~Hm6~6M8w=)_H9GOj@?yTB7>uDq#ROJIUFZF0jAPpH z%R-OhtOvi!yQ8S#{z)wiYRCxBAAu%2A<7a>SuyUr5$CWhWHR6+-xGOvPRxsnBrntE zj_4yiAN(L^@3Gy9TXvt6gHxAsYs3QhWn&J!Lxl{Spgt}}x$D)U9_)$9kM!*6=;=7z zK`Mj74_{{|`O)U$r1l>wr z162XSWWkMNk8*tQdUA?DC$v`sSUL1E?r!G0NxbtJZAT0{Q|O4p`IOTBEP$?T#K9U7 zvKJ)Pqjmq0&Fr2XpKNO(<<<2n>#n-S+9ub*LmTdJ&24!A@Ukx#*J*FG)HXG5>*?t1 z0M87{w|Dq@gaVY8%2ylV>PBWBKq=|UUNH9RE1k}4lbkEJ*JLd_isQPnSX0NQ^4Nq? zswHNMWH{4|O|3vvym*Nt^)jPhGL(-Ml7m)Qyev79!Oe-ev>Oy5iFDrOc*(Ga)#mj1K@S^Nn3-_LH zKbj|3dQlop?ej`zHMiU5GSl(Gab}DB0DC}3B!(_7@Ica61(IIcMupb_fcb+YA2Uev zF;OseF8F-ICow>w&Php-j+QaXD7ay$M~ z`WKYHqS43$U$xxccGw9BqCYEUSiyxMnqD4FYXR#!oCKyo}ZRkFuR$87}wc#4nqrXww~R z#Dc{rOMqV{=PlM@5{6}an4M0BNgUH}n1`4d%@J6>N)Y&PdZdf_1gQ|CMC+B%O6HJZ zjwwY0iq1*#(wSxBmkr;_KLCzERIG`F#$25r^z2QfkQ}tVfeF8CEj%13)HgOivRon$ z(aWiE>M%C_mZce#xJUnc`M=*|B9BQ*`uG7!n-veRwbf$*i%3EUyTjPa?cbD*Uly_I z6QvW!1ks~s{aw=MVu-LJ>p)j_so0|TwQ3MGiyJQ)9_?4Ci_7i z16J5Ik3y#Eqo`>?$K*g^|bYj*Imch=_VkS03*?C{*3(SOTy z{VZN)RADTPUzXB|h!7)zGGP9M;)Mew0U)SX!<3NSlBl#=>{bU?KY~*#vxDjP!(@W5 z`ISG|jjhB3+9Z3)a~`X^`Y{eK3V`#F;v>AUTv8vt9iwiNUu$4K*Q9-?62Rv+_`&6i z*_k&rLx(`NSs#VN%MeQQtH|`1#3vA$S})*m-4@(P2$;$$25X2}-EtXwE%pA()i1Nu z`!Ah~3RmGeZ+Ky|Hm_EnCos{F6rb70<^-@N6WHa(kv(g{C;ObBEC+F{b8+%Zx^tVa zQtt+$Lp-FrWpR2ep_K(;JP-7##0x`Iei0JP>G~5uTC}@)Ae&i}g~WYLIpE3szq%W5pVr+ngNukr7CE>D9fmga96@=+RX+|P6l zt6|G$oW0(xH3)MoeK5n{TGUd*GzJib$+U<7%>+o!wy2(!a4gk!Zb#Pn$Pt(r!3@4o zjZu@$btdvLACcWehjHTF#*joj6fYCk3sVahIdN5t7+fL~YZvn(FH8aT{``-jWy&y0S4Vyew9_{n0@_X35qq58WDj z--{dSaTxHjh#Q{xLbNJ@xHJ&U-&HAM`BBm@4`JjFkxJGF8Mo#694$x4bPI$pY40aB zO0*>;xL$t3_D3YIT+23(uMKv)#KbDWL9@)qEV!<0N0IO{>X${RJO;VK?T-Ai%hw^jSXu2%!Pp}#9-_OnapEza3b$rIjIesO~ zb8tZ_<^2QQUnDQ6oGeuQ1-d^J|D~Mr!T8SQ!u#LQE@pX-(din<1W;>${VLD1-uY5e z_OWILM1jXHSA7FQpi@wKdLm`#T|jpKF-a1r4o}wD>B@fB{+)lyH}z52MD}tYn`7fn zywxxd@*IA_e~J0$f{$^3)5UhkI|vV||D7C@YfB3&G>XuKGZh!2zx{sI2 zgZCe<2w(P-#|M7d)WrQC`61D%Qs1YVR5HiWc@0%7FN(xaZJtqoR5>Nze|i@vl(uJ- z(sue{!g!98(328k(t2viB;0NBbpNC}3FXQ~tvESJ2@sQl$Le5SdH?R4hxb3}Cdn0V z?{3|=@wjhg(k$h~`)@ZEuRGqvpd-pY_%DJlsOQXb#tPVQ8>Jez1lz6;AJtd zJ%W}Qjk84%x$mx~$Or}G2tSqx{!lsDpct=@Dblr*9vrKeq_WVJy*@vCyzCL53ur4O z1podPzNpGt{3xO3j!E}~=mOp&rDPq*jUF6XBLSN8S@?B7wplC6ewly(W3?v7^JQ4V z$H-|8KmU@ZuxSrx7J^@vzDYE+Z8-8`uUuHDZ6a8>thy6Cj;iBJ5`7l zoV&MnN!^CpDrd81#(h|YbZ2##%3!u}>X#|SKSefzVJM6*Y`(-9>CHu`r zep%f7syLIwX07Pv?7TVIdsHk|w_1`W?+*@|qH3iwLCB1Z3z6)hWzyB-@(?h~UhOS} zD(mXNlF+U@yqU`{+m5e-^F^Xn5jyA&+~!RU^nu%?*7rdV2rXitiiv(%%o`(JW$X=; zX~W1bi<_)rZR$UgP|mkunB`m_6LAEXv=&U;(!E`Vq}ABe7g);i1y) zjyEjV5LOYh(&7DwFD;C^@fhT^z;ioFe6eNtp2W;f>HqjM<`MsMp0=fBRrMqCb;Q$0G%{ol*Y-Bgg zs6zo9-qJ^AS`T<-TN5+;Fj%vZ|IB$BkG@w$ouwH3gqixNUI3f+SgkbO-evgu>s5H~ z8{p2kRYw*jl;NR^Sm#s@fY6UhSpLW#2-4~$TE~>cba`b*jqRs5mEOM@YQNXD;o(#h zigLosc343M_msb1X2UO=p8bI93TB(Uph*0(UHm(%`Qn$Ivf-EQGVse}dtKT6Rx$O5 zoGCDhw)>=VEGUUg9n>fqgW{klPea{ut@JMtGCnmWzm#&^|A}nRaRT^dm!>YaRwd|A zNnV!VH`kTbRWm_qc;=&ujcMOp1NYGl_0ac4r@GnN-e&x=X*cZt5&m2Hshv!2AzYc7 z_*+reZgJ)$ymNk2=)i#s5;cit>D(U6bnjz7L3 zQmwF$e7KG&u9c}>%m4ijiCnt@Fxwrjx{6~G|mBnyl z_$q#UPFRA`!2q!LIeq!L+K z+)IEnNG4Zkh9*LK9pKbS5}6~q9M*Tt4))G-D+0gl*EljCceyr)UF!oH9qGb)FLV80 zZo_)LIWkJGz^e;BKd5l~ZEfxrE4-{+rW6aj%sxsm+l{UF9I0XcthIA&vTm~w$BcN= zHks;|>FyUwdsOLusb%aD6~HgkqHl=0Wx)2wl=)B2QzbgHqBN@UV^PAIvB?J|Of*AT zQa+$Q99SKh&Mta?S&_KRwGm5!xriUC$knHDK`5;SzT?tM>EpG=^xOj(?kr2lNyafl z0Z{3_K;sYhQ4d=!9lwlGG$WUF1Bur#YT1Eh$evdowp*(>Ifv5ij}H7Y!#q`L$qeTj zYu;`2XT1tqEunS9jrj`+?#KM9Q0>gBrT!t3@MTzEH^R!1iel69m;m%Z3%~GdpjXlb zGLXi>NcG87=hw~JlVaD$EP}4=qQK`>1m6hZm`C@sQ(zSk0>T%LxpC9(Es&c7vq0>= z#$Vwzb>0}1Pq6i{JXU_$&9C<_&i*N~`IvIC@G=K}nVhFVWXmr*%JxDjX7Hrb_1kp3 zj2e#-8?VpSg4xb+IVk=PiSVa$|)3k zRHu)t$c|6kR{l-ItGJQJc#GmFDKZ(Iv0rAGzoQeXI}pG_rfo;ysYb1KF-G_b|pRXuR79}wusledfkKNrM|7i zj&#!O+sdD2@0TSWIx$cZ(fcQy*ikJt6Zc6s058*YWs{aSUL3$Npkctvq~iKz1;xt{ z^}-t5Lsj@lCjn^dp{!iccOn%A)w1R8hV@^MvW)xz$sf&_WJP`cD|_#Jht5b81H%^uj#hWwO`CbJF9O2Ns%uGUkq5N*q)A5&$=Lj&!%z!H;`GLgu-QX(gzYN_S)=9Pm?hLn9AGlE-$z=lKhSlQzTT*sqmSV+2o>s&!*MH&7=@Cm;C4E67(K27OY8;7UihZL* z`5(Z3NtI~!l2#EQTkFNn8V0ik$;zLDHK zu?+Z_a`wFc8Q>%T1h>vy`se*q6N9_pYQI@9r7kBbuHUvZB9}rHo5*nr*MKl;J9{G4 zz-xUKUO#cf-|c;;x-ZQTAlMK=1u>J0PUE>(bA9*!Zq{CGo{A1aq5w!RPr5;R+_|o-m|{hfZ-OYc&if}e%dd4YF)oU& z=5}jXPW#wR#rvnquK%^XrWJD4$PKNT*>DCfacZYKIWWoKtt9t%uB@63@4v*bdzN2jsE=94u6^=|{yNC~R~F>wkhb+PHU9UIAY=%s z9k|=D;km1V#=dkJa} z5dt4wBL-nH9|#^51fkOht%LmRdGXNeUI>1#>;MkrwE!L=@AwXNke}M?+Mb@{9fvzR z_IB(!bQnH6XT{=s8(ocSYHM9}>k}C_=R7uLm{Qr(&RbU;ag)6%8f&3A0WssSbK^RI z@_g^G!v<~erkXN27Yx0G@iNIl9J5q)GU9kyO-CADcAc;G^gH^{@KOTjeK(p3^XN?{ zM^9JY3rk5YWg@kRM-`~*3l^(S4H9cc>>5gRO*L8R*I}Do{jwtP%Qg>roAG}rKwE!> zTp|;2A?%+nTJ|@L-z9Oc*xZJ8T-lpCjq~DVtmV_=d*5x zd`v4|XP1y4!4wmI8Ea8L)(>jvS=>ftv{5y zo6;<1v1m%Wd2|f|Qj0-}7QqD3GGd{E$g2sP!Qyh1y6E? zGU)vuwR$``H3$4Mh#lqSkevLov*3O$USI24UFQNX>|WQ4Eilct_3Z6wSVggtKaKcK zoa~hb(21)sOYgWbAbsK;mDCf|qpQh&@Y}2QruthFg~f*#)t*hDt7e8CLHZ@r{4theuqmKh%jiI4sOr?OL*A@e-G-vCc&r_+?9ozYUME zr*p5**9~}C1fw0J#9bN)#&5Cmt6_}1;5784E%#RmRR$MES$H0(SX+q}ZTjzHEJoIr(J=$Z3X8boMJBG4@POAqtNU46=MS~Kq zf%orB=Db|}vNF+?P2go|{Iakh@U5}Y##|oJ`yB^YZ)@Auo4T5mDDPj#YBdRLuvt)! z34I9pnZ#GqE1DZI45w5xOT4VS^D#AgKisB2(cUQBI!@vMXH&DkA?vbT5t{!3tE)Ew zAq&mJkv}W9;$Qpz1rAz6yEDAZSskWw@XJb{U$%+mmsMNv%krr!yOVooU~LJ7s$2e$ z3BPPo5X|{y|J(Hw!xzGti4!w&MFkY17Ea;ILPZX`vUmf}&eM98a;9y6i~D-O}B&kDG)~}$71=eXLcFNBU6S~ z8o%rtBfkuOwZhjub(wtgJ|mY+Xg8kYE+COTwO|TQm`JSpm@SvvnbSWGw2d~km2k(z zhJ1;@nmp@Q^%wrhiu;p$U7ArRtw|c>K7y`plsW62exs^xoX=7LHRDyG-Jomw{nM5G zro{MVZMfP8Ldl7`;e^e#6R3`y-@Q49Q@h-{|K#P?eNZ*sj9&)*kM@yC5j10`#WVgv zvgHh=mBEW?F*o^j1HVi(2uGK7-Et$tOZ^?Z7z0?~BbbuhQ}7f1hok`4AMwte{uy;p zqwqbBmkU3}a(mYqJARp)*)rDtJ*Zn=Vu8$ut>T!4!^^t3_axqr26xnLAU~hZBVP8H z+0}O4W&ZhzMTRvdY7p**h1hs|%q@Eq&|6&pRxV(9Y=!+ksniRSuB1|0nKVjD%qdt5 zQtcn4vCFgtrpZZ=sM)a+TfqcT)~m1x4vYXsb_hbY5vda+@|4cKtURCIQLZv*7fB{W z^)Zut-*H$jo`;Xe+S7EO(sMM!@bRLzXR&Bvtptj(Kx16h#PsK`}DviJeq2^lqH5ZX5vp0kj2%$-< z;oeh)xZ=NV1eK8!y`#av$jJPxP3=!5>+Yvp)bUJH%MqiAiZ*&-AqGLF$0GEK_T)DB zyBun#6M9B42rdnxI%Z__sX$cM^%!+^gA9JzYjyq->xea3$1#;fg7?c8w%~2zAw2FU zdH5gSWj^DdOTP4LK{$8V>^TuaJL&A}d7`akXL7hdr@wU~LyS=Ky~1;ZThD%Wgl>y5 zI)ahyZ{;zLi9>=PNne1Lt^CWBIHr`@`PYLSNA7jQ1jB}aB2^jUnAdA)m-jj7S0&8* z$K@8s+?#3T4>}n=#<(3sxj6mj^Lclj!&*p^x@0t@IZCXUD2V}($B+~xp~M1Il5$9s zyNTnN=A4hSesVjXom0C6=o4ck%V^Q!MT_SC>^5PsAXEsemlFbX?V8oKKdW0V+`d}4 z4gQ{!N|3Iot)0_2cW&M44U1UUYmDtI)ulZ;IeLt9zf3IlRW#3zU)IGx-i`=N_DogQ z#~i-XxaDoXiABv=Tq#{c6H*Dr2qr9RnPgFE zK*@ZTTm#jTZZ#5qOWhuEEo!GvG?v=0jcjS2d`$UI{`Wf{GxN(N0?0peI7NiE60A&l`VQR#4%YkYBg&{^SH|Ba?lG| zPi$rO2R&4=ePG)nGlwnRFhdUsSx$AC-!lNPDY~-6MI&z>6wPM= zTimInx}&8>&Hm{z;z6^Fml^%C_H>;L&KfFT_U7o_9`<$o$>^79{VPa+YFgMp!+<^$ z7$vy>0I_JK27s2xgeA_tWapQ$J^E(Q$w)KoupkOok?|-)O@^Jfa(oeIM6z7tn3;7l z%z6LQC95kNtzzDMo8`IZQCIeD2fDJX`fF9zhn;Ll)3FSva`V5|*~sk~z9+ojxJBNN z$ACeNH-bWDS3Geb@wum*oa5v?o}JZ{Epc+ccv=Nstte`&-a-8>QGfAN8XxoY#=+U* zCtJP9N>}z%{GhIonsSdS#7v)xCbqQBYZa&DU$nZXS3F)dg`ae-c)XqCplY?Fb3AUf z&+({#$_Jw=zU8Cer)1cSrKL95r#~#{67T2c-WuewP{@|?V2IqesVtSj4E$Y=eXDf9j!q~v@=NcofQE)joI&5=ar<~!_H-vi!1DlzPS z35%Dpc))Ayo1Xj~_HzgOR_6yVL(ivI-+1>i6TB?bWu_~?!m@K5C{1Wt#Dg}biLyDu z%bxW*S;uP}3?f^mRWPRs00;$11ryNC&{w16f0L6SQU?e%ml!}%!>+WqbB4o~8BrJX z+@CYM8o70d|K}X)rcs&J)KximDG7 zgrIe>Ev?%ENP%A4VzJ0XI+8A$(5>0gn22M_l#xe=4&t>F<*F+ivBJw{iTB@}>8t@P z>jdyf$_AZ&Cub6BdOSED$5cs)Ok%r;4TA#aBF$b3#`S-2GCLrKn){*F^UO)dE#XmTN%VL*%FwtrC;XF-(elZF%2_8*8H-o>ExU9cbLrDp-jCs z{raI}hsD?};8WGTQIB(qV}7}mZ@Qr5ew>n)Nyry8foTA-DvT)8Afm!lb4r2tFIm`{ zqZ_#%D)Ee&_MC;W31#Y3xmiSKep&pYW0e2=S;{*t$tvNjU&a&1Jct)|1zlzy|3bs` zNG8LOFvt9Bf{D{}xrrznj{4b163Z|9IG(&5e)wMaq!;zH^+M6sviHj@<7TC(E8CXI zFY_twJ?Rs04d1sOG;UDA;TU#p!3v*JoxEhN=@^Xbmy!FdYFdmq5RmASLF1R96j50* z8wZVDgcn;^wzH65u9%)a5S*1|#IC7spk~B4E|ItL^h9~_%j_4}8T>M_gf3!VAf02L4*B9l zZX(Q@^@}bCJO4N@{IajpI0e%`A7r-t-G*NlO{r3@l>%3viHb9=pf+0Z)rtnckze+V zvvd5Yo#=StQ$U%r-gz*E{-P4`Sg2bbCvB(+LC;AO>D)M9K=@I~^+z>bSJrL+xdzc7 zx_aryRtHJ)%Vx5xx9yN$)@HR2)GhyC(Fdph(cs3ZOZ`L|a&pBWlonQJWMKib^YY)D ze9x=%m@VDYHC_10bdJZwsf+%ZoeOaE=W&`PA?^G|5R!7bpPKMrCpW@)_py++^p$y_QYoIfaz_1B{q!WbcUAq`r}}5aPsMnbSNEqdAPcK2`m6M{=e4N-LJa-YsK=%i6}r-uHP*4*DY7~mqOk0HXN__%~izt3BK>1NPp{9S`*tn z)jbvU?-HHy%fy+~hd!xl#mPmD%h(UJGEuW)30j$I@=ank{IX)#Eib69?02SmuoubH zHN5}^cn#3EzvbYLP1kVp%b2?5(>Eu-3}uI%7pk!UK7|yiPNL?K^>s!X$XfX~!5i-BJ&X^+qn8OqN8Of3Z^ z29W@Q7h+IT2}E(#Mr~!7*00WT%NG@|Dd|X*w#b(cS$wFfWMoiHZmefRPSrYI2KXtYxDgCYQu?Gf zaKw%7I)aC;dSkWg8ygq@diA2kplBpizPNtPom*X7*RNhvyJm6SZdX&&?Ta@&;##r( zzS=d7x8H?A{v#vxvCRji6`gxGL3Pj$QZTls68=Fk(Z+aXt3(4Wq`8SR>h>qPp~X5p zA9xw+^<5w}NTCYp=!FZuUf+o;Cq{FY-LiagWu=p0e$zOSl8|X=Gwg?Az9A{L?Uz}c zXqZ|iG0tNo|3ha*L51ivXyjN`*UoSho3h4&3~@|Pp&v&<<<@KusTieH(R#001R~7CFYD0# zvZ490xuoQH)C+;(2?bghu-2Jke{8{G+lqvKd#n;+BP+-%I zWqRso=ODRxZ_jb?f#CnW9i5$rJ3EdD!kwh9XGhziz1t2SI((=D{33XW6^)I0<MYrM}4*p_Z{IWlp4%J-0S#jX4cTF4g={8-h}M-fU0EW&NUPI=TG@?JD*PYRtNWsaOnr8|pL(k} zW_jz%n#VDLUl#Hsp|Nfe@you){IZ+EFRNvrILqETP%yvjtb=`7zpTpEZApVPBu#Nh zeORBhFAxbLu%F89Oo#iJ+b>gnOMIZ0D8=f>mP7;`uBeAx%@FRkvJAG1pgT3!P~ZRr zB`hU>LCxP$>Y!nwUk1>bsJ$s=Tp2b9g1glE;iB~F^z|4W-Q8zJ*g?mAy>uef93WIH z*{{`$>6cknW4R9hmMM*mTc8te_edHV-BpXjn|gXWeTO^X=bnSdI}dksyaImN;jJ%r z`1IC$L-|mI+SBuh4kx0pDIip6*#XHsSK{a^Sh>T4pHD3?c9w%-bij?jsKUzP6u~?L z01NINGiiE|7j80zM2h8?nF@EwxqkDA zV?Jj1d*GLq8r7A};8LoJgqNMoI*w_Houl-1F7Wa1#!b`?9MJpM+tAe%QjJnxoO&91 zVqYkeKb6##{c^R?NCbJ6`k|qnXT{K_0Ce49qhGe!(O7c@sN;Yt>uh|^lnR+-fhp3o zCJ>kvgA_bNsiAUF_sdwL)|DC;D~+Z=AdDzgkl-80Poo>7H#+Zp;Xa~k8KUCfba@?s zp93FiVJq4?J398R$MOZ24=zYqZ+BJU_FT`?nINUl&M$*pk4UduRs0?;1M|IKE6wZE zU3RnQg$$r)H(quiVBU8KJK>1L=Bg*(lGm6tj(aSjVTbNgB-B1?TwtQa0lfnY}=GcF2a6L{p{%ASG z?kXxa{`|=m8y|0l=7N7SZ$sV%0RU&Z?8(f37jrz>C-SE&8=mw})_|PsO#7hxS2zBa zoLa>ozTBR^bHhB7@9C;ww(Oo>(1lrD*)y4#_o~RDE33a4G`#q+)y~hTD^Ks93IDZ= zXohZN-g+|sy0Vj-@1McHH%-xj7r*)Wtmw-APl@Tun!l*#+c_;Wqe0YCbZX!hhyA?7 z@hSGvh-czS3PeSgBmfX|MtT3lX7$H;|016b`yh|5toVK4{i_S8u58WJMn2wucDk}P zHzV)A)bO&^%n2EEGFX+d*}}`%X!=Tram;Oi2_7KJ=UAd{IpA8KFCy#w*SDA~4kJAL zGL4L`)Q?3f#|WYWy#Ga8F6980H%R(o+pT2CLssJu7>QpZLV+Rrpjuf>LhBKw0bL0Q zw1719AKo%u5}osx+!AIHM8r@4D&!?Q#v`saDUPZjG2_UAdnRoIobBUv9I%`dHC-`h zyv&kcHXOa{=W}#OjKg0_(EF5Bcu0JG{20_2gudp4=*MasPAUp zbgEz0N%&Oc(wY;8`~sj^vgzt}v#Ba`K4yvmzMyyPF+4v+beN)ZS3OsqQ+>=9NsD8; z@z%^c=^9d_iNDDI1B5!O1u&`Z>;SocK{eqVrgyo|XKi(mvHK4Rccoj_PqsD(Yy(4K z?I90y6=MI~iAQR3mz)JcGg@bI7Q^`ZU$k-6vI8qk?NF&8(=>O~^u$=NuN&8QNx$Yk zwQ=W@op#i_t#_@-cb+ zvb2jCy>L<+$G&WzovtfO3X@>6sHC#kM8B+;$}tkr<58?p%97?H3)z463eOhVFY^`h z%T4%Y^095tZaeNf*GBxZdLZoZWcBmLF8M{uG3t6|k8Fa=IRQ4`L0Ws$wkY_y@lh)9x(Df zowREXyp@vB`*((y$=T~<+s5qNLifi1h>kCu<2q zKBknzFfKW~tlnhy=xOQb?2wmxNKJ;NIIne>47##60bVwfttwv8UTl~he%VC>zfAp6 zL;FnS?wYCHuw|!vreX??hW{o`KR9LJZ#deK|2l`dG!lU zTXqUH|9$`dJk~AG@WPT`wqJDvVJ^Bc&RX3WXQo^f$NcI1vQxSBnrB3iVE&HM!K%)@ ztzA&Kg2-OV@Xdd#s4S4KtjumH30>LK&OX=9sVi$@C|a?0)1z6}EvJ&hnmV?4Mwca4 zr$M~*Q&O({bdukvbI=k*Gbfk0*-BToro8KxXXb_d{eD6phThM^FZ-_Mhq~pZ+6=m~ zhJ4IGq2idv)pNw7ER1-dt``B)cHX1R!SZ7i3c1I)Lf_=@NS)*(L=$ZI?i8?Yn25o? z5HMQ?XU5CeWy8lV*Q$!z+Gfsmv^`)pmuDqPz%WuFQ_oT&=$Ht9!$MObaZE&YGiXT` ziRLkSr1HSag6V374|7K3$X$8f%X5bx&iOR8XZrqDNq!Te*4H2q8QUsmg_nuL?34NA zj?72BnyF`J-H>Bg2T2@w8PP9;RL0IY5T?GMf2wQAqIBA1B)6S<;g;;b`?}Se5i4Y7mhduX#7ADemuJ%fSoJoz*W&=oJj?y`kQvyhQcR4X zVnEA)WODo##mfLVLnJX1>A0MfEOYLR1Z0Vq6}*&CLF1Sfxt8dKxwUIv!nlxi%S%rC z(m7sM@@J?vvQONgUxo|imkkBdCf7qD;xJIZ?3RxO5C^!0_+>8aXJ>-@93Bbm_FuHL z_qXE=CYk;ZWnNtYlQ?F^GN6XxaOB3nNTe{u4qwV8j)@z&qdJ6>0YZ$FC`)3SlB9sA zCL#*`2T3A;qRC|hvEng{I}DXxVM4Sp&FFS7<|56I2k;z^TZYd%@&i!D>5s5;!oVt& zcf4PZACQ0P+&XVbbG9NYq|CF(QjKVhe$Uac zC*OVXaOW$wwUcWvp48CEkBQ^!}qJ0xiRR@L8ymscgz- zenupYiHV#nCC4hd8aC14yP+a#yr@$~^;d#PX<4i@&iD1=+l0Huo!5@T13BL?T8i>req#zTf0<**n zdd+NO3F2jnnVc>P^7&=Y^4&X>yQ+{ozT{Wl{11ubbVmFZRRnsh7V}qArx|65XmQl@ z4sE~O(HXdK!lL`2cxUJ8Z2Z02tGJqQsP5N*nt}A(6@atkCJA3B-291jCv1FeZV#i2 zEMB1QmSxh-9TB2UxJz7UAWVo zIM%VJvlAQwD9{BpDmss!;8^P^*UarN47ydFQ{6AX!LR*{xO;+ z;B?}&tix2^y0Sa~2~R#IZ&vOQ>&D&$ep%`3%DR|sD$D!7STNpy7sLC%_@l8wy!#vf z%p}O2}+~;zY8SmenQTvri+Sn=lh^n0? zxsKnkyZ^$$9Z@-yUe&m+tU5?!7qu$`vj1tKA`36zkx2l=*r26)GRl-=2$>^>@r{EJKOZ^ZBXf5lUmqCkT7XWIRW zHSZr!)#zJx(i{iXT-h`e@4roZF)|O^ZuW~Y9;;$To>qg zE|_S?WaxfW;s0*sAN&8huYX#dPGxXIl&mKA?$ega>W;cKGIP|BqN7@T&we_J@M$ql zKo|ddvUS7p*0$Dte{E}J+V0)I-ThSS<>mWMxBji+{^fM|R|vWD{x1R9eS!K6eidJu z*;o`^Sw7zXSEf%W+TJ>&KJ?&}yzdF?gb3p~PHVh>k!WEPb4I(kI0^KA5XC;@n-sxj zO^eg&q?Qt(^ZuDsC;m%pXLV(9adl;VMd$rresv#X>GG&6JLdm^_h0PB^2-c$nAlZD zERX0fTY2;ByvPD&zH%4HbkH~^`g4~=Nj!q!>DKsVC}+IvY})A?%3P1ztwv;qHy-Je z`bPVLpJa+}I9rsx!+&!nU5pW4jB3iV5ED=c>7RrKAj@1*s45U$jMf{7Qlbf}UlMp( z>T~TS!WRL#t{I1Kds%VahVDI-8BUDc!hbc8S^{`k=et>7KkXai5?%-4Di1(4;YeCO z2oGKcA!mxZ=vQ@qGt+EJ@mNe4YEGF%7`*@DvX zvd`yA9|zu!6-v1OGY%q1n)U9RSX%}vJ+ zx?G2kwKN~xbI1joT+Q^StFFam-dZ+p>wGIX5NwX)zocisE#WbWm%V(fqo?D_!Hvzw zp~~pi=Ix}sXvgkDJ)H-)9^AU^Sceb(JA9~fZ^tKx4sY9dsI#Y|4N8(8J_M!Wp}N-z z-;o{wfi9@geAegl{R=9C1@*g-ltz{8f}DKqbNIIsR1k-yt8$i5j>Gzxd`OAf zAedYsS_$Xa;KnE|P|U;2k4XB%f?y?)Eu*ErNbpjF%?9*ZY+8M}9PE_WDnd|jysWd3 zUv3)5yykK_4Q}!3m$5Tv>BKSZx?4HxmmRe7%h))k5gN@!B6rLf`&qTfj}Of8#}%ga zkf1{9s4dM)9P?6|96Wk1U^Z1*pu{0-b7q+99M#9fM+5wQQB4+-CMsJ&!kY!A1}Qm5 zI9W8vsbV^f)SEr4lH-?wUpAkyYR?8@ei9#4NGk0ixjjF0>exyuIofq=*55$mn7}F9 z5td^93CP=v@$k!1=da*sP`WX4;zM*4^nvf`BX12awK=LKzib`tX|MP(B60ems?X;_ z{K*3kKIBK4$0)z9ERqIN|5{+}wxX~bHEv#aI}ErXkrGrR4{W()nq&a0u3N#e^7&5s zMttbX2_HnnMtm1~Plz|jJ^FAUi26o?Bw4Qy!LPUBc%(|MK|Aws$_lAm1b*4GFJ$*+CwwO!@cF<<{q&d@!SYnzp{~PCH!}Cg(2BYZ zjce*wH!i;Swk3;~+%^Z|UUMqu2)C_<7jyBu4Rc)J=!Ji3ci?xe*5rV>y^P<5d_20$ z2wghzZ<6f{YvHR_u2&X%|5~%m$E?@PwptH`2RwzSi?yGqpaF>`_>><*c+Wr3IdfA+owHj3-&e}Nis0T+Tu8zmrGN)lQ=hliYi z0@h!Vs;JVZ$l$Dv3*OK~2BVY}Y3dlai35oYwh~qbYV0jxsVY^UB1H%i(FPG#Bx#Zo z?6DJM5`=f;M`m}2nR{JDLI}yS{^#78ea!6a?Ck8ryVS$OdHQs-Zhp_TGo~A=VG#pXSg%sE#RC1dqbfN^`4Ojo0Y~3;Cg!@@(aMzPH|Cdlm6dl;!MF}+ZcHrmlkXq7%?KgS z(a}jc`5}i*`DF@E(TLq>&M!lqWvDhEa&-e?aCkng1p|}(&O*&u=srlZ9LDznXnrDN ze6<=$KxeaVxv33LpI;^*llC1XKHh2_Ze3-MbEHr)haGc(J+mWgy0U3jmN(~@$*eyL ztY<;*oWARV3?%7U#2x8uN@_hOzbIsbg*? zy0Qnjik8nIGdnEvN+}qglSwt<53UUwS*t#$%62V ziigPaz8v=(tivSWtrIxYM^ZpU$UkGe%v8V3w0LIv`Iz{PxjYiDM)?7s&5o|9>Qe7g zO6I+g^6p6nb(l<+6uG3Fa!6jaVzOe+kS>etGSDxR0Wf2XGe!0%5Z6P~u8`?A!^?`B zUzV*nrf3na)(zG<2OFp3n0mjAXyce#H48BZy0S7=p83H1u)`HHyWmxKa84WIZobOw-1@HM*QG6Hu;3ak_IR4a_>r5*Aj>=>0F^Xg4x zg%YxaBW3~;6-~P|VlVlT27Y38dCt8};d<#LQ1!P^y+s}<( z7PfxK0P9l(Gn9x@GAsU+6`c%fOIMcMlYSW~uuIfR zBN4NFOfh%*WpsGvw-A5WH&@{m3kzPLV;fJv#k|y3TLH;ei(-4eV)v8=c_fua*A!Mr zGRJ9fF9_oD9M42yz9Vpz@4IvX+g=ES zJ(!{5qA%KVLSrCUmlfT*4@_ZZ}aHf7)(DsMv<7I<~J9tO~r8n9$AXTZ7u4iXMxA~YB-YUULKBiTE*)(33_vN^$UuLc= zOYDzwkw+al!GL4U!d5!6O!1yT&(JS8W`KbSA8I>vxP5or=+|QVoQW@^Hqtnz;Oh() zEJJjp{!@l($n^>;9M-~Xk_Xeiq`09zn2BFzeRn>pD~rfWAC@v9N*EI@no`9i+O*4z z#^*xQmF1}x2W^Le_8jE(JxYJNcxGVDT>5!UmcW&H8GKn_`V4g*WxQG@unFgN+lOO* z**Qz_@A;IrKkX5H#AoH9DE>VcKcP&TkBR0%*N2bi-Yrw?0ZgF6tK#0HjPbIt?GL9& z?>`c;9`vD|BU{ZIfRtP8@@Y=4thFq!BD4NTF<kwIe2kVF@d%sko>u-*!bjR0`aZ_{pC}s#YUmC~H$XP7OJzuYu|s#{c=^gi zUD@<_{}#FE95QD6slxJy6^_Zta-h9>CbAE#pfn@xO{yy^6kvZW)m@|9pM#V9tu;H` zTY*lNe-A6KQ^EF;M)5dvEbZK7rYoEH5r{O8%YX6FoaoB_C|QofOm3WN>Grov^S}>o zW-C8yni;tvd{r~%{foAF|F@^$<%yGJ7M}sn8En=n^Y1-l?bxH)(J5 z0nUJq?3a+n)C=ZJhO`aHgMn>v?|y%lc>lxNeah~6-hb|NWv6-n`B=22$#vBywT^N& z>o9$#=lu`OfEhe+E0{Ol2IqoF0mN93JDuxMWHPp=edJ_*D!fdMW8y4g0fuC@170TZ zG~|xN)X(WAD!OU84lhfuJ|;<@U#65YQKAQg2{Xz87RMwi+Ch>~2)-)7j<`J!=Q#h% zOlD+(54{&!ysRv+u;(+ku*eU=5`nXOF@TqaDy$*S$5YJ70k{3sFK!0DBui*G0A1;t z_kihia?EG_{t1c0LX!3Bv)I#o@nDivoewz{1wWU1c#{`1%Xpb!H}vPr0B1_knP##3 z5AoN^N$JIpI_UK$P4~|YUM5-SOk-+MC0@FqbbgsMPxCem`|UhNJ7JVDz5+I(ZmXkuBSf*tGRa3rTIrU? z-Me=0I$V(rzpTufUxv2{91RGaR*o<;D=$-TUEZR$$Dp%f<>QH+Uq`1;v$<05F01BE zi34D|61ZR-s{IGBP$sM@GXKg>%H3?@Qv%b4vCPf=DZbsD(bo?-PaN{@>A>eS_SRK? zj0H=^Bv1Nr9p*HTQ0YF4&*6gE$zfF;~HEiflUZSjAwAqlD zg!fOLRQqt$FCjH~={JVF1}Rg&Ot9^=nI)(stJD5l#mmmX6ItV6Gsn=Z5=v&nT$ZOF zm=&D08plkNUzXwqIA!vx)V@??{|TE1QP)@P^o#VR#e%U!b>%hG6-k*UKkPT!LmtPkDLP zT34M%;^>Lf%m5O;CCJFcR3@g$h>4gS^V|YSFCyqHG{=nC&$G3@oXza6)raj>hi!b? z%jmVsb}4JuhPGJs9tI7!#`tBUbBV)4&sF)EUq&jSMnYGL8FPg9@7?92A2BE=+{dq3 zQc9LodyMUp`ZEc?Oq%Dt#0J9%zlyw^AA@G-m*qAeQ_Ld7#Js6JZYn*@(-GSfUjn5Q zll#0I&{uZa6OtDu=H70UHzP{&4K+9NBbM(oufVpgYaMa;t z+7EN?TI81ZZvhJvEW82s{IcAW^Ky@u6+XXg-_+DC*YnHF*(2j!nd{0LF=Mnh6scQY z&IkyhIs3RXTc27z{)uBIz3Z4+H-0&RFa|W1-sJqU$I|0wlw05V7M3eN)60lvAk9c` zVGZDk-buMXQXcr0%!p=Z=wq^B+<$e!bi;@`@zc5ICdjoJeO+Z2b}RfcdWSvY+S}ze z4>`PVwbh+JNx?7sZf58y-=r{yj-%l1omV@#@nhXv&G}`DvZy>?X6mnE+2rL``8SN_ zxH^G{5~m;y`xtVLCYC$qAiqrB*Q*e{y3WwN@KBnKKFXM1CYW8LkX>C_`e)iY8JcVz z@BWRgiv=zzlz^X!t6%nBnYc2a_4Rk&JC>Y6C@1L3UUsyOhkmdc>3Pj@{Ic{~Eo9+Y z3sLFfek>Os5s#H8z2l?JtH7>J_Tm;m=QB%AuXK~B{ixb)=sF~;Wb}!BXUY1TA6X$1LFy|5X$Mkc~Csr{u$IH@dt^*Fs zb9_X@AbbhsSG_ zFy}z#MgDLIKkNhZHpFx?0#SuMJ}wYy3orXR&v@CC^UJK@WmW@V#fp~|bKP=t{W5c% zj6C>dpE;dtX0ESr@>;*l)>xPrf!So_mnFN+14~l@%7WR^Q@tY&N2$e#pAyVuF#u4- zKw6osP-puBky64aFRQwqyir^2bQeqq?1}Swa=l0y`DMRdyJGFE3a3_ZjJNHVrSU~$ zz5iIz0-<9D@c6|tRskFOacDERyA37=i_ow7cyQ~{;~N9Kj7k;U8W&lz#}BiTfuuee zE;4jqW2*g?PoH|{Hk;X$<;$w& z#xF}{y+H|X#KIe3wSZ5)gTT3uV-}lVM$PcD^!+l@m(&IKSUyNlyX$_tcPb|OJ#|Ji zT`^g|d()NT1raj9%SN$~b)r2n@c&^nWu$(TlT`|s69mozin1vB3CK7@oKK3I+-RJD zgN5Uk(MH2(QHXw71ZMz9X^a!B6wL3=VhYHso|4d!y{0_-volA9WA zU-wCk(*e4=gJAB08!h5xm4J~3v6_{eE}m!KFAJvZ_UQg8UX~o4o08|n+D`w5PP>SM`=UnXYkm!UxqmC^&g zpl8f4V9)#*5_5OcuXCD6VLUv>KH_OcXW0ppmWcg7(X zXk#xRxIarlwMi_Rlh z7L%em3vkRQvtNMLV+Q#YxnE|%dlxM1V-;x0wA%8A8ys?%08Cv zN#vy5-%+3C;{b;@ep^%8H`(bZ!xab=n)Ci|b1~k(@d1AyzvXVp&zFNQH7AabX^Zzi zQ9gm>T{seI#>ziTsgFC}tCIU+3&*i7$oofuS#_U@7_0UdATg`wV=iYpfuTwICH-Q` zyJ2(wc>m~^Wq2IaT@ICu@AFNp{1yEU+p(!@lB)&JD9t0u>FoTO;YZzexwj#gvhwP9 zw*X?!jQ8K_=q}?P!m>Kx`Y4?LGr$S=+3UmvODDoy#JMd zgd8wmI@uD*uW?lE{rz0@HDJ236TP=6lgXYy-an^&B&YqVL|0s9y#MlhURO4Uy#MlI z;r)ME#JvAE&G0g9VXSZt^~=n>dRJz6nYfVUkOw2FA?fk9?{Ri`lg^_p&MQ=W?!XLJ%BftevK&q#0WTZEBA6VgWbmky!2#8W1_BZ0 zKg>lr-o*+}>&{q$Q(~ZeA10foyaRURF^-urUdDJip@Y=vqX$aaoRpLfBhzajr}eqV zQqIZK0u^qYy3`ktE`GF(uJM+FV^fP$aL4%t0q70l_Rk*(+t!j(y6~I%RAIsQPj;Pv zw~e^NzL9VLlzY6)w6Rn2%RD)55K1^m} z+O_|Xv$3P6@kIM8+n$G9rN^sx{SZI*Js%yhg^fkR-#%}2vc`2p4 z9ZcoTa=4GWqUe`FL6>dL_8MR*zUg#sg&&Y$TII*Aaz#IzPkYu8aW&2SGK;3U!&{JX zOe?i71q*Yddp(Ys)FwL8|4P0Wt=_+0C&OpwF?Ktjm%|)(@R`Il14zWXarYSCvzE^wSUg0SV5?B_SAPkoRXdx^27B@=djUa7g=Qk z1G45;WsH|GzwF3DuLo;}pwm-}dUPelmz|`wu-%@HbllDr6@Dh#3;q|IY^Ghx)B9;8x3 zstHrjLcdb+GFTfT%&i_mL2T5?-~&7}Z{(YR0{=5rS-S(J_ErWHUtEv|PV;`eslfQ3Tm5hu= zQ9QPvaeja~_9Yczg&XfhW=5}C=yyUTWFYk{iLUII4&UVHB;DuiFNki~6079BI>be# zIpu7hP0o~GCL_P>J73imP;qT#{Ibi)$!w;bzFfA^XnJ+aQ*k_Q{cPs1s-9Z;b60#R z?z_;p#y?9=ev+*a=HT7Cv)V2%Dg%C5uQ0h|Qhr@HEwnQFi+s9Zb!Ej|^UI)*egPdb zDtIlHL_Yc(eK)DDY?8X=Y~}l({hJWi8b$=PdBcEJ|WuE>eD3G3&}|>o8F>ewjE0 z`eigB3Z6QQD;0&jG_*p%x*{gw+%dnkUoNFoBbVx2Qt zB|!}k!b1o_d%jI{Gt5Z7;*(4_l^k=T#xzmq2NLgwVD5v8Kp>c*s2Tu8LrF*H4QX5A z&b^FZ)+QAOS3pJmvA$^KaP&cBf5})U19RN~@pxW>g5|9=w0VgC3NukEl8dWk0|1H6 z_DOc;^7qH-%53nWKC-?9ybs8$3^II0JGQ!R*p_i5P+mbw&_}Z`HA;*1# zet{?JU&fbRD$Kg&#`Y=O%L4rwBPGmdUHUA|K%N@MoCl(}h}lXTQiY?(qe|LAp}I(T509p7nm&2Q${7HbrI3 zFH3TpUq6}ZVFsxXiL#3RQJ;nW3wG~GogY|9DOa_o{CM@6lFlMNNVw)*Zk<_rH1axx7caEpmkGbS zK2HZjZld+@-X&w9kmygOkRiPvd1f+BEpe`inE?LCToj3BMrj0O9Yg*AFZ(EWE>K#_ zc_vW04IPcmqyBW&EYldWT1}_&Hn50n%&<})V9ang+x#-&CylQh>eV^WAs6IRT|i{j$MK@Uooq%K-X6ywm^Hr4u}DgVc_$n%C&3 zD&>!;(=hVedAiv-yci=eeI3w^)FasGF4FTAyn552J@)*v*eeG6K!pnu<)2QwPIONFvS7A!Wi2+ty@!_-TitRx z$E3P=`ub(bSJKcg)AGx>JE`~^I)2&Z*I|o1lYY2i>6ib%eQ z$@pb7p>BEebJ}{cp=X4CRou+6++{_-tg~eGT|K{S^<5umF`4L>AstB7FYAT+zNl7q zi}4nF**<50T5>B=UHUg%Lfl_o?y@fnlG#`Meb-!z|OgI^Zw2)9Db z&7Cc;B4tc|+PANKTv+Y{@)7hJ*LObpYx+0N?!{KQGSJ{MM<0aA;+Qhm z4=26NRN?sW*rNwkd@6i|x-88r_(~mK=7Kn;J7G%1$FH)Qau+fCatPy^99H-Zu*!0% zX%@wO5I{q{{{)~#TUdH}%Yed)ae)591 z!`nb#Uc3VA@Eabxcp2+I{B&xK%@8kRr2zP7b@TK= zX}1}~>6(&WnXSc27ZNR)c=2Ay$292~auLTdwfr(2?_V2joGQP}^_4ful?beTIOXnI zD^<$!6}Fr_?%omhfVFDZ_+|1^N*26C>DscC{Ib*?GAM4_qMkhrHqKJmH|S1?V{V2T z-bqY9!R&D!eJ{@O8e3rjOkOSii*_ual%YfBEcV$-BOf4qUtu|BBPH!T`L7IA4LHq@eUwmn4ok>fABNOWRke$xh&+$TOh+ zW|LCTw0aSgDJgkk?R|^au2}rj_3IX|yPpqwfd2uW*_bcrRI8qDYiiqFRpC6*1ix*q zsg24DHTdl{jK+5Z$^{?V02ZqrELAsFlM{G3yrl7QG-pD9@-(4vdz!A9wju55%GzJ1 zzCNaf=928yEx)Jr%L-*Vn}%POP5mCX94DZb?Hr(tnwF78}0IX`LRPQQhhpH$q>OM2e_UV81}%?93o925pU zZt<2QQ1O>Aei@IlWqp_cz_T1CqA1S-kQTXSj@R_j&`%1g6JFE&z^l)ZLy#3+*(qzE z%xu4QloOPGOI!ne3SRaxbdZHSObX`FVZYfo3vBs#J@Yl7lKT4l)-GH$!?AYx+WRUp zCH;-q2GdgU{u8Nh;1P|1Cn;_MVfADQkD{BGu3q9W^ExKVYK%{@KKcZ4)@+6qX}&7Z zUgZxT=?jocJk|uc9L39`54awtt6iHYnRh-304A`UiZ-W@B$qKuO$-f04hdJk8xb*} z`;#uvVC4G(d;=d4UW2O%sk2L!U&fo)Yqf-z+0&IRV!teGVdgDa9MFrkZaFPtyiBL} zZx+WSQ==;z-mx?$?-%r>;+E?0GMIoe0E~R<-xT%$yxge4%OK-)%mekO2V#Dil%8LP z=TPaP!MKE`Z+~Z5@81>g*kffRs6bAbQR+*uYRsfT+>+4EQnefN$+-Yx{z_6guOvS4 zB$ggvTs~lEc0qN*YrMC;1^NDsIFM{{)_>ZuE*A+28S7+_?BHeT-kUKFkx{H#~fp z>D(p_UIyAg@XrGw)$lPT?e6^cipIF3ITGIg*joVB&b5;A*xZH$x<{3+7`kC|@FA*W`E->2{o*C#Y?(Z_J#wqVvl||7uUvVz_ucO9=07wyH_dsv=?6{l zv#IGR=g+Gg(Pg>gS2O=#tCqMv5v6m^KO_DC>t;^?W0qC?Jww?FW&%KYVy>T+H0Pc( z2CJr`_8g_ z$iHOofS=js{ePe0*ol(2q1UMZW!HgTJ?v;rD_h`B65fA5eFQRtT;Bs*|CW#5fi$8Y zTI~;aeMxx#&?2L)%6M`2k(8~Lup&o<)I-r*`e6&43l1rF%k(`Nata`ANk$3qFM1)d z2@(M0@ksX4IG6Tw)NFVV{X<-haU^1EzRc?&>h55y#wA!k>%$ zaxUeZOm~%l!6G0vvZkI^imvd6m)s05Bg@Exh(?|D)63qbd30=kl=q(;FH4wSC_0J~ z3s_#baI)#77g-=)EV|k5Jy8N>Hw}@I0fpz`bk;ieIBWLr+6Hyg54W>YoxW4@rNF5G z#}5UDV)JAb|B_>{MF5Fo-^}J&mGZz4Q)cAjC>gx^EwUrRevBtUp4(Gco$!M_erW*> z@8s9`MoO@5@>p&tAeoiimD=|oDrxVY0&3n^PVlmL_>RzfVDaR-#j}BzB?h4YK^x=T zNUt7Vzu7X%rh+2k?nJzdEZOA}H?HIX_uNCbljBr++$Q?0!^>J(s5>TzrY;vwT8?8v zAVG;sLZ(tfBhZFV5d;c(tn$nAGJmrkY~LV{{0xW|@GLqIsdJu5XV5*Bob$`3ybhC< zeI$#pVX^9Dq`~`_3+>u2$k^=#=WhveWox$W-qz9H*wen>+YNr!#V*6Q zK-PZr)gM9R_4-C6m; zVTfbm^WL28Gl(7S4G*{N&mcb9(F2dP!#<_lu5@{J_+{G55E4SV#I|o%C{7(Th%hTV z>5lp2{f9A*3FYIz<_7}XjGA{rvSAhotsi!4hRMMi4(!(rFl`rbzO&Uwzpbt(PP=mn zEx#-Xrq$1K4L*;zAo8qjseDp}mcizY!FZZ1At!+v+lJdgU=~VcUgIFKNeHOSGC7@E z6Q+JyzVk7?xjeWfzs!P>v8rD-P^|p2BIf<;_+>i3Ow$3RY~p3sk0n(e_aBV>vN5%u zwvPAjbpCdUv!Z(a7KdZKvtoU9_40~_8lIGeXKjIQIa(>s^PW7wcg~MW@g<)RB>6yS zELoZ)=5I_38BW8Q@ECM7#_8XTX6v6D{Y2rHf!=?B**&5Ru@UiZ1Af`H2MX~0fojXJ z(pa(a4O-!)AERJKwmm=ZMej*}Q369_*`JfEy#Lt3rSP$epyA%8h_z;A5o~|>X{tBc zm|r%Cu+cF8mCx8O6O;L6RMt!*dp`W1gq&gGv`wpw^UDUorNZMV6-_>fvn!z^2D>Ni zGh?;RT{VZAoVyzv4jtORYZWkJk99P@(*7D$0N`(K=mT_Yuzh!X`~LQA?HwH*?T7YX zvL)TDHJl+!mOQIdgemsRtmtG|^vjC1Zh3ONtmyb<+RC(}8oGm+#k%E!%ks|hb0MYh zI5i@1rK($gd-Y$u-OaDQ+x+g8W^Z$I^Z&uWX6JKq8Pv`#1&Pi1p=api@aZb7Tdr`o zxpsy(Z>p~Kf>?=D|Maae@1@Uf9SaDR^gHq3WHzf&Ey(K&uF)B_dq+I24UQ6 z>0aCBm;EPgUD?oSItu(QpzmI$p)!Mt@MUbD_-{4GY+*=eA%0Dt(H-D#F53+u#@)2g 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�toTWY$pN7OyPR1bYS k(#_y-Dti(OzB!AFd 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%0A1xgr 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�{KBq0wO|KgV#)sz2FwtSlr_+{2-o$Cu0%w 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

>wd5eu5)XZC7PV?5SjU0=*NBXZk9GcaI# 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 z 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

>jJ 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μ$xHU?)fXBrO*@}#~;{GCR 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%0AvCGvkibg8`qeSD>oy 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
Jc{R;L%WjoPU%a{3K^uF1l*v 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 z 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

MK5qw};oYjBM8 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%0A#N7A5roX<}wE2s5AKZO?PA`9> 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�?pnMX)&33+{aanWc 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�^?5S&$pjteLc6&Suy6wrM;DagiFC%T5? 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 z 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

M29A)=rk?BeJ;R9e4@^?0}Xf|r>Kg!Hk$a77 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

eNaNzz;i45nB7Vnj|VogtGn)K%P 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

yHUW)I!MVr6#SiX(Zyfu8EA7T*#)d!2#CoLaut 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

0e0`zuOkBx4P%TyPJi_56ou!@aCg?_gBYcv(Hw0 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%0A`h)Z3f=mWgzbt7k4J&2YSD{toF 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%0A#eHs;#aEm+vIrb%n)kGNs8?Y{g2}8MWPb>yh!9 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 XY}K4uLQx{EnxA^=1${4U)%^bf#rAV% literal 0 HcmV?d00001 diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/BlueShark_Overlay.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/BlueShark_Overlay.vhd new file mode 100644 index 00000000..627256ff --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/BlueShark_Overlay.vhd @@ -0,0 +1,112 @@ +--Blue Shark Color Overlay Gehstock 2019 +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + + +entity BlueShark_Overlay is + port( + Video : in std_logic; + Overlay : in std_logic; + CLK : in std_logic; + Rst_n_s : in std_logic; + HSync : in std_logic; + VSync : in std_logic; + AD : in std_logic_vector(15 downto 0); + O_VIDEO_R : out std_logic; + O_VIDEO_G : out std_logic; + O_VIDEO_B : out std_logic; + O_HSYNC : out std_logic; + O_VSYNC : out std_logic + ); +end BlueShark_Overlay; + +architecture rtl of BlueShark_Overlay is + + signal HCnt : std_logic_vector(11 downto 0); + signal VCnt : std_logic_vector(11 downto 0); + signal HSync_t1 : std_logic; + signal Overlay_B1 : boolean; + signal Overlay_B1_VCnt : boolean; + signal VideoRGB : std_logic_vector(2 downto 0); + signal col_data : std_logic_vector(3 downto 0); + signal col_addr : std_logic_vector(9 downto 0); +begin + process (Rst_n_s, Clk) + variable cnt : unsigned(3 downto 0); + begin + if Rst_n_s = '0' then + cnt := "0000"; + elsif Clk'event and Clk = '1' then + if cnt = 9 then + cnt := "0000"; + else + cnt := cnt + 1; + end if; + end if; + end process; + + p_overlay : process(Rst_n_s, Clk) + variable HStart : boolean; + begin + if Rst_n_s = '0' then + HCnt <= (others => '0'); + VCnt <= (others => '0'); + HSync_t1 <= '0'; + Overlay_B1_VCnt <= false; + Overlay_B1 <= false; + elsif Clk'event and Clk = '1' then + HSync_t1 <= HSync; + HStart := (HSync_t1 = '0') and (HSync = '1'); + + if HStart then + HCnt <= (others => '0'); + else + HCnt <= HCnt + "1"; + end if; + + if (VSync = '0') then + VCnt <= (others => '0'); + elsif HStart then + VCnt <= VCnt + "1"; + end if; + + if HStart then + if (Vcnt>= x"28") and (Vcnt <= x"35") then--Top Start + Overlay_B1_VCnt <= true; + else + Overlay_B1_VCnt <= false; + end if; + end if; + + if (HCnt <= x"0") and Overlay_B1_VCnt then--Left Start + Overlay_B1 <= true; + elsif (HCnt >= x"228") then--Right End + Overlay_B1 <= false; + end if; + end if; + end process; + + p_video_out_comb : process(Video, Overlay_B1) + begin + if (Video = '0') then + VideoRGB <= "000"; + else + if Overlay_B1 then + VideoRGB <= "001"; + else + VideoRGB <= "111"; + end if; + end if; + end process; + + + O_VIDEO_R <= VideoRGB(2) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_G <= VideoRGB(1) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_B <= VideoRGB(0) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_HSYNC <= HSync; + O_VSYNC <= VSync; + + +end; \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/BlueShark_memory.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/BlueShark_memory.sv new file mode 100644 index 00000000..59940ca0 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/BlueShark_memory.sv @@ -0,0 +1,68 @@ +module BlueShark_memory( +input Clock, +input RW_n, +input [15:0]Addr, +input [15:0]Ram_Addr, +output [7:0]Ram_out, +input [7:0]Ram_in, +output [7:0]Rom_out +); + +wire [7:0]rom_data_0; +wire [7:0]rom_data_1; +wire [7:0]rom_data_2; + + +sprom #( + .init_file("./roms/blueshrk_h.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_h ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_0) + ); + +sprom #( + .init_file("./roms/blueshrk_g.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_g ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_1) + ); + +sprom #( + .init_file("./roms/blueshrk_f.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_f ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_2) + ); + + +always @(Addr, rom_data_0, rom_data_1, rom_data_2) begin + Rom_out = 8'b00000000; + case (Addr[15:11]) + 5'b00000 : Rom_out = rom_data_0; + 5'b00001 : Rom_out = rom_data_1; + 5'b00010 : Rom_out = rom_data_2; + default : Rom_out = 8'b00000000; + endcase +end + +spram #( + .addr_width_g(13), + .data_width_g(8)) +u_ram0( + .address(Ram_Addr[12:0]), + .clken(1'b1), + .clock(Clock), + .data(Ram_in), + .wren(~RW_n), + .q(Ram_out) + ); +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/BlueShark_mist.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/BlueShark_mist.sv new file mode 100644 index 00000000..14647137 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/BlueShark_mist.sv @@ -0,0 +1,214 @@ +module BlueShark_mist( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "BlueShark;;", + "O34,Scanlines,Off,25%,50%,75%;", + "O5,Overlay, On, Off;", + "T6,Reset;", + "V,v0.00.",`BUILD_DATE +}; + +assign LED = 1; +assign AUDIO_R = AUDIO_L; + + +wire clk_core, clk_sys; +wire pll_locked; +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_core), + .c1(clk_sys) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0,joystick_1; +wire scandoublerD; +wire ypbpr; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; +wire [7:0] audio; +wire hsync,vsync; +wire hs, vs; +wire r,g,b; + +wire [15:0]RAB; +wire [15:0]AD; +wire [7:0]RDB; +wire [7:0]RWD; +wire [7:0]IB; +wire [5:0]SoundCtrl3; +wire [5:0]SoundCtrl5; +wire Rst_n_s; +wire RWE_n; +wire Video; +wire HSync; +wire VSync; +/*Dip Switch:SW +1 2 3 4 5 6 7 8 Function Option +Unused + Off* + On +Unused + Off* + On +Replay + Off On 14000 + On Off* 18000* + Off Off 22000 + On On None +*/ + +invaderst invaderst( + .Rst_n(~(status[0] | status[6] | buttons[1])), + .Clk(clk_core), + .ENA(), + .Coin(btn_coin), + .Sel1Player(~btn_one_player), + .Sel2Player(~btn_two_players), + .Fire(~m_fire), + .MoveLeft(~m_left), + .MoveRight(~m_right), + .DIP("00000000"), + .RDB(RDB), + .IB(IB), + .RWD(RWD), + .RAB(RAB), + .AD(AD), + .SoundCtrl3(SoundCtrl3), + .SoundCtrl5(SoundCtrl5), + .Rst_n_s(Rst_n_s), + .RWE_n(RWE_n), + .Video(Video), + .HSync(HSync), + .VSync(VSync) + ); + +BlueShark_memory BlueShark_memory ( + .Clock(clk_core), + .RW_n(RWE_n), + .Addr(AD), + .Ram_Addr(RAB), + .Ram_out(RDB), + .Ram_in(RWD), + .Rom_out(IB) + ); + +invaders_audio invaders_audio ( + .Clk(clk_core), + .S1(SoundCtrl3), + .S2(SoundCtrl5), + .Aud(audio) + ); + +BlueShark_Overlay BlueShark_Overlay ( + .Video(Video), + .Overlay(~status[5]), + .CLK(clk_core), + .Rst_n_s(Rst_n_s), + .HSync(HSync), + .VSync(VSync), + .AD(AD), + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs) + ); + +mist_video #(.COLOR_DEPTH(3)) mist_video( + .clk_sys(clk_sys), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r,r}), + .G({g,g,g}), + .B({b,b,b}), + .HSync(hs), + .VSync(vs), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .scandoubler_disable(scandoublerD), + .scanlines(status[4:3]), + .ce_divider(0), + .ypbpr(ypbpr) + ); + +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac dac ( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +wire m_left = btn_left | joystick_0[1] | joystick_1[1]; +wire m_right = btn_right | joystick_0[0] | joystick_1[0]; +wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_left = 0; +reg btn_right = 0; +reg btn_fire1 = 0; +reg btn_coin = 0; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h6B: btn_left <= key_pressed; // left + 'h74: btn_right <= key_pressed; // right + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h29: btn_fire1 <= key_pressed; // Space + endcase + end +end + +endmodule diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T8080se.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T8080se.vhd new file mode 100644 index 00000000..65b92d54 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T8080se.vhd @@ -0,0 +1,194 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80_ALU.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80_ALU.vhd new file mode 100644 index 00000000..e09def1e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80_ALU.vhd @@ -0,0 +1,361 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80_MCode.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80_Pack.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80_Reg.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/T80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/invaders.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/invaders.vhd new file mode 100644 index 00000000..e362f4b0 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/invaders.vhd @@ -0,0 +1,243 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaderst is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire : in std_logic; + MoveLeft : in std_logic; + MoveRight : in std_logic; + DIP : in std_logic_vector(7 downto 0); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0); + SoundCtrl5 : out std_logic_vector(5 downto 0); + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic + ); +end invaderst; + +architecture rtl of invaderst is + + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(6 downto 2); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; +begin + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; + + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; + if WD_Cnt = 255 then + Rst_n_s_i <= '0'; + end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then + WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then + if Sounds(0) = '1' and Old_S0 = '0' then + WD_Cnt <= WD_Cnt + 1; + end if; + if PortWr(6) = '1' then + WD_Cnt <= (others => '0'); + end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: entity work.mw8080 + port map( + Rst_n => Rst_n,--Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + Video => Video, + HSync => HSync, + VSync => VSync); + + with AD_i(9 downto 8) select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + S when others; + + GDB0(0) <= '1'; -- Unused + GDB0(1) <= '1'; -- Unused + GDB0(2) <= '1'; -- Unused + GDB0(3) <= '1'; -- Unused + GDB0(4) <= '1'; -- Unused + GDB0(5) <= '1'; -- Unused + GDB0(6) <= '1'; -- Unused + GDB0(7) <= '1'; -- Unused + + GDB1(0) <= '1'; -- PADDLE + GDB1(1) <= '1'; -- PADDLE + GDB1(2) <= '1'; -- PADDLE + GDB1(3) <= '1'; -- PADDLE + GDB1(4) <= '1'; -- PADDLE + GDB1(5) <= '1'; -- PADDLE + GDB1(6) <= '1'; -- PADDLE + GDB1(7) <= '0'; -- PADDLE + + GDB2(0) <= not Fire; + GDB2(1) <= not Coin; + GDB2(2) <= '1'; -- unknown + GDB2(3) <= '1'; -- TILT + GDB2(4) <= '1'; -- unknown + GDB2(5) <= '1'; -- Replay + GDB2(6) <= '1'; -- Replay + GDB2(7) <= '1'; -- TEST + + PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; + PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; + PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; + PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; + PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + OldSample := '0'; + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0); + end if; + if PortWr(4) = '1' and OldSample = '0' then + D5(15 downto 8) <= DB; + D5(7 downto 0) <= D5(15 downto 8); + end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0); + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/invaders_audio.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/mw8080.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/mw8080.vhd new file mode 100644 index 00000000..1d9ad578 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/mw8080.vhd @@ -0,0 +1,335 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n, Rd_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/pll.qip b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/pll.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/pll.vhd new file mode 100644 index 00000000..f8d0b139 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/pll.vhd @@ -0,0 +1,382 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + sub_wire2 <= sub_wire0(1); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + c1 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 20, + clk1_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire4, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "20.000000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "ps" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "20" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "20.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK1 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "20" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/roms/blueshrk_f.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/roms/blueshrk_f.hex new file mode 100644 index 00000000..557f06b1 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/roms/blueshrk_f.hex @@ -0,0 +1,129 @@ +:1000000066667E3C181C1818181818183C3C3C7E74 +:1000100066607C3E06067E7E3C7E66603878606662 +:100020007E3C666666667E7E606060603E3E06067A +:100030003E7E60667E3C3C3E06063E7E66667E3CBC +:100040007E7E60703038181C0C0C3C7E66663C7EF0 +:1000500066667E3C3C7E66667E7C60667E3C00001A +:100060000000000000000000183C7E6666667E7E90 +:1000700066663E7E66663E7E66667E3E3C7E6606C2 +:10008000060606667E3C3E7E6666666666667E3E62 +:100090007E7E06063E3E06067E7E7E7E06063E3E50 +:1000A000060606063C7E6606067676667E3C666634 +:1000B00066667E7E666666663C3C181818181818D8 +:1000C0003C3C60606060606060667E3C6666763E78 +:1000D0001E1E3E76666606060606060606067E7E38 +:1000E000C3C3E7E7FFFFDBC3C3C366666E6E7E7EF6 +:1000F000767666663E7E66667E3E060606063C7E32 +:100100006666666666767E5C3E7E66667E3E766681 +:1001100066663C7E66063E7C60667E3C7E7E181887 +:1001200018181818181866666666666666667E3C55 +:1001300066666666667E3C3C1818C3C3C3DBFFFF79 +:10014000E7E7C3C366667E3C18183C7E6666666653 +:100150007E3C1818181818187E7E6070381C0E0621 +:100160007E7E3C7E6666703818001818000000001D +:100170003C3C00000000050D0000C000000100F83C +:1001800001000300FF030086E0FF0F000CFFFF7F6C +:1001900000FCFFFFDF01F8FFFFFFFF18FFFF7F00FC +:1001A0008C01FFFF00068001060003000002000131 +:1001B000000001000000800000050D00008001002B +:1001C0004000F003004000FE070040C4FF1F00C0D5 +:1001D000F8FF7F0080FFFFDF0180FFFFFFFFC0F817 +:1001E000FFFF004008FCFF014000060C0040000239 +:1001F000060000000003000000000000041E0001D3 +:1002000000000000000000000000000000000000EE +:10021000000000400000000000000000000000009E +:1002200000000000000000000000000000000000CE +:100230000E0000FC1E0000CC1E0000301E0000FE60 +:100240000F0000F7C77F00FF6F0280F71F07800FC6 +:10025000FC03C107F800FF030000FF010000FF00DE +:10026000000001000000010000000100000001008A +:10027000000000000000041E00000000000000005C +:10028000000000000004000000000000000000006A +:10029000000000000000010000400000000000001D +:1002A000000002000000000000001C0000F83D00FB +:1002B00000983D0004603C000EFC1F001EEE8FFF06 +:1002C0003BFFDF04F1EF3F0EE11FF807C003F00131 +:1002D0008000000020000000700000001C000000F2 +:1002E0000C000000040000000400000004000000F6 +:1002F00002118003C007E007E007A006E0036003E7 +:10030000C0018003C007F60FEC5BB073D8064E0C3B +:100310004238C000021100008007C00FE00F400FFC +:10032000F00FF0C78483CCC7F06FD83BED06A74D24 +:1003300030791003180E0000021500002000200084 +:1003400038003C0060006001C000C000C000C00177 +:10035000C001D009700D200740034001C001C0005A +:10036000C001800102150001000100010007800F9B +:10037000A001C000C000C000E000E000E402AC0347 +:100380003801B000A000E000C000E0006000000004 +:1003900002158001C001C000C001400140032007D8 +:1003A000700DD009C001C001C000C000C0006001D4 +:1003B00060003C0038002000200000000215000012 +:1003C0006000E000C000E000A000B0003801AC0315 +:1003D000E402E000E000C000C000C000A001800F07 +:1003E0000007000100010001040C000008000100EA +:1003F00018000300380006007C008CC0FF071CFFBB +:10040000FF3FF8FFFFDFF8FFFFFF0C81DF3F06C073 +:10041000C0000000600000003000040C000010006C +:1004200000003000200070002000F8002084FF0F42 +:1004300060FCFF3FC0FFFFDFC0FFFFFF6004BF1F86 +:10044000200081012000C0000000400003100000D7 +:10045000E00000F800F0BF00E07F00C01F00E00FE8 +:1004600000F809047F080C5E00980700F005007092 +:1004700000002000002000002000002000000310E9 +:10048000080000180000300000600000C00402F006 +:100490000502001F03007E0300F90300E00700F0DF +:1004A0001F00803F00007E0000FF0080D90000E0B8 +:1004B000040B0000080060001800C0003800800134 +:1004C00078000013FC0300FFFF3F00FFFFDF8013F5 +:1004D000FF7FC08000030000800100008000011346 +:1004E0000814080808080808080808080808080880 +:1004F000080808011008140808080808080808086F +:100500000808080808010D08000808080808080875 +:1005100008080808010A0800080808080808080868 +:10052000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:10053000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:10054000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:10055000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:10056000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:10057000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:10058000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:10059000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:1005A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:1005B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:1005C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:1005D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:1005E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:1005F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:10060000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:10061000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:10062000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:10063000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:10064000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:10065000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:10066000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:10067000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:10068000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:10069000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:1006A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:1006B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:1006C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:1006D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:1006E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:1006F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:10070000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:10071000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:10072000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:10073000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:10074000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:10075000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:10076000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:10077000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:10078000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10079000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:1007A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:1007B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:1007C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:1007D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:1007E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:1007F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/roms/blueshrk_g.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/roms/blueshrk_g.hex new file mode 100644 index 00000000..8923d41f --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/roms/blueshrk_g.hex @@ -0,0 +1,129 @@ +:10000000A7F2050837171213230605CD7D0F21022D +:1000100021CD930DC83A3620A7C8AF323620210132 +:10002000217EE6F0F60677C90606C30B08CD860FDB +:10003000210221E6014F3A2020CA5D08A7F24508B7 +:100040003606C3470836032B7881C24F08F60447AB +:100050007EE6F0B0772B36022323C31108A7F266A1 +:100060000836F9C3470836FCC347083A3620A713B9 +:10007000EBCA7D08CD9D0DCA8008C32209CD8D0D28 +:100080003A0121E603475F160021F508195E235661 +:100090003A0421BBDAD208BAD22D083A0121E6404F +:1000A0003A0621CAB708FE76C2B10821B911C3C504 +:1000B00008217611C3C508FEFCC2C208217612C30E +:1000C000C50821FC1122062121002136012323C36A +:1000D000110805C32D0801E103001082761101B15A +:1000E00003001080FC1101E3FC00C882761101B30B +:1000F000FC00C880FC11104890C83A3620A713EBCA +:10010000CA0C09CD9D0DCA0F09C32209CD8D0DCD95 +:10011000860FF60FE67F6F2680220021C913EBCDF4 +:100120008D0DAF3236202A0421CD2F0E222B203EFA +:10013000FF3238203E043232203A0121E640CA9E86 +:10014000092100213601237EE6F7F6077723CD8DBE +:100150000D0604C3F30C13EBCD8D0D21322035CAEF +:1001600080093A0621FE76C2700921B911C37309CC +:1001700021761122062121002136012323C38D0D72 +:10018000AF3238202100213606237EE640CA92098C +:100190003EFFF6803226207EE6F0F60577C906108F +:1001A000CDF30CC3800906EBCDFF0C1AE640CAB3B1 +:1001B000093EFFF680322520211080220021C90649 +:1001C00020CDF30C3A22203223202101612210217C +:1001D000210000221221CD860FE60E4F06002107D6 +:1001E0000A091114217E1213237E1221F012221605 +:1001F00021211221CD930DC83A3620A7C8AF32363F +:10020000203E63321121C910E820D028D870B08078 +:10021000D0A0E8C0A0E0E006DFCDFF0C3A3620A772 +:1002200013EBCA2E0ACD9D0DCA310AC3660ACD8DC5 +:100230000D3A23203D322320CA5A0A3E01321021B2 +:100240003A1621FEF0C24E0A211413C3510A21F0BE +:1002500012221621211221C3F409210200221021A9 +:10026000C913EBCD8D0DAF3236202A1421CD2F0EC0 +:10027000222F203EFF3238203E043234202110212C +:10028000360123360423CD8D0D0604CDF30C06DF95 +:10029000C3FF0C13EBCD8D0D21342035CABD0A3AB6 +:1002A0001621FEF0C2AD0A211413C3B00A21F012C8 +:1002B00022162121102136012323C38D0DAF3238A0 +:1002C000203EFF322A20210602221021C906FBCD42 +:1002D000FF0C3EFF322920210400221021C9060212 +:1002E000CDF30C3EFF323720211C213A3920D608AD +:1002F00087772336FD211D20360023360421DE14A6 +:10030000221E212101012218212100F4221A21217B +:100310001A21CD930DAF323520323620C913EBCDE3 +:100320009D0DCA360B3A1D21FEECD2360B211A2147 +:10033000CD8D0DC36F0B211E2035C25C0B2B7EFEB5 +:1003400003D2990B3C77878623EBC6B46F3E00CE71 +:100350000B677E12235E2356EB221E212101012210 +:100360001821211A21CD930DC83A1D21FEECD03E53 +:10037000FF323620210202221821C93A3620A7CAAC +:10038000890B210104221821C92101032218213AD5 +:100390003820A7C013EBCD8D0DAF32362032372079 +:1003A00021000022182106FDC3FF0C13EBCD8D0D9B +:1003B000AF323620C3360B04F314040515041415AC +:1003C000E5C3CA0BE5010400CD3E0C11E50F2A2F51 +:1003D00020CD080DE1AF77C9E57EE67FC2FE0B11A7 +:1003E000E90FC3010CE57EE67FC2F80B019509CD4C +:1003F000780C11E90FC3010C010200CD3E0C11D99C +:100400000F2A2B20CD080DE1AF77C9E57EE67FCA24 +:10041000310C11E10FC3340CE57EE67FCA2B0C01D1 +:100420000500CD3E0C11E10FC3340C010300CD3E9D +:100430000C11DD0F2A2D20CD080DE1AF77C9C511B4 +:100440000F2021D5253E03CD0A0DC1111120213FDA +:10045000207E812777F54FE60F121B790F0F0F0FC4 +:10046000E60F121B23F17E8827E60F1277110F206B +:1004700021D5253E03C30A0DC5110F2021D5253EE8 +:1004800003CD0A0DC1111120213F207E812777F570 +:100490004FE60F121B790F0F0F0FE60F121B23F100 +:1004A0007E88277712E6F0CABA0C7EE60F12771123 +:1004B0000F2021D5253E03C30A0DAF772B771213EA +:1004C000121312C3AF0CCD630F119C0F214324CD27 +:1004D000080D110A2021C6253E05CD0A0D11142054 +:1004E00021CF253E02CD0A0D110F2021D5253E0535 +:1004F000C30A0D2141207E0FD007B077D303C92155 +:1005000041207EA077D303C91A13F5D5CD770DE529 +:10051000060A1AF3AE77FBC501200009C11305C214 +:10052000120DE123D113F13DC20A0DC91A13F5D5FD +:10053000CD770D060AC51AD5010300E5210000118B +:100540000800292907D2490D091DC2420DEB011FE0 +:1005500000E17BF3AE77237AAE77097BAE77237A1F +:10056000AE77FB09D113C105C2350D0182FD09D15A +:1005700013F13DC22E0DC9E51A6F260029292987DE +:10058000856F7CCE006701FA0F09EBE1C9CDF00D54 +:10059000C31A0FAF323520CDA70DC3AB0EAF323526 +:1005A00020CDF00DC3420E7EF5234623A7F2D30DD6 +:1005B0003C86775F2FD3012378867757EBCD2F0EBC +:1005C000EBD5235E2356EB4E793D835F234623D143 +:1005D000EBF1C986775FD3012378867757EBCD2F70 +:1005E0000EEBD5235E2356EB4E234623D1EBF1C908 +:1005F0007EF52323A7F2160E7E5F2FD3012356EB41 +:10060000CD2F0EEBD5235E2356EB4E793D835F2332 +:100610004623D1EBF1C97E5FD3012356EBCD2F0EDC +:10062000EBD5235E2356EB4E234623D1EBF1C906CF +:10063000037C1F677D1F6F05C2310E7CE63FF620ED +:1006400067C9A7FA770EC5E51AD302DB03AE77DBDD +:1006500003A6C4140F13230DC2480EAFD302DB034D +:10066000AE77DB03A6C4140F012000E109C105C267 +:10067000460E3A3520A7C97D816FC5E51AD302DB46 +:1006800000AE77DB00A6C4140F132B0DC27C0EAF97 +:10069000D302DB00AE77DB00A6C4140F012000E11B +:1006A00009C105C27A0E3A3520A7C9A7FAE00EC5DE +:1006B000E51AD302DB03A6C4140FDB03AE771323C2 +:1006C0000DC2B10EAFD302DB03A6C4140FDB03AE21 +:1006D00077012000E109C105C2AF0E3A3520A7C954 +:1006E0007D816FC5E51AD302DB00A6C4140FDB00C1 +:1006F000AE77132B0DC2E50EAFD302DB00A6C414F8 +:100700000FDB00AE77012000E109C105C2E30E3A1C +:100710003520A7C93EFF323520C9A7FA3F0FC5E5EE +:100720001AD302DB03AE7713230DC2200FAFD3021F +:10073000DB03AE77012000E109C105C21E0FC97DB0 +:10074000816FC5E51AD302DB00AE77132B0DC244CF +:100750000FAFD302DB00AE77012000E109C105C273 +:10076000420FC92100240120E0C5E53600230DC257 +:100770006B0FE101200009C105C2690FC97E121388 +:100780002305C27D0FC9E52A0520291717AD17AD2E +:100790001F1F2FE601B56F220520E1C9171213258F +:1007A0001C0D001B0F0A0A0A1D13170F0A0A0A1C48 +:1007B0000D001B0F07251C1D0B1B1D2509110B17F9 +:1007C0000F0A001F0F1B061B0F19160B220B110B14 +:1007D000170F0A1B0F0B0E22240302000003030055 +:1007E00000030500000304000004250500000B13AE +:1007F000181C0F1B1D0A0D0013183C7E66666666EA +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/roms/blueshrk_h.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/roms/blueshrk_h.hex new file mode 100644 index 00000000..212503d2 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/roms/blueshrk_h.hex @@ -0,0 +1,129 @@ +:10000000310024C31800FFFFF5E5D5C5FBC342024C +:10001000F5E5D5C5FBC3710321002001201FCD6983 +:100020000FDB02E680CA3300CDC60CAFD302D30388 +:10003000C3B100CD630FFBC33700AF3200200120F6 +:1000400018211420F3CD690FAFD303FBCD630F113B +:100050000A20210F2006031ABECA6200DA6B00D202 +:100060007300132305C25700C373007E12132305C8 +:10007000C26B00CDC60C11BC0F210630CD2C0D3E3D +:10008000783208203A0820A7D304C2840001201443 +:10009000210630CD690F210220AFBECAA60036006E +:1000A0002B3600C3B1002BBECAB1002336FFC313E9 +:1000B00001012018211420F3CD690FAFD303FBCD2C +:1000C000C60C3E20323E203A0420A7C23901F3CDAF +:1000D000FB00FB11EE0F210430CD2C0D3E783208D1 +:1000E000203A0420A7C239013A0820A7D304C2E16C +:1000F00000213E2035C2D300C3B10021018022007F +:100100002121010022082121010022102121222089 +:100110003618C9CD630F11C60F210A2CCD2C0D1135 +:10012000CD0F210432CD2C0D3E5A3208203A082042 +:10013000A7D304C22D01C33E01F3210420350120C1 +:1001400018210F20CD690F3E01D303324120FB213E +:1001500014203609233609CD630FCDC60C3E9932E3 +:100160003C2011B40F210930CD2C0D3E4032082027 +:100170003A0820A7C27001CD630FCDC60CCDFB009D +:100180003EFF320020D304AF212520BEC4D80B236C +:10019000BEC4E50B23BEC40B0C23BEC4180C23BE87 +:1001A000C4C00B23BEC4C40B2A3F2029292929E53A +:1001B0003A1F20A7C2CA017CFE07DACA01211F200C +:1001C0003EFF7723772377233610E13A0220A7C238 +:1001D00007023A0120A7C20702DB02E660CA070253 +:1001E000FE40CAED01D2F2010614C3F4010618C3A1 +:1001F000F40106227CB8DA07023EFF32012011C664 +:100200000F215427CD080D3A3D20A7F23F02AF320F +:100210003D2021CF251114203E02CD0A0D211520AD +:100220003A3C20F547E60F77780F0F0F0FE60F2BBC +:1002300077EB21CF253E02CD0A0DF1A7CA3A00C3C4 +:1002400085012117203EFFBECA440377DB02E60882 +:10025000C2CA02F300000000AF3209203E01323C66 +:10026000203E01323B203EFF323D2011C502210CD1 +:100270002CCD2C0D1E0121FFFF2DC2790225C27944 +:10028000021DC27902D3041E0121FF0FDB02E60228 +:10029000CAAC022DC28C0225C28C021DC28C021176 +:1002A000C502210C2CCD2C0DFBC3DA0211C5022195 +:1002B0000C2CCD2C0DFBDB02E602C2DA023E023230 +:1002C0000920C3DA02041D13161D210920AFBECA7E +:1002D000B60235C2B602210420343A0020A7CA046F +:1002E000033A3720A7C20403211C20DB02E601CA1F +:1002F000F7023600C30403AFBEC2040336FF210178 +:10030000002218213A1A20A7C23D03211620357E6B +:10031000E603CA1D03E601C22603C36503111F04D9 +:10032000210121C33103112F042109217EA7F26588 +:1003300003CD4B03AF321720C1D1E1F1C921182001 +:1003400034C3340321182034C338032BAFBECA642E +:100350000335C26403237EE60F874F0600EB097E58 +:1003600023666FE9C1211820AFBECA340335C30B21 +:1003700003DB02E680CA5704211A203EFFBECADD15 +:100380000377DB01323920213B2035CCE4032108FF +:1003900020AFBECA9703353A1720A7C2D60321194A +:1003A00020357EE603CAB603E601C2BF03114D0441 +:1003B000211921C3C503114304211121C3CA03110B +:1003C0002F042109217EA7FA1304CDF903AF321AB5 +:1003D00020C1D1E1F1C9211B2034C3CD03211B2051 +:1003E00034C3D103363C3A3C20A7CAF303C699274D +:1003F000323C203EFF323D20C92BAFBECA1204352D +:10040000C21204237EE60F874F0600EB097E2366A7 +:100410006FE9C1211B20AFBECACD0335C39E03DAED +:10042000076B086B086B08FA08A6091D095609AE88 +:10043000045805F905580539068206D106C2071089 +:10044000074107BF09170ACD0A610A930ADE0A1D90 +:100450000B7B0B890BAB0BF3214220AFBEDB0132D0 +:100460003920C26A0436FFC370043A1C21CD8204CD +:100470003A3920D60887321C21CD8204C1D1E1F15E +:10048000FBC96F2690D301CD2F0E010138C5E53E83 +:10049000FFD302DB03AE77230DC28F04AFD302DBA1 +:1004A00003AE77012000E109C105C28D04C9060829 +:1004B000CDF30CCD860FE638C3C1043A0520E6081B +:1004C000B04F0600211805091108217E1213237E62 +:1004D0001213233A2120A7F210057EA7F2E0043779 +:1004E000171213237EA7F2EA043717121323060408 +:1004F000CD7D0F210A21CD930DC83A3620A7C8AF74 +:100500003236202109217E323120E6F0F60877C903 +:100510007E1213237EC3EB0404A604FD08704C1462 +:1005200004E1000408703813046100FB08B0901364 +:100530000462040008C0E8130462FB00E0C0E81392 +:100540000463FFFBE0B0901304E3FF04E070381392 +:1005500004A4FBFDE0704C141A47E690CABD05EEFA +:1005600080CAC8053A3620A713EBC5CA7805CD9DC9 +:100570000DCA7B05C1C30707CD8D0DC13A0D21FE04 +:1005800070DAD905FEB0D2E9053A0E21FE38CAADBF +:1005900005FE64CAA705FE90CAA105219013C3B049 +:1005A0000521BC13C3B005213813C3B00521641362 +:1005B000220E2121082136022323C3F6043A0D21FD +:1005C000FE80DAD005C364053A0D21FE80DA6405A9 +:1005D00078F610EE8012C3640578E602CAE40506D8 +:1005E00030C3BB040600C3BB0478E602CAF40506A8 +:1005F00020C3BB040610C3BB043A3620A713EBCAC2 +:100600000B06CD9D0DCA0E06C30707CD8D0D3A0C06 +:1006100021FE08DAF405FEE0D2EF053A0E21FEE8ED +:10062000C22906211A14C32C0621E813220E212107 +:10063000082136022323C3F6043A3620A713EBCA57 +:100640004B06CD9D0DCA4E06C30707CD8D0D3A0C46 +:1006500021FEB0DA6506FEE0D2DF05210821360171 +:100660002323C3F6042108213601233423237E2FBC +:100670003C322420360021B014220E21210A21C34D +:10068000930D3A3620A713EBCA9406CD9D0DCA9759 +:1006900006C30707CD8D0D3A0C21FE40DAAE06FEEB +:1006A000B0D2C70621082136012323C3F60421084E +:1006B000213601233423233A242077217E14220E6D +:1006C00021210A21C3F60421082136012335C3B5AF +:1006D000063A3620A713EBCAE306CD9D0DCAE606FF +:1006E000C30707CD8D0D3A0C21FE40D2FD06FE0852 +:1006F000DAE40521082136012323C3F60421082169 +:1007000036012335C36C063A0921323120C315075F +:1007100013EBCD8D0DAF3236202A0C21CD2F0E22BA +:100720002D203EFF3238203E08323320210821366A +:1007300001237EE6F9F6097723CD8D0D0604C3F378 +:100740000C13EBCD8D0D21332035CAA1073A312092 +:10075000E60FFE04D29707FE023A0E21CA8607FE74 +:1007600038CA8007FE64CA7A07FE90CA74072190CF +:1007700013C3940721BC13C39407213813C39407F0 +:10078000216413C39407FEE8CA910721E813C394B8 +:1007900007211A14220E2121082136012323C38D9B +:1007A0000DAF323820210821360B237EE64007C2E8 +:1007B000B4073EFF3228207EE6F0F6077706F7C33F +:1007C000FF0C06FBCDFF0C1AE64007C2D0073EFF28 +:1007D000322720210400220821C9CD860FE638FEE9 +:1007E00020DAE607E6104F060021D608091100219D +:1007F0007E1213237E1213233A2020A7F228087EAC +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/spram.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/sprom.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/sprom.vhd new file mode 100644 index 00000000..a81ac959 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/rtl/sprom.vhd @@ -0,0 +1,82 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_aclr_a : STRING; + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/Boothill.qpf b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/Boothill.qpf new file mode 100644 index 00000000..56216d46 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/Boothill.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 16:15:41 June 05, 2019 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "16:15:41 June 05, 2019" + +# Revisions + +PROJECT_REVISION = "Boothill" diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/Boothill.qsf b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/Boothill.qsf new file mode 100644 index 00000000..b07599dd --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/Boothill.qsf @@ -0,0 +1,176 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 20:29:53 August 09, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Boothill_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/SpaceWalk_mist.sv +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/invaders_memory.sv +set_global_assignment -name VHDL_FILE rtl/sprom.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name VHDL_FILE rtl/roms/romh.vhd +set_global_assignment -name VHDL_FILE rtl/roms/romg.vhd +set_global_assignment -name VHDL_FILE rtl/roms/romf.vhd +set_global_assignment -name VHDL_FILE rtl/roms/rome.vhd +set_global_assignment -name QIP_FILE ../../../../common/mist/mist.qip +set_global_assignment -name QIP_FILE "D:/Github/Mist_FPGA/common/mist/mist.qip" + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY SpaceWalk_mist +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== + set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# ---------------------------- +# start ENTITY(SpaceWalk_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top + set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top + set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(SpaceWalk_mist) +# -------------------------- \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/README.txt b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/README.txt new file mode 100644 index 00000000..f5cc3629 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/README.txt @@ -0,0 +1,26 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Booth Hill port to MiST by Gehstock +-- 05 June 2019 +-- +--------------------------------------------------------------------------------- +-- +-- Midway 8080 Hardware +-- Audio based on work by Paul Walsh. +-- Audio and scan converter by MikeJ. +--------------------------------------------------------------------------------- +-- +-- +-- Keyboard inputs : +-- +-- F1 : Start +-- SPACE : Fire +-- RIGHT/LEFT : Movement +-- +-- Joystick support. +-- +-- +--------------------------------------------------------------------------------- + +Work in Progress + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/clean.bat b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/SpaceWalk_mist.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/SpaceWalk_mist.sv new file mode 100644 index 00000000..b828472b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/SpaceWalk_mist.sv @@ -0,0 +1,198 @@ +module SpaceWalk_mist( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Boot Hill;;", + "O34,Scanlines,Off,25%,50%,75%;", + "T6,Reset;", + "V,v1.20.",`BUILD_DATE +}; + +assign LED = 1; +assign AUDIO_R = AUDIO_L; + + +wire clk_core, clk_sys; +wire pll_locked; +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_core), + .c1(clk_sys) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0,joystick_1; +wire scandoublerD; +wire ypbpr; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; +wire [7:0] audio; +wire hsync,vsync; +wire hs, vs; +wire r,g,b; + +wire [15:0]RAB; +wire [15:0]AD; +wire [7:0]RDB; +wire [7:0]RWD; +wire [7:0]IB; +wire [5:0]SoundCtrl3; +wire [5:0]SoundCtrl5; +wire [5:0]SoundCtrl6; +wire Rst_n_s; +wire RWE_n; +wire Video; + +invaderst invaderst( + .Rst_n(~(status[0] | status[6] | buttons[1])), + .Clk(clk_core), + .ENA(), + .Coin(btn_coin), + .Sel1Player(btn_one_player), + .Sel2Player(btn_two_players), + .Fire(~m_fire), + .MoveLeft(~m_left), + .MoveRight(~m_right), + .MoveUp(~m_up), + .MoveDown(~m_down), + .RDB(RDB), + .IB(IB), + .RWD(RWD), + .RAB(RAB), + .AD(AD), + .SoundCtrl3(SoundCtrl3), + .SoundCtrl5(SoundCtrl5), + .SoundCtrl6(SoundCtrl6), + .Rst_n_s(Rst_n_s), + .RWE_n(RWE_n), + .Video(Video), + .HSync(hs), + .VSync(vs) + ); + +invaders_memory invaders_memory ( + .Clock(clk_core), + .RW_n(RWE_n), + .Addr(AD), + .Ram_Addr(RAB), + .Ram_out(RDB), + .Ram_in(RWD), + .Rom_out(IB) + ); + +invaders_audio invaders_audio ( + .Clk(clk_core), + .S0(SoundCtrl3 | SoundCtrl4), + .S1(SoundCtrl4), + .S2(SoundCtrl5 | SoundCtrl6),//hi + .S3(SoundCtrl6),//lo + .Aud(audio) + ); + +mist_video #(.COLOR_DEPTH(3)) mist_video( + .clk_sys(clk_sys), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({Video,Video,Video}), + .G({Video,Video,Video}), + .B({Video,Video,Video}), + .HSync(hs), + .VSync(vs), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .ce_divider(0), + .scandoubler_disable(scandoublerD), + .scanlines(status[4:3]), + .ypbpr(ypbpr) + ); + +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac dac ( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +wire m_up = btn_up | joystick_0[3] | joystick_1[3]; +wire m_down = btn_down | joystick_0[2] | joystick_1[2]; +wire m_left = btn_left | joystick_0[1] | joystick_1[1]; +wire m_right = btn_right | joystick_0[0] | joystick_1[0]; +wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; +wire m_bomb = btn_fire2 | joystick_0[5] | joystick_1[5]; +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_left = 0; +reg btn_right = 0; +reg btn_down = 0; +reg btn_up = 0; +reg btn_fire1 = 0; +reg btn_fire2 = 0; +reg btn_fire3 = 0; +reg btn_coin = 0; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h75: btn_up <= key_pressed; // up + 'h72: btn_down <= key_pressed; // down + 'h6B: btn_left <= key_pressed; // left + 'h74: btn_right <= key_pressed; // right + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h14: btn_fire3 <= key_pressed; // ctrl + 'h11: btn_fire2 <= key_pressed; // alt + 'h29: btn_fire1 <= key_pressed; // Space + endcase + end +end + +endmodule diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T8080se.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T8080se.vhd new file mode 100644 index 00000000..65b92d54 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T8080se.vhd @@ -0,0 +1,194 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80_ALU.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80_ALU.vhd new file mode 100644 index 00000000..e09def1e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80_ALU.vhd @@ -0,0 +1,361 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80_MCode.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80_Pack.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80_Reg.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/T80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/invaders.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/invaders.vhd new file mode 100644 index 00000000..f3c51b25 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/invaders.vhd @@ -0,0 +1,283 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaderst is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire : in std_logic; + MoveLeft : in std_logic; + MoveRight : in std_logic; + MoveUp : in std_logic; + MoveDown : in std_logic; + DIP : in std_logic_vector(8 downto 1); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0);--audio1 + SoundCtrl4 : out std_logic_vector(5 downto 0);--audio2 + SoundCtrl5 : out std_logic_vector(5 downto 0);--low + SoundCtrl6 : out std_logic_vector(5 downto 0);--hi + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic + ); +end invaderst; + +architecture rtl of invaderst is + + component mw8080 + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); + end component; + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(7 downto 0); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; +begin + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; + + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; + if WD_Cnt = 255 then + Rst_n_s_i <= '0'; + end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then + WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then + if Sounds(0) = '1' and Old_S0 = '0' then + WD_Cnt <= WD_Cnt + 1; + end if; + if PortWr(4) = '1' then + WD_Cnt <= (others => '0'); + end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: mw8080 + port map( + Rst_n => Rst_n,--Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + Video => Video, + HSync => HSync, + VSync => VSync); + + with AD_i(9 downto 8) select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + S when others; + + GDB0(0) <= not MoveUp;--active low + GDB0(1) <= not MoveDown;--active low + GDB0(2) <= not MoveLeft;--active low + GDB0(3) <= not MoveRight;--active low + GDB0(4) <= '0';--active low + GDB0(5) <= '1';--active low + GDB0(6) <= '0';--active low + GDB0(7) <= not Fire; + + GDB1(0) <= not MoveUp;--active low + GDB1(1) <= not MoveDown;--active low + GDB1(2) <= not MoveLeft;--active low + GDB1(3) <= not MoveRight;--active low + GDB1(4) <= '0';--active low + GDB1(5) <= '1';--active low + GDB1(6) <= '0';--active low + GDB1(7) <= not Fire;--active low + + GDB2(0) <= '1';--coin + GDB2(1) <= '0';--coin + GDB2(2) <= '1';--time + GDB2(3) <= '1';--time + GDB2(4) <= '0';--DIPLOCK --active high + GDB2(5) <= not Sel1Player;--active low + GDB2(6) <= not Coin;--active low + GDB2(7) <= not Sel2Player;--active low + +-- PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; +--- PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; +--- PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; +-- PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; +-- PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl4 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + SoundCtrl6 <= (others => '0'); + OldSample := '0'; + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0);--audio_1_w + end if; +-- if PortWr(4) = '1' and OldSample = '0' then +-- D5(15 downto 8) <= DB; +-- D5(7 downto 0) <= D5(15 downto 8); +-- end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0);--tone_generator_lo_w + end if; + if PortWr(6) = '1' then + SoundCtrl6 <= DB(5 downto 0);--tone_generator_hi_w + end if; + if PortWr(7) = '1' then + SoundCtrl4 <= DB(5 downto 0);--audio_2_w + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/invaders_audio.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/invaders_audio.vhd new file mode 100644 index 00000000..d48ec86a --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/invaders_audio.vhd @@ -0,0 +1,498 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S0 : in std_logic_vector(5 downto 0); + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + S3 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S0) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s0_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s0_t1 <= S0; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S0(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S0(3) = '1') and (s0_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S0(2) = '1') and (s0_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S0(1) = '1') and (s0_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/invaders_memory.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/invaders_memory.sv new file mode 100644 index 00000000..382edd1e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/invaders_memory.sv @@ -0,0 +1,66 @@ + +module invaders_memory( +input Clock, +input RW_n, +input [15:0]Addr, +input [15:0]Ram_Addr, +output [7:0]Ram_out, +input [7:0]Ram_in, +output [7:0]Rom_out +); + +wire [7:0]rom_data_0; +wire [7:0]rom_data_1; +wire [7:0]rom_data_2; +wire [7:0]rom_data_3; + + + +romh romh ( + .clk(Clock), + .addr(Addr[10:0]), + .data(rom_data_0) +); + +romg romg ( + .clk(Clock), + .addr(Addr[10:0]), + .data(rom_data_1) +); + +romf romf ( + .clk(Clock), + .addr(Addr[10:0]), + .data(rom_data_2) +); + +rome rome ( + .clk(Clock), + .addr(Addr[10:0]), + .data(rom_data_3) +); + + +always @(Addr, rom_data_0, rom_data_1, rom_data_2, rom_data_3) begin + Rom_out = 8'b00000000; + case (Addr[13:11]) + 3'b000 : Rom_out = rom_data_0; + 3'b001 : Rom_out = rom_data_1; + 3'b010 : Rom_out = rom_data_2; + 3'b011 : Rom_out = rom_data_3; + default : Rom_out = 8'b00000000; + endcase +end + +spram #( + .addr_width_g(13), + .data_width_g(8)) +u_ram0( + .address(Ram_Addr[12:0]), + .clken(1'b1), + .clock(Clock), + .data(Ram_in), + .wren(~RW_n), + .q(Ram_out) + ); +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/invaders_video.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/invaders_video.vhd new file mode 100644 index 00000000..77ac2478 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/invaders_video.vhd @@ -0,0 +1,127 @@ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + + +entity invaders_video is + port( + Video : in std_logic; + Overlay : in std_logic; + CLK : in std_logic; + Rst_n_s : in std_logic; + HSync : in std_logic; + VSync : in std_logic; + O_VIDEO_R : out std_logic; + O_VIDEO_G : out std_logic; + O_VIDEO_B : out std_logic; + O_HSYNC : out std_logic; + O_VSYNC : out std_logic + ); +end invaders_video; + +architecture rtl of invaders_video is + + signal HCnt : std_logic_vector(11 downto 0); + signal VCnt : std_logic_vector(11 downto 0); + signal HSync_t1 : std_logic; + signal Overlay_G1 : boolean; + signal Overlay_G2 : boolean; + signal Overlay_R1 : boolean; + signal Overlay_G1_VCnt : boolean; + signal VideoRGB : std_logic_vector(2 downto 0); +begin + process (Rst_n_s, Clk) + variable cnt : unsigned(3 downto 0); + begin + if Rst_n_s = '0' then + cnt := "0000"; + elsif Clk'event and Clk = '1' then + if cnt = 9 then + cnt := "0000"; + else + cnt := cnt + 1; + end if; + end if; + end process; + + p_overlay : process(Rst_n_s, Clk) + variable HStart : boolean; + begin + if Rst_n_s = '0' then + HCnt <= (others => '0'); + VCnt <= (others => '0'); + HSync_t1 <= '0'; + Overlay_G1_VCnt <= false; + Overlay_G1 <= false; + Overlay_G2 <= false; + Overlay_R1 <= false; + elsif Clk'event and Clk = '1' then + HSync_t1 <= HSync; + HStart := (HSync_t1 = '0') and (HSync = '1'); + + if HStart then + HCnt <= (others => '0'); + else + HCnt <= HCnt + "1"; + end if; + + if (VSync = '0') then + VCnt <= (others => '0'); + elsif HStart then + VCnt <= VCnt + "1"; + end if; + + if HStart then + if (Vcnt = x"1F") then + Overlay_G1_VCnt <= true; + elsif (Vcnt = x"95") then + Overlay_G1_VCnt <= false; + end if; + end if; + + if (HCnt = x"027") and Overlay_G1_VCnt then + Overlay_G1 <= true; + elsif (HCnt = x"046") then + Overlay_G1 <= false; + end if; + + if (HCnt = x"046") then + Overlay_G2 <= true; + elsif (HCnt = x"0B6") then + Overlay_G2 <= false; + end if; + + if (HCnt = x"1A6") then + Overlay_R1 <= true; + elsif (HCnt = x"1E6") then + Overlay_R1 <= false; + end if; + + end if; + end process; + + p_video_out_comb : process(Video, Overlay_G1, Overlay_G2, Overlay_R1) + begin + if (Video = '0') then + VideoRGB <= "000"; + else + if Overlay_G1 or Overlay_G2 then + VideoRGB <= "010"; + elsif Overlay_R1 then + VideoRGB <= "100"; + else + VideoRGB <= "111"; + end if; + end if; + end process; + + + O_VIDEO_R <= VideoRGB(2) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_G <= VideoRGB(1) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_B <= VideoRGB(0) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_HSYNC <= not HSync; + O_VSYNC <= not VSync; + + +end; \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/mw8080.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/mw8080.vhd new file mode 100644 index 00000000..b9a88f96 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/mw8080.vhd @@ -0,0 +1,336 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n, Rd_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/pll.qip b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/pll.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/pll.vhd new file mode 100644 index 00000000..f8d0b139 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/pll.vhd @@ -0,0 +1,382 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + sub_wire2 <= sub_wire0(1); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + c1 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 20, + clk1_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire4, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "20.000000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "ps" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "20" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "20.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK1 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "20" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/roms/rome.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/roms/rome.vhd new file mode 100644 index 00000000..de22ea71 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/roms/rome.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rome is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rome is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"A7",X"32",X"48",X"20",X"FC",X"41",X"18",X"78",X"91",X"C8",X"44",X"4D",X"6F",X"9F",X"67",X"CD", + X"41",X"18",X"EB",X"3E",X"11",X"21",X"00",X"00",X"E5",X"19",X"D2",X"1E",X"18",X"E3",X"E1",X"F5", + X"79",X"17",X"4F",X"78",X"17",X"47",X"7D",X"17",X"6F",X"7C",X"17",X"67",X"F1",X"3D",X"C2",X"18", + X"18",X"AF",X"7C",X"1F",X"57",X"7D",X"1F",X"5F",X"3A",X"48",X"20",X"A7",X"79",X"F0",X"2F",X"3C", + X"C9",X"7C",X"2F",X"67",X"7D",X"2F",X"6F",X"23",X"C9",X"11",X"4A",X"20",X"1A",X"3D",X"CA",X"66", + X"18",X"12",X"F6",X"30",X"21",X"29",X"20",X"77",X"11",X"B0",X"3E",X"3E",X"01",X"CD",X"30",X"01", + X"3E",X"1E",X"32",X"25",X"20",X"C9",X"AF",X"32",X"57",X"20",X"32",X"58",X"20",X"32",X"27",X"20", + X"CD",X"79",X"18",X"FA",X"60",X"18",X"C3",X"10",X"19",X"21",X"86",X"20",X"11",X"0B",X"00",X"19", + X"7E",X"A7",X"F8",X"7D",X"FE",X"B2",X"C2",X"7F",X"18",X"C9",X"21",X"55",X"20",X"7E",X"A7",X"11", + X"5E",X"20",X"C2",X"98",X"18",X"11",X"70",X"20",X"23",X"34",X"4E",X"06",X"00",X"21",X"7C",X"19", + X"09",X"7E",X"EB",X"56",X"2B",X"5E",X"2B",X"77",X"2B",X"1F",X"3E",X"47",X"DA",X"B0",X"18",X"3D", + X"B6",X"77",X"21",X"22",X"1A",X"09",X"09",X"7E",X"23",X"66",X"6F",X"E9",X"3E",X"0F",X"32",X"24", + X"20",X"CD",X"D9",X"11",X"D6",X"04",X"FE",X"25",X"D2",X"CD",X"18",X"C6",X"07",X"57",X"EB",X"22", + X"4E",X"20",X"EB",X"3A",X"09",X"20",X"E6",X"1C",X"4F",X"06",X"00",X"21",X"2E",X"1E",X"09",X"3E", + X"04",X"C3",X"30",X"01",X"21",X"C8",X"1D",X"3A",X"55",X"20",X"A7",X"CA",X"F1",X"18",X"21",X"E0", + X"1D",X"CD",X"82",X"1C",X"3E",X"0A",X"32",X"24",X"20",X"2A",X"4E",X"20",X"EB",X"3E",X"0F",X"C3", + X"6E",X"1B",X"3E",X"0F",X"32",X"24",X"20",X"2A",X"4E",X"20",X"EB",X"3E",X"10",X"C3",X"6E",X"1B", + X"AF",X"32",X"23",X"20",X"2A",X"0F",X"20",X"22",X"06",X"20",X"C9",X"2A",X"06",X"20",X"23",X"22", + X"06",X"20",X"C9",X"AF",X"32",X"57",X"20",X"32",X"58",X"20",X"32",X"27",X"20",X"32",X"25",X"20", + X"CD",X"79",X"18",X"FA",X"4D",X"19",X"3A",X"06",X"20",X"D6",X"67",X"C2",X"4D",X"19",X"32",X"0A", + X"20",X"21",X"91",X"1A",X"22",X"06",X"20",X"21",X"F6",X"1D",X"C3",X"87",X"1C",X"3E",X"01",X"32", + X"08",X"20",X"C9",X"8A",X"1B",X"68",X"1B",X"81",X"1B",X"8B",X"1B",X"9D",X"1B",X"A6",X"1B",X"B2", + X"1B",X"49",X"12",X"11",X"1C",X"24",X"1C",X"5C",X"1C",X"6F",X"1C",X"2B",X"1D",X"48",X"1D",X"7B", + X"1C",X"7F",X"1C",X"A0",X"80",X"60",X"30",X"0E",X"74",X"74",X"78",X"78",X"7A",X"B0",X"C0",X"D0", + X"D1",X"58",X"71",X"8F",X"A8",X"FF",X"80",X"50",X"0E",X"9E",X"5E",X"2E",X"0D",X"2A",X"0C",X"30", + X"0B",X"38",X"12",X"2A",X"13",X"30",X"14",X"38",X"15",X"00",X"12",X"00",X"11",X"00",X"0F",X"00", + X"0E",X"00",X"00",X"00",X"15",X"01",X"12",X"01",X"11",X"00",X"0F",X"00",X"0E",X"01",X"00",X"00", + X"BC",X"15",X"BC",X"15",X"BC",X"15",X"BC",X"15",X"BC",X"15",X"BC",X"15",X"BC",X"15",X"D5",X"15", + X"C5",X"15",X"C5",X"15",X"C5",X"15",X"C5",X"15",X"C5",X"15",X"C5",X"15",X"C5",X"15",X"61",X"16", + X"06",X"06",X"1A",X"15",X"06",X"FE",X"1A",X"04",X"06",X"00",X"1A",X"09",X"06",X"FA",X"1A",X"FE", + X"06",X"04",X"1A",X"11",X"06",X"FC",X"1A",X"02",X"06",X"02",X"1A",X"0E",X"FA",X"06",X"FC",X"15", + X"FA",X"FE",X"FC",X"04",X"FA",X"00",X"FC",X"09",X"FA",X"FA",X"FC",X"FE",X"FA",X"04",X"FC",X"11", + X"FA",X"FC",X"FC",X"02",X"FA",X"02",X"FC",X"0E",X"E4",X"0A",X"0B",X"38",X"00",X"0B",X"0C",X"30", + X"17",X"0B",X"0D",X"2A",X"E4",X"0A",X"14",X"38",X"00",X"0B",X"13",X"30",X"17",X"0B",X"12",X"2A", + X"08",X"09",X"0A",X"09",X"BC",X"18",X"E4",X"18",X"02",X"19",X"8A",X"1B",X"00",X"00",X"00",X"01", + X"01",X"00",X"01",X"01",X"01",X"02",X"02",X"01",X"02",X"02",X"02",X"03",X"03",X"02",X"03",X"03", + X"03",X"04",X"04",X"03",X"04",X"04",X"00",X"02",X"FE",X"00",X"02",X"FE",X"00",X"01",X"FF",X"00", + X"01",X"FF",X"00",X"00",X"FE",X"02",X"00",X"06",X"FA",X"00",X"FF",X"01",X"00",X"FF",X"01",X"00", + X"01",X"40",X"03",X"42",X"05",X"44",X"06",X"45",X"07",X"46",X"A8",X"E8",X"AA",X"E8",X"AC",X"E8", + X"AD",X"E8",X"AE",X"E8",X"05",X"02",X"05",X"06",X"09",X"06",X"01",X"0A",X"19",X"01",X"04",X"17", + X"05",X"06",X"15",X"07",X"02",X"13",X"03",X"03",X"11",X"02",X"07",X"0F",X"06",X"05",X"01",X"04", + X"01",X"06",X"01",X"11",X"20",X"06",X"00",X"44",X"20",X"04",X"0A",X"AE",X"1A",X"02",X"0E",X"00", + X"24",X"03",X"1E",X"00",X"02",X"07",X"00",X"24",X"03",X"1E",X"00",X"05",X"9D",X"1A",X"0E",X"08", + X"0A",X"02",X"09",X"00",X"28",X"03",X"3C",X"00",X"02",X"11",X"00",X"30",X"03",X"3C",X"00",X"02", + X"0A",X"00",X"3C",X"03",X"3C",X"00",X"08",X"0A",X"09",X"5F",X"20",X"00",X"10",X"08",X"32",X"80", + X"09",X"71",X"20",X"00",X"10",X"DE",X"36",X"88",X"04",X"00",X"AE",X"1A",X"06",X"01",X"28",X"20", + X"03",X"5A",X"00",X"0D",X"05",X"E0",X"1A",X"08",X"0F",X"95",X"1C",X"08",X"10",X"9C",X"1D",X"0B", + X"11",X"20",X"FB",X"1A",X"02",X"12",X"00",X"2C",X"05",X"FF",X"1A",X"02",X"13",X"00",X"30",X"03", + X"69",X"00",X"08",X"06",X"01",X"44",X"20",X"0A",X"07",X"09",X"5F",X"20",X"01",X"B0",X"01",X"38", + X"80",X"0B",X"11",X"20",X"26",X"1B",X"06",X"84",X"5B",X"20",X"06",X"35",X"5C",X"20",X"06",X"1E", + X"28",X"20",X"06",X"50",X"27",X"20",X"09",X"71",X"20",X"01",X"B0",X"DE",X"34",X"88",X"02",X"0B", + X"A0",X"34",X"03",X"1E",X"00",X"02",X"0C",X"A0",X"34",X"03",X"0F",X"00",X"02",X"08",X"A0",X"34", + X"02",X"0D",X"A2",X"3E",X"0B",X"47",X"20",X"52",X"1B",X"0C",X"09",X"83",X"20",X"00",X"B0",X"74", + X"01",X"80",X"06",X"01",X"58",X"20",X"06",X"01",X"57",X"20",X"0B",X"11",X"20",X"63",X"1B",X"06", + X"00",X"57",X"20",X"04",X"00",X"02",X"1B",X"00",X"1A",X"13",X"CD",X"8B",X"1C",X"EB",X"4F",X"21", + X"4E",X"1E",X"7E",X"23",X"A7",X"F2",X"72",X"1B",X"0D",X"C2",X"72",X"1B",X"E6",X"7F",X"C3",X"30", + X"01",X"EB",X"7E",X"32",X"23",X"20",X"23",X"22",X"06",X"20",X"C9",X"EB",X"7E",X"32",X"22",X"20", + X"23",X"5E",X"23",X"56",X"23",X"22",X"06",X"20",X"EB",X"22",X"0F",X"20",X"C9",X"EB",X"5E",X"23", + X"56",X"EB",X"22",X"06",X"20",X"C9",X"EB",X"7E",X"23",X"5E",X"23",X"56",X"23",X"22",X"06",X"20", + X"12",X"C9",X"21",X"0D",X"20",X"7E",X"23",X"B6",X"FE",X"04",X"F2",X"BE",X"1B",X"AF",X"32",X"47", + X"20",X"21",X"AF",X"0D",X"11",X"0D",X"3A",X"CD",X"F7",X"1B",X"21",X"14",X"1A",X"3A",X"0D",X"20", + X"CD",X"D9",X"1B",X"21",X"08",X"1A",X"3A",X"0E",X"20",X"A7",X"C8",X"FE",X"03",X"FA",X"E2",X"1B", + X"3E",X"03",X"F5",X"5E",X"23",X"56",X"23",X"D5",X"5E",X"23",X"56",X"23",X"E3",X"CD",X"F7",X"1B", + X"E1",X"F1",X"3D",X"C2",X"E2",X"1B",X"C9",X"4E",X"23",X"46",X"23",X"EB",X"C5",X"E5",X"1A",X"13", + X"77",X"23",X"0D",X"C2",X"FE",X"1B",X"E1",X"01",X"20",X"00",X"09",X"C1",X"05",X"C2",X"FC",X"1B", + X"C9",X"EB",X"5E",X"23",X"56",X"23",X"0E",X"05",X"7E",X"23",X"12",X"1B",X"0D",X"C2",X"18",X"1C", + X"22",X"06",X"20",X"C9",X"11",X"0D",X"20",X"01",X"29",X"20",X"CD",X"44",X"1C",X"13",X"CD",X"44", + X"1C",X"11",X"00",X"24",X"21",X"29",X"20",X"3E",X"02",X"CD",X"30",X"01",X"11",X"1E",X"24",X"3E", + X"02",X"C3",X"30",X"01",X"1A",X"1F",X"1F",X"1F",X"1F",X"E6",X"0F",X"C2",X"50",X"1C",X"3E",X"10", + X"C6",X"30",X"02",X"03",X"1A",X"E6",X"0F",X"C6",X"30",X"02",X"03",X"C9",X"EB",X"4E",X"23",X"46", + X"23",X"5E",X"23",X"56",X"23",X"0A",X"A7",X"C2",X"6B",X"1C",X"EB",X"22",X"06",X"20",X"C9",X"21", + X"0D",X"3A",X"11",X"BD",X"20",X"01",X"06",X"24",X"C3",X"FC",X"1B",X"CD",X"8B",X"1C",X"E9",X"CD", + X"8B",X"1C",X"3A",X"0A",X"20",X"A7",X"C8",X"22",X"00",X"20",X"C9",X"EB",X"5E",X"23",X"56",X"23", + X"22",X"06",X"20",X"EB",X"C9",X"3A",X"12",X"20",X"0E",X"05",X"FE",X"04",X"D2",X"B0",X"1C",X"3D", + X"07",X"07",X"47",X"DB",X"02",X"E6",X"03",X"B0",X"4F",X"06",X"00",X"21",X"17",X"1D",X"09",X"4E", + X"11",X"00",X"28",X"11",X"00",X"28",X"04",X"79",X"A7",X"1F",X"4F",X"D2",X"CE",X"1C",X"C5",X"D5", + X"78",X"CD",X"6E",X"1B",X"E1",X"11",X"00",X"02",X"19",X"EB",X"C1",X"C3",X"B6",X"1C",X"C2",X"B6", + X"1C",X"D3",X"04",X"DB",X"02",X"2F",X"E6",X"A0",X"CA",X"D1",X"1C",X"07",X"E6",X"01",X"4F",X"DB", + X"02",X"07",X"E6",X"06",X"B1",X"4F",X"06",X"00",X"21",X"23",X"1D",X"09",X"46",X"21",X"12",X"20", + X"7E",X"90",X"FA",X"D1",X"1C",X"F3",X"7E",X"90",X"77",X"79",X"E6",X"01",X"3D",X"32",X"11",X"20", + X"3D",X"32",X"0A",X"20",X"DB",X"02",X"E6",X"0C",X"07",X"07",X"C6",X"64",X"32",X"08",X"20",X"AF", + X"32",X"0D",X"20",X"32",X"0E",X"20",X"C9",X"2B",X"05",X"08",X"08",X"05",X"05",X"33",X"05",X"05", + X"05",X"2B",X"05",X"01",X"02",X"01",X"01",X"02",X"04",X"02",X"02",X"3A",X"49",X"20",X"A7",X"C0", + X"3E",X"01",X"CD",X"C2",X"17",X"32",X"71",X"20",X"21",X"6E",X"20",X"7E",X"E6",X"0F",X"B0",X"77", + X"2B",X"7E",X"F6",X"42",X"77",X"C3",X"61",X"16",X"3A",X"12",X"20",X"A7",X"C2",X"D1",X"16",X"C9", + X"00",X"00",X"3F",X"13",X"1D",X"16",X"33",X"18",X"3F",X"1A",X"05",X"1D",X"01",X"1F",X"39",X"20", + X"27",X"22",X"11",X"24",X"35",X"25",X"13",X"27",X"2B",X"28",X"3F",X"29",X"0F",X"2B",X"19",X"2C", + X"1F",X"2D",X"21",X"2E",X"21",X"2F",X"1D",X"30",X"15",X"31",X"09",X"32",X"3B",X"32",X"29",X"33", + X"17",X"34",X"3F",X"34",X"27",X"35",X"0D",X"36",X"31",X"36",X"11",X"37",X"31",X"37",X"0F",X"38", + X"2B",X"38",X"05",X"39",X"1D",X"39",X"35",X"39",X"0B",X"3A",X"21",X"3A",X"84",X"06",X"14",X"02", + X"12",X"03",X"11",X"01",X"0F",X"0A",X"11",X"01",X"08",X"01",X"08",X"04",X"0D",X"01",X"0D",X"01", + X"0D",X"03",X"0D",X"01",X"0C",X"02",X"0D",X"0A",X"0F",X"00",X"84",X"01",X"15",X"02",X"00",X"02", + X"0E",X"01",X"11",X"03",X"10",X"03",X"0C",X"00",X"84",X"04",X"0F",X"03",X"0F",X"01",X"0F",X"04", + X"0F",X"03",X"12",X"01",X"11",X"03",X"11",X"01",X"0F",X"03",X"0F",X"01",X"0E",X"08",X"0F",X"00", + X"84",X"02",X"08",X"01",X"0D",X"01",X"0D",X"02",X"11",X"0A",X"14",X"01",X"14",X"01",X"14",X"02", + X"11",X"02",X"0D",X"0A",X"11",X"00",X"86",X"03",X"0A",X"01",X"0A",X"06",X"0F",X"03",X"0A",X"01", + X"0F",X"06",X"13",X"03",X"0A",X"01",X"0F",X"02",X"13",X"03",X"0A",X"01",X"0F",X"02",X"13",X"03", + X"0A",X"01",X"0F",X"06",X"13",X"03",X"0F",X"01",X"13",X"04",X"16",X"02",X"13",X"02",X"0F",X"06", + X"0A",X"03",X"0A",X"01",X"0A",X"06",X"0F",X"00",X"40",X"40",X"40",X"40",X"40",X"40",X"55",X"47", + X"48",X"5B",X"50",X"4F",X"57",X"5B",X"5A",X"41",X"50",X"5B",X"57",X"41",X"4D",X"5B",X"42",X"41", + X"4D",X"5B",X"54",X"48",X"55",X"44",X"55",X"4D",X"46",X"5B",X"41",X"52",X"47",X"5B",X"8D",X"27", + X"54",X"4F",X"40",X"53",X"54",X"41",X"52",X"54",X"40",X"47",X"41",X"4D",X"45",X"95",X"2B",X"50", + X"52",X"45",X"53",X"53",X"40",X"31",X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"42",X"55", + X"54",X"54",X"4F",X"4E",X"9A",X"2D",X"50",X"52",X"45",X"53",X"53",X"40",X"31",X"40",X"4F",X"52", + X"40",X"32",X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"42",X"55",X"54",X"54",X"4F",X"4E", + X"92",X"29",X"49",X"4E",X"53",X"45",X"52",X"54",X"40",X"31",X"40",X"4D",X"4F",X"52",X"45",X"40", + X"43",X"4F",X"49",X"4E",X"93",X"2A",X"49",X"4E",X"53",X"45",X"52",X"54",X"40",X"32",X"40",X"4D", + X"4F",X"52",X"45",X"40",X"43",X"4F",X"49",X"4E",X"53",X"93",X"2A",X"46",X"4F",X"52",X"40",X"54", + X"57",X"4F",X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"47",X"41",X"4D",X"45",X"89",X"89", + X"24",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"89",X"25",X"42",X"4F",X"4F",X"54", + X"40",X"48",X"49",X"4C",X"4C",X"8B",X"26",X"49",X"4E",X"53",X"45",X"52",X"54",X"40",X"43",X"4F", + X"49",X"4E",X"40",X"89",X"24",X"47",X"45",X"54",X"40",X"52",X"45",X"41",X"44",X"59",X"89",X"24", + X"40",X"40",X"44",X"52",X"41",X"57",X"5B",X"40",X"40",X"8C",X"5C",X"5C",X"5C",X"5C",X"5C",X"5C", + X"20",X"5C",X"5C",X"5C",X"5C",X"5C",X"5C",X"89",X"24",X"47",X"41",X"4D",X"45",X"40",X"4F",X"56", + X"45",X"52",X"87",X"53",X"48",X"4F",X"54",X"13",X"4D",X"45",X"5B",X"87",X"40",X"40",X"40",X"40", + X"13",X"40",X"40",X"40",X"9A",X"27",X"54",X"57",X"4F",X"40",X"50",X"4C",X"41",X"59",X"45",X"52", + X"40",X"4F",X"52",X"1D",X"53",X"49",X"4E",X"47",X"4C",X"45",X"40",X"50",X"4C",X"41",X"59",X"45", + X"52",X"B2",X"2A",X"55",X"53",X"45",X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"31",X"40", + X"48",X"41",X"4E",X"44",X"4C",X"45",X"53",X"28",X"43",X"4F",X"4D",X"50",X"55",X"54",X"45",X"52", + X"40",X"43",X"4F",X"4E",X"54",X"52",X"4F",X"4C",X"53",X"40",X"4F",X"54",X"48",X"45",X"52",X"40", + X"43",X"4F",X"57",X"42",X"4F",X"59",X"99",X"2D",X"4D",X"41",X"59",X"40",X"54",X"48",X"45",X"40", + X"42",X"45",X"54",X"54",X"45",X"52",X"40",X"43",X"4F",X"57",X"42",X"4F",X"59",X"40",X"57",X"49", + X"4E",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/roms/romf.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/roms/romf.vhd new file mode 100644 index 00000000..032ba6d3 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/roms/romf.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity romf is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of romf is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"7E",X"A7",X"CA",X"0E",X"10",X"C6",X"99",X"27",X"77",X"C2",X"0E",X"10",X"06",X"01",X"21",X"22", + X"20",X"CD",X"32",X"10",X"21",X"23",X"20",X"CD",X"32",X"10",X"23",X"CD",X"32",X"10",X"23",X"CD", + X"32",X"10",X"23",X"CD",X"32",X"10",X"23",X"CD",X"32",X"10",X"23",X"CD",X"32",X"10",X"32",X"4B", + X"20",X"C9",X"7E",X"A7",X"CA",X"3C",X"10",X"35",X"C2",X"3C",X"10",X"37",X"78",X"17",X"47",X"C9", + X"21",X"86",X"20",X"11",X"0B",X"00",X"19",X"E5",X"E5",X"CD",X"A6",X"10",X"E1",X"7D",X"FE",X"B2", + X"C2",X"43",X"10",X"E1",X"CD",X"0D",X"12",X"E1",X"CD",X"0D",X"12",X"E1",X"CD",X"0D",X"12",X"E1", + X"C3",X"0D",X"12",X"11",X"54",X"20",X"1A",X"3C",X"FE",X"03",X"C2",X"6E",X"10",X"AF",X"12",X"21", + X"49",X"20",X"11",X"12",X"00",X"19",X"3D",X"F2",X"75",X"10",X"C9",X"7E",X"E6",X"20",X"C8",X"7E", + X"E6",X"9F",X"77",X"01",X"06",X"00",X"09",X"11",X"33",X"20",X"CD",X"91",X"10",X"23",X"23",X"23", + X"23",X"1A",X"13",X"77",X"23",X"1A",X"13",X"77",X"23",X"13",X"13",X"13",X"1A",X"13",X"3C",X"77", + X"23",X"1A",X"13",X"77",X"23",X"C9",X"3A",X"0B",X"20",X"AE",X"E6",X"10",X"C0",X"7E",X"E6",X"20", + X"C8",X"7E",X"E6",X"40",X"C2",X"B9",X"10",X"36",X"00",X"01",X"05",X"00",X"09",X"5E",X"23",X"56", + X"23",X"EB",X"CD",X"C8",X"10",X"0E",X"1F",X"09",X"1A",X"13",X"77",X"23",X"1A",X"13",X"77",X"C9", + X"7E",X"E6",X"20",X"C8",X"23",X"01",X"05",X"00",X"09",X"5E",X"23",X"56",X"23",X"7B",X"B2",X"C8", + X"D5",X"5E",X"23",X"56",X"09",X"E3",X"CD",X"F6",X"10",X"E1",X"5E",X"23",X"56",X"23",X"7B",X"B2", + X"C8",X"D5",X"5E",X"23",X"56",X"E1",X"01",X"20",X"00",X"E5",X"7B",X"36",X"00",X"23",X"3D",X"C2", + X"FB",X"10",X"E1",X"09",X"15",X"C2",X"F9",X"10",X"C9",X"21",X"33",X"20",X"5E",X"23",X"56",X"23", + X"7A",X"B3",X"C8",X"D5",X"7E",X"23",X"D3",X"01",X"5E",X"23",X"56",X"23",X"4E",X"23",X"46",X"23", + X"E3",X"E6",X"08",X"CC",X"94",X"11",X"C4",X"EB",X"11",X"E1",X"C3",X"0C",X"11",X"7E",X"E6",X"40", + X"C8",X"7E",X"E6",X"BF",X"F6",X"20",X"77",X"E6",X"08",X"47",X"23",X"23",X"5E",X"23",X"7B",X"E6", + X"07",X"05",X"FA",X"46",X"11",X"2F",X"32",X"35",X"20",X"32",X"3C",X"20",X"56",X"23",X"CD",X"D9", + X"11",X"EB",X"22",X"33",X"20",X"EB",X"D5",X"CD",X"B3",X"11",X"23",X"23",X"23",X"23",X"E5",X"21", + X"36",X"20",X"CD",X"87",X"11",X"E1",X"C1",X"5E",X"23",X"7B",X"A7",X"C8",X"16",X"00",X"3E",X"05", + X"EB",X"29",X"3D",X"C2",X"71",X"11",X"09",X"EB",X"7E",X"23",X"83",X"5F",X"EB",X"22",X"3A",X"20", + X"EB",X"CD",X"B3",X"11",X"21",X"3D",X"20",X"73",X"23",X"72",X"23",X"71",X"23",X"70",X"23",X"AF", + X"77",X"23",X"77",X"C9",X"C5",X"E5",X"1A",X"13",X"D3",X"02",X"DB",X"03",X"77",X"23",X"0D",X"C2", + X"96",X"11",X"AF",X"D3",X"02",X"DB",X"03",X"77",X"E1",X"01",X"20",X"00",X"09",X"C1",X"05",X"C2", + X"94",X"11",X"C9",X"5E",X"23",X"E5",X"16",X"00",X"21",X"01",X"03",X"19",X"19",X"5E",X"23",X"56", + X"EB",X"E3",X"5E",X"23",X"E3",X"16",X"00",X"19",X"19",X"5E",X"23",X"56",X"E1",X"EB",X"4E",X"23", + X"46",X"23",X"EB",X"C9",X"7B",X"E6",X"07",X"D3",X"01",X"06",X"03",X"AF",X"7A",X"1F",X"57",X"7B", + X"1F",X"5F",X"05",X"C2",X"DB",X"11",X"7A",X"C6",X"24",X"57",X"C9",X"79",X"85",X"6F",X"C5",X"E5", + X"1A",X"13",X"D3",X"02",X"DB",X"03",X"77",X"2B",X"0D",X"C2",X"F0",X"11",X"AF",X"D3",X"02",X"DB", + X"03",X"77",X"E1",X"01",X"20",X"00",X"09",X"C1",X"05",X"C2",X"EE",X"11",X"C9",X"3A",X"0B",X"20", + X"AE",X"E6",X"10",X"C0",X"7E",X"E6",X"40",X"C8",X"7E",X"F6",X"20",X"77",X"23",X"23",X"5E",X"23", + X"23",X"56",X"23",X"CD",X"D4",X"11",X"73",X"23",X"72",X"23",X"EB",X"CD",X"32",X"12",X"01",X"1F", + X"00",X"09",X"7E",X"12",X"13",X"3E",X"03",X"D3",X"02",X"DB",X"03",X"B6",X"77",X"23",X"7E",X"12", + X"13",X"AF",X"D3",X"02",X"DB",X"03",X"B6",X"77",X"C9",X"F3",X"E1",X"01",X"00",X"00",X"11",X"00", + X"00",X"31",X"20",X"40",X"3E",X"10",X"C5",X"13",X"BA",X"C2",X"56",X"12",X"31",X"00",X"24",X"E9", + X"7E",X"A7",X"F0",X"E6",X"04",X"01",X"00",X"00",X"11",X"04",X"FC",X"CA",X"71",X"12",X"11",X"06", + X"FA",X"23",X"7E",X"E6",X"0F",X"CA",X"A9",X"12",X"1F",X"D2",X"7D",X"12",X"42",X"1F",X"D2",X"82", + X"12",X"43",X"1F",X"D2",X"87",X"12",X"4A",X"1F",X"D2",X"8C",X"12",X"4B",X"79",X"0E",X"00",X"23", + X"A7",X"C4",X"D0",X"12",X"23",X"78",X"A7",X"C4",X"C6",X"12",X"2B",X"2B",X"79",X"A7",X"CA",X"A9", + X"12",X"2B",X"7E",X"E6",X"ED",X"F6",X"60",X"77",X"C9",X"2B",X"7E",X"E6",X"02",X"C2",X"A2",X"12", + X"54",X"5D",X"01",X"0C",X"00",X"09",X"7E",X"FE",X"08",X"C8",X"36",X"08",X"EB",X"7E",X"E6",X"10", + X"C0",X"7E",X"F6",X"70",X"77",X"C9",X"86",X"FE",X"11",X"D8",X"FE",X"B4",X"D0",X"77",X"0C",X"C9", + X"86",X"E5",X"F5",X"23",X"23",X"23",X"5E",X"16",X"00",X"7D",X"FE",X"60",X"21",X"60",X"1A",X"CA", + X"E5",X"12",X"21",X"6A",X"1A",X"19",X"19",X"5E",X"23",X"56",X"F1",X"E1",X"BB",X"D8",X"BA",X"D0", + X"77",X"0C",X"C9",X"21",X"5B",X"20",X"7E",X"A7",X"F2",X"10",X"13",X"CD",X"39",X"13",X"11",X"46", + X"1A",X"3A",X"5C",X"20",X"CD",X"50",X"13",X"21",X"98",X"19",X"CD",X"99",X"13",X"22",X"65",X"20", + X"21",X"6D",X"20",X"7E",X"A7",X"F2",X"2D",X"13",X"CD",X"39",X"13",X"11",X"53",X"1A",X"3A",X"6E", + X"20",X"CD",X"50",X"13",X"21",X"A4",X"19",X"CD",X"99",X"13",X"22",X"77",X"20",X"21",X"7F",X"20", + X"7E",X"A7",X"F0",X"CD",X"39",X"13",X"23",X"71",X"C9",X"23",X"23",X"22",X"50",X"20",X"23",X"7E", + X"23",X"EB",X"21",X"73",X"19",X"01",X"FF",X"00",X"0C",X"BE",X"23",X"DA",X"48",X"13",X"EB",X"C9", + X"1F",X"1F",X"1F",X"1F",X"E6",X"0F",X"C2",X"5B",X"13",X"3E",X"01",X"77",X"23",X"F5",X"E5",X"46", + X"71",X"CD",X"7A",X"13",X"E1",X"F1",X"11",X"08",X"00",X"42",X"19",X"71",X"FE",X"0B",X"FA",X"73", + X"13",X"0E",X"05",X"2B",X"7E",X"A7",X"C0",X"36",X"08",X"C9",X"21",X"2C",X"1A",X"78",X"BE",X"C2", + X"8F",X"13",X"23",X"79",X"BE",X"C2",X"90",X"13",X"1A",X"2A",X"50",X"20",X"86",X"77",X"C9",X"23", + X"23",X"13",X"7D",X"FE",X"06",X"C2",X"7D",X"13",X"C9",X"09",X"09",X"5E",X"23",X"56",X"EB",X"C9", + X"3A",X"43",X"20",X"A7",X"C0",X"21",X"91",X"20",X"CD",X"BD",X"13",X"21",X"9C",X"20",X"CD",X"BD", + X"13",X"21",X"A7",X"20",X"CD",X"F0",X"13",X"21",X"B2",X"20",X"C3",X"F0",X"13",X"7E",X"A7",X"F0", + X"CD",X"95",X"14",X"C8",X"CD",X"6C",X"14",X"FE",X"07",X"F8",X"CD",X"5A",X"14",X"FE",X"0A",X"F8", + X"D6",X"09",X"21",X"90",X"19",X"FE",X"04",X"FA",X"A0",X"14",X"21",X"6E",X"20",X"3E",X"30",X"77", + X"32",X"5C",X"20",X"23",X"7E",X"FE",X"DE",X"DA",X"EC",X"13",X"36",X"DE",X"AF",X"C3",X"1F",X"14", + X"7E",X"A7",X"F0",X"CD",X"95",X"14",X"C8",X"CD",X"6C",X"14",X"FE",X"0A",X"F0",X"CD",X"5A",X"14", + X"FE",X"07",X"F0",X"D6",X"03",X"FE",X"01",X"21",X"8A",X"19",X"F2",X"A0",X"14",X"21",X"5C",X"20", + X"3E",X"30",X"77",X"32",X"6E",X"20",X"23",X"7E",X"FE",X"30",X"DA",X"1F",X"14",X"36",X"30",X"32", + X"55",X"20",X"AF",X"32",X"25",X"20",X"32",X"27",X"20",X"32",X"28",X"20",X"32",X"57",X"20",X"32", + X"58",X"20",X"32",X"22",X"20",X"3C",X"32",X"49",X"20",X"32",X"45",X"20",X"32",X"24",X"20",X"32", + X"43",X"20",X"3A",X"0A",X"20",X"A7",X"C8",X"3E",X"04",X"32",X"26",X"20",X"3A",X"55",X"20",X"A7", + X"3E",X"48",X"CA",X"57",X"14",X"3E",X"88",X"D3",X"03",X"C9",X"7E",X"E6",X"BF",X"77",X"11",X"07", + X"00",X"19",X"AF",X"77",X"23",X"77",X"23",X"77",X"23",X"77",X"78",X"C9",X"E5",X"23",X"23",X"7E", + X"E5",X"21",X"81",X"19",X"06",X"01",X"04",X"04",X"04",X"BE",X"23",X"D2",X"76",X"14",X"E1",X"23", + X"23",X"7E",X"21",X"85",X"19",X"11",X"88",X"19",X"05",X"13",X"23",X"BE",X"DA",X"88",X"14",X"EB", + X"96",X"4F",X"78",X"E1",X"C9",X"E5",X"11",X"07",X"00",X"19",X"7E",X"23",X"23",X"B6",X"E1",X"C9", + X"23",X"23",X"3D",X"C2",X"A0",X"14",X"5E",X"23",X"56",X"2E",X"01",X"61",X"EB",X"C3",X"F6",X"10", + X"21",X"86",X"20",X"11",X"0B",X"00",X"19",X"E5",X"CD",X"C3",X"14",X"E1",X"7D",X"FE",X"B2",X"C2", + X"B3",X"14",X"C9",X"7E",X"A7",X"F0",X"23",X"23",X"7E",X"FE",X"08",X"DA",X"E4",X"14",X"FE",X"F8", + X"D2",X"E4",X"14",X"23",X"23",X"7E",X"FE",X"10",X"DA",X"DE",X"14",X"FE",X"CC",X"D8",X"2B",X"7E", + X"2F",X"3C",X"77",X"C9",X"2B",X"2B",X"7E",X"E6",X"BF",X"77",X"C9",X"21",X"6D",X"20",X"11",X"0D", + X"20",X"CD",X"FA",X"14",X"21",X"5B",X"20",X"11",X"0E",X"20",X"7E",X"A7",X"F0",X"E6",X"01",X"C8", + X"23",X"23",X"23",X"7E",X"FE",X"17",X"D0",X"AF",X"32",X"45",X"20",X"2B",X"2B",X"7E",X"E6",X"0F", + X"F6",X"E0",X"77",X"2B",X"7E",X"E6",X"FE",X"77",X"3E",X"02",X"32",X"22",X"20",X"3A",X"0A",X"20", + X"A7",X"C8",X"1A",X"3C",X"27",X"12",X"C3",X"24",X"1C",X"3A",X"09",X"20",X"D6",X"05",X"F8",X"C2", + X"2C",X"15",X"2A",X"4C",X"20",X"7D",X"FE",X"20",X"D2",X"3E",X"15",X"21",X"23",X"1A",X"46",X"2B", + X"22",X"4C",X"20",X"3A",X"5C",X"20",X"E6",X"0F",X"CA",X"4F",X"15",X"78",X"32",X"67",X"20",X"3A", + X"6E",X"20",X"E6",X"0F",X"C8",X"78",X"32",X"79",X"20",X"C9",X"3A",X"57",X"20",X"A7",X"CA",X"70", + X"15",X"DB",X"00",X"47",X"DB",X"00",X"21",X"20",X"20",X"11",X"B0",X"19",X"B8",X"CC",X"82",X"15", + X"3A",X"58",X"20",X"A7",X"C8",X"DB",X"01",X"47",X"DB",X"01",X"21",X"21",X"20",X"11",X"C0",X"19", + X"B8",X"C0",X"E5",X"2F",X"F5",X"0F",X"0F",X"0F",X"0F",X"E6",X"07",X"4F",X"06",X"00",X"21",X"B4", + X"15",X"09",X"F1",X"E6",X"8F",X"B6",X"E1",X"AE",X"C8",X"4F",X"06",X"01",X"79",X"0F",X"DA",X"AA", + X"15",X"4F",X"78",X"07",X"47",X"13",X"13",X"C3",X"9C",X"15",X"78",X"AE",X"77",X"A0",X"EB",X"4E", + X"23",X"66",X"69",X"E9",X"30",X"70",X"40",X"50",X"20",X"50",X"60",X"10",X"21",X"5B",X"20",X"11", + X"20",X"20",X"C3",X"CB",X"15",X"21",X"6D",X"20",X"11",X"21",X"20",X"7E",X"F6",X"02",X"77",X"1A", + X"E6",X"7F",X"23",X"77",X"C9",X"C8",X"21",X"91",X"20",X"7E",X"A7",X"F2",X"E4",X"15",X"21",X"9C", + X"20",X"7E",X"A7",X"F8",X"11",X"59",X"20",X"1A",X"FE",X"07",X"F0",X"D5",X"3C",X"12",X"11",X"04", + X"00",X"19",X"E5",X"21",X"28",X"1E",X"11",X"A2",X"3E",X"CD",X"30",X"01",X"21",X"5F",X"20",X"5E", + X"16",X"00",X"2B",X"E5",X"21",X"CC",X"19",X"06",X"18",X"3A",X"0A",X"20",X"A7",X"CA",X"18",X"16", + X"78",X"D3",X"03",X"3E",X"04",X"32",X"26",X"20",X"19",X"19",X"19",X"19",X"5E",X"23",X"56",X"23", + X"4E",X"23",X"46",X"E1",X"7E",X"80",X"47",X"2B",X"7E",X"81",X"4F",X"E1",X"70",X"2B",X"72",X"2B", + X"71",X"2B",X"73",X"2B",X"36",X"C0",X"D1",X"1A",X"FE",X"06",X"C0",X"3C",X"12",X"13",X"7B",X"FE", + X"5A",X"CA",X"46",X"16",X"1B",X"1B",X"06",X"0A",X"3A",X"11",X"20",X"A7",X"CA",X"51",X"16",X"06", + X"05",X"1A",X"FE",X"06",X"FA",X"59",X"16",X"06",X"02",X"78",X"32",X"25",X"20",X"32",X"4A",X"20", + X"C9",X"C8",X"21",X"A7",X"20",X"7E",X"A7",X"F2",X"70",X"16",X"21",X"B2",X"20",X"7E",X"A7",X"F8", + X"11",X"5A",X"20",X"1A",X"FE",X"07",X"F0",X"D5",X"3C",X"12",X"11",X"04",X"00",X"19",X"E5",X"21", + X"28",X"1E",X"11",X"B8",X"3E",X"CD",X"30",X"01",X"21",X"71",X"20",X"5E",X"16",X"00",X"2B",X"E5", + X"21",X"E8",X"19",X"06",X"28",X"C3",X"09",X"16",X"21",X"0C",X"20",X"DB",X"02",X"2F",X"47",X"DB", + X"02",X"2F",X"B8",X"C0",X"E6",X"40",X"47",X"AE",X"C8",X"70",X"78",X"A7",X"C8",X"3E",X"0C",X"D3", + X"03",X"01",X"64",X"00",X"D3",X"04",X"05",X"C2",X"B4",X"16",X"0D",X"C2",X"B4",X"16",X"3E",X"08", + X"D3",X"03",X"21",X"12",X"20",X"34",X"21",X"BA",X"1D",X"CD",X"87",X"1C",X"3A",X"0A",X"20",X"A7", + X"C0",X"21",X"E7",X"1A",X"22",X"06",X"20",X"31",X"00",X"24",X"C3",X"7E",X"0F",X"3A",X"44",X"20", + X"A7",X"C8",X"11",X"08",X"20",X"01",X"29",X"20",X"CD",X"44",X"1C",X"21",X"29",X"20",X"11",X"0F", + X"24",X"3E",X"02",X"C3",X"30",X"01",X"21",X"7F",X"20",X"7E",X"A7",X"F0",X"23",X"23",X"23",X"7E", + X"FE",X"17",X"D2",X"08",X"17",X"3E",X"B6",X"77",X"EB",X"21",X"72",X"19",X"01",X"77",X"19",X"23", + X"03",X"BE",X"DA",X"0F",X"17",X"EB",X"0A",X"2B",X"77",X"C9",X"21",X"4B",X"20",X"7E",X"A7",X"C8", + X"36",X"00",X"1F",X"F5",X"DC",X"54",X"17",X"F1",X"1F",X"F5",X"DC",X"A8",X"17",X"F1",X"1F",X"F5", + X"DC",X"4F",X"17",X"F1",X"1F",X"F5",X"DC",X"49",X"18",X"F1",X"1F",X"F5",X"DC",X"8A",X"18",X"F1", + X"1F",X"DC",X"1B",X"19",X"1F",X"F5",X"DC",X"10",X"19",X"F1",X"1F",X"DC",X"23",X"19",X"C9",X"3E", + X"08",X"D3",X"03",X"C9",X"21",X"13",X"20",X"06",X"08",X"7E",X"07",X"07",X"07",X"AE",X"17",X"17", + X"21",X"13",X"20",X"7E",X"17",X"77",X"23",X"7E",X"17",X"77",X"05",X"C2",X"59",X"17",X"F6",X"02", + X"E6",X"1F",X"32",X"28",X"20",X"E6",X"07",X"4F",X"06",X"00",X"21",X"74",X"1A",X"09",X"46",X"21", + X"5E",X"20",X"7E",X"FE",X"A0",X"DA",X"8A",X"17",X"06",X"01",X"FE",X"18",X"D2",X"91",X"17",X"06", + X"02",X"2B",X"7E",X"FE",X"38",X"DA",X"9A",X"17",X"06",X"04",X"FE",X"10",X"D2",X"A1",X"17",X"06", + X"08",X"2B",X"7E",X"E6",X"F0",X"B0",X"77",X"C9",X"3A",X"09",X"20",X"F6",X"20",X"32",X"27",X"20", + X"AF",X"CD",X"C2",X"17",X"32",X"5F",X"20",X"21",X"5C",X"20",X"7E",X"E6",X"0F",X"B0",X"77",X"C3", + X"D5",X"15",X"F5",X"21",X"5D",X"20",X"4E",X"23",X"5E",X"21",X"6F",X"20",X"46",X"23",X"56",X"CD", + X"EF",X"17",X"C6",X"14",X"21",X"7A",X"1A",X"23",X"23",X"BE",X"23",X"DA",X"D7",X"17",X"F1",X"A7", + X"CA",X"E4",X"17",X"23",X"7E",X"4F",X"17",X"17",X"17",X"17",X"E6",X"F0",X"47",X"79",X"C9",X"7A", + X"93",X"C8",X"5F",X"9F",X"57",X"21",X"00",X"00",X"3E",X"06",X"19",X"3D",X"C2",X"FA",X"17",X"7C"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/roms/romg.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/roms/romg.vhd new file mode 100644 index 00000000..1c8074d2 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/roms/romg.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity romg is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of romg is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"D8",X"00",X"F8",X"00",X"FE",X"03",X"B8",X"00",X"F8",X"01",X"F8",X"00",X"60",X"00",X"F0", + X"00",X"FC",X"07",X"FE",X"7F",X"FF",X"00",X"F9",X"00",X"F9",X"00",X"F9",X"00",X"FE",X"01",X"FE", + X"01",X"02",X"11",X"50",X"00",X"D8",X"00",X"F8",X"00",X"FE",X"03",X"B8",X"00",X"F8",X"01",X"F8", + X"00",X"60",X"00",X"F0",X"E0",X"FC",X"3F",X"FE",X"03",X"FF",X"00",X"F9",X"00",X"F9",X"00",X"F9", + X"00",X"FE",X"01",X"FE",X"01",X"02",X"11",X"50",X"00",X"D8",X"00",X"F8",X"00",X"FE",X"03",X"B8", + X"00",X"F8",X"01",X"F8",X"00",X"60",X"00",X"F0",X"70",X"FC",X"1F",X"FE",X"07",X"FF",X"00",X"F9", + X"00",X"F9",X"00",X"F9",X"00",X"FE",X"01",X"FE",X"01",X"02",X"11",X"50",X"00",X"D8",X"00",X"F8", + X"00",X"FE",X"03",X"B8",X"00",X"F8",X"01",X"F8",X"00",X"60",X"E0",X"F0",X"1C",X"FC",X"07",X"FE", + X"03",X"FF",X"00",X"F9",X"00",X"F9",X"00",X"F9",X"00",X"FE",X"01",X"FE",X"01",X"02",X"11",X"50", + X"00",X"D8",X"00",X"F8",X"00",X"FE",X"03",X"B8",X"40",X"F8",X"61",X"F8",X"30",X"60",X"18",X"F0", + X"0C",X"FC",X"07",X"FE",X"03",X"FF",X"00",X"F9",X"00",X"F9",X"00",X"F9",X"00",X"FE",X"01",X"FE", + X"01",X"02",X"09",X"FC",X"01",X"F8",X"03",X"98",X"03",X"18",X"07",X"1C",X"07",X"8E",X"03",X"86", + X"01",X"C7",X"01",X"9E",X"07",X"02",X"09",X"FC",X"01",X"F8",X"01",X"F8",X"01",X"F0",X"01",X"E0", + X"01",X"E0",X"00",X"C0",X"00",X"E0",X"00",X"C0",X"03",X"02",X"09",X"FC",X"00",X"F8",X"01",X"F0", + X"03",X"C8",X"07",X"9C",X"07",X"0E",X"03",X"06",X"03",X"87",X"03",X"3E",X"0F",X"02",X"0F",X"28", + X"00",X"68",X"00",X"78",X"00",X"FE",X"01",X"58",X"00",X"F8",X"00",X"78",X"00",X"30",X"00",X"FC", + X"00",X"FE",X"01",X"7F",X"03",X"79",X"04",X"79",X"08",X"79",X"10",X"7E",X"00",X"02",X"0F",X"28", + X"00",X"68",X"00",X"78",X"00",X"FE",X"01",X"58",X"00",X"F8",X"00",X"78",X"00",X"30",X"00",X"FC", + X"00",X"FE",X"03",X"7F",X"0F",X"79",X"38",X"79",X"00",X"79",X"00",X"7E",X"00",X"02",X"0F",X"28", + X"00",X"68",X"00",X"78",X"00",X"FE",X"01",X"58",X"00",X"F8",X"00",X"78",X"00",X"30",X"00",X"FC", + X"07",X"FE",X"3F",X"7F",X"00",X"79",X"00",X"79",X"00",X"79",X"00",X"7E",X"00",X"02",X"0F",X"28", + X"00",X"68",X"00",X"78",X"00",X"FE",X"01",X"58",X"00",X"F8",X"00",X"78",X"00",X"30",X"78",X"FC", + X"0F",X"FE",X"00",X"7F",X"00",X"79",X"00",X"79",X"00",X"79",X"00",X"7E",X"00",X"02",X"0F",X"28", + X"00",X"68",X"00",X"78",X"00",X"FE",X"01",X"58",X"00",X"F8",X"00",X"78",X"18",X"30",X"0E",X"FC", + X"07",X"FE",X"01",X"7F",X"00",X"79",X"00",X"79",X"00",X"79",X"00",X"7E",X"00",X"02",X"0F",X"28", + X"00",X"68",X"00",X"78",X"00",X"FE",X"01",X"58",X"00",X"F8",X"00",X"78",X"18",X"30",X"0E",X"FC", + X"07",X"FE",X"01",X"7F",X"00",X"79",X"00",X"79",X"00",X"79",X"00",X"7E",X"00",X"02",X"0F",X"28", + X"00",X"68",X"00",X"78",X"00",X"FE",X"11",X"58",X"08",X"F8",X"04",X"78",X"02",X"30",X"03",X"FC", + X"01",X"FE",X"01",X"7F",X"00",X"79",X"00",X"79",X"00",X"79",X"00",X"7E",X"00",X"02",X"07",X"7E", + X"00",X"EC",X"00",X"CC",X"01",X"8C",X"01",X"C6",X"00",X"63",X"00",X"CE",X"01",X"02",X"07",X"7C", + X"00",X"78",X"00",X"78",X"00",X"70",X"00",X"30",X"00",X"20",X"00",X"E0",X"00",X"02",X"07",X"7E", + X"00",X"F8",X"00",X"E0",X"01",X"CC",X"01",X"86",X"00",X"C3",X"00",X"8E",X"03",X"02",X"0E",X"14", + X"00",X"34",X"00",X"3C",X"00",X"FF",X"00",X"2C",X"00",X"7C",X"00",X"3C",X"00",X"18",X"00",X"7C", + X"00",X"FE",X"00",X"3F",X"01",X"3D",X"02",X"3D",X"04",X"3D",X"00",X"02",X"0E",X"14",X"00",X"34", + X"00",X"3C",X"00",X"FF",X"00",X"2C",X"00",X"7C",X"00",X"3C",X"00",X"18",X"00",X"FC",X"00",X"FE", + X"03",X"3F",X"0E",X"3D",X"00",X"3D",X"00",X"3D",X"00",X"02",X"0E",X"14",X"00",X"34",X"00",X"3C", + X"00",X"FF",X"00",X"2C",X"00",X"7C",X"00",X"3C",X"00",X"18",X"00",X"FC",X"01",X"FE",X"0F",X"3F", + X"00",X"3D",X"00",X"3D",X"00",X"3D",X"00",X"02",X"0E",X"14",X"00",X"34",X"00",X"3C",X"00",X"FF", + X"00",X"2C",X"00",X"7C",X"00",X"3C",X"00",X"18",X"0E",X"FC",X"03",X"7E",X"00",X"3F",X"00",X"3D", + X"00",X"3D",X"00",X"3D",X"00",X"02",X"0E",X"14",X"00",X"34",X"00",X"3C",X"00",X"FF",X"00",X"2C", + X"00",X"7C",X"00",X"3C",X"00",X"18",X"0E",X"FC",X"03",X"FE",X"00",X"3F",X"00",X"3D",X"00",X"3D", + X"00",X"3D",X"00",X"02",X"0E",X"14",X"00",X"34",X"00",X"3C",X"00",X"FF",X"00",X"2C",X"00",X"7C", + X"00",X"3C",X"08",X"18",X"06",X"FC",X"03",X"FE",X"00",X"3F",X"00",X"3D",X"00",X"3D",X"00",X"3D", + X"00",X"02",X"0E",X"14",X"00",X"34",X"00",X"3C",X"00",X"FF",X"04",X"2C",X"02",X"7C",X"02",X"3C", + X"01",X"98",X"01",X"FC",X"00",X"7E",X"00",X"3F",X"00",X"3D",X"00",X"3D",X"00",X"3D",X"00",X"01", + X"05",X"7E",X"64",X"32",X"11",X"77",X"01",X"05",X"3E",X"38",X"18",X"10",X"70",X"01",X"05",X"7E", + X"70",X"26",X"21",X"E7",X"01",X"1A",X"18",X"38",X"38",X"38",X"38",X"38",X"3A",X"3A",X"BE",X"B8", + X"B8",X"F8",X"FB",X"3B",X"3B",X"3B",X"3F",X"3C",X"38",X"38",X"38",X"38",X"38",X"38",X"38",X"38", + X"01",X"15",X"08",X"18",X"18",X"18",X"18",X"1A",X"1E",X"D8",X"58",X"78",X"78",X"19",X"19",X"1F", + X"1E",X"18",X"18",X"18",X"18",X"18",X"18",X"01",X"0F",X"10",X"10",X"10",X"18",X"50",X"70",X"14", + X"14",X"14",X"1C",X"10",X"10",X"10",X"10",X"10",X"03",X"1C",X"00",X"7E",X"00",X"80",X"FF",X"01", + X"E0",X"FF",X"07",X"F0",X"FF",X"0F",X"F0",X"FF",X"0F",X"F8",X"FF",X"1F",X"F8",X"FF",X"1F",X"F8", + X"FF",X"1F",X"F8",X"E7",X"1F",X"F0",X"C3",X"0F",X"F0",X"81",X"0F",X"E0",X"81",X"07",X"C0",X"81", + X"03",X"80",X"C3",X"01",X"F0",X"FF",X"0F",X"E0",X"FF",X"07",X"E0",X"FF",X"07",X"F4",X"FF",X"2F", + X"84",X"C3",X"21",X"04",X"81",X"20",X"04",X"81",X"20",X"06",X"81",X"60",X"F7",X"FF",X"EF",X"06", + X"81",X"60",X"04",X"00",X"20",X"04",X"00",X"20",X"04",X"00",X"20",X"04",X"00",X"20",X"03",X"19", + X"00",X"1E",X"00",X"80",X"7F",X"00",X"C0",X"FF",X"00",X"E0",X"FF",X"01",X"F0",X"FF",X"03",X"F0", + X"FF",X"03",X"F8",X"F3",X"07",X"F8",X"E1",X"07",X"F8",X"C0",X"07",X"F0",X"C0",X"03",X"E0",X"C0", + X"01",X"C0",X"E1",X"00",X"80",X"7F",X"00",X"F0",X"FF",X"03",X"E0",X"FF",X"01",X"E0",X"FF",X"01", + X"F4",X"FF",X"0B",X"C4",X"E1",X"08",X"84",X"40",X"08",X"86",X"40",X"18",X"F7",X"FF",X"3B",X"86", + X"40",X"18",X"04",X"00",X"08",X"04",X"00",X"08",X"04",X"00",X"08",X"02",X"13",X"E0",X"03",X"F8", + X"0F",X"FC",X"1F",X"7C",X"1F",X"3E",X"3E",X"1E",X"3C",X"1E",X"3C",X"3C",X"1E",X"F8",X"0F",X"F0", + X"07",X"FC",X"1F",X"F8",X"0F",X"FD",X"5F",X"39",X"4E",X"11",X"44",X"FD",X"5F",X"11",X"44",X"01", + X"40",X"01",X"40",X"02",X"0F",X"C0",X"01",X"F0",X"07",X"F8",X"0F",X"78",X"0F",X"3C",X"1E",X"38", + X"0E",X"70",X"07",X"E0",X"03",X"F8",X"0F",X"F0",X"07",X"3A",X"2E",X"12",X"24",X"FB",X"6F",X"02", + X"20",X"02",X"20",X"02",X"0B",X"20",X"00",X"F8",X"00",X"FC",X"01",X"DE",X"03",X"8E",X"03",X"DC", + X"01",X"F8",X"00",X"DC",X"01",X"89",X"04",X"FD",X"05",X"01",X"04",X"03",X"20",X"04",X"00",X"00", + X"19",X"02",X"00",X"7A",X"01",X"00",X"FC",X"00",X"00",X"7E",X"05",X"00",X"FE",X"03",X"80",X"FC", + X"03",X"40",X"FE",X"07",X"68",X"F9",X"03",X"3E",X"F0",X"FF",X"0F",X"A0",X"FF",X"03",X"80",X"FF", + X"00",X"80",X"FF",X"00",X"C0",X"FF",X"00",X"E0",X"FF",X"00",X"E0",X"FF",X"01",X"70",X"FF",X"03", + X"30",X"FE",X"07",X"30",X"FC",X"0F",X"30",X"FE",X"0F",X"30",X"FE",X"0F",X"30",X"F8",X"0F",X"20", + X"F0",X"07",X"00",X"F0",X"07",X"00",X"F0",X"07",X"00",X"C0",X"07",X"00",X"80",X"07",X"00",X"00", + X"07",X"00",X"00",X"03",X"00",X"40",X"03",X"00",X"80",X"03",X"00",X"00",X"0F",X"02",X"19",X"14", + X"00",X"34",X"00",X"3C",X"00",X"FF",X"00",X"3C",X"00",X"2E",X"00",X"7E",X"00",X"3C",X"40",X"18", + X"30",X"F8",X"1F",X"FC",X"07",X"FE",X"01",X"FE",X"01",X"F7",X"01",X"E3",X"03",X"C3",X"07",X"E3", + X"0F",X"E2",X"1F",X"82",X"1F",X"00",X"1F",X"00",X"1F",X"00",X"0E",X"00",X"0C",X"00",X"0E",X"00", + X"3C",X"02",X"13",X"14",X"00",X"34",X"00",X"3C",X"00",X"FF",X"00",X"2E",X"00",X"7E",X"00",X"38", + X"10",X"18",X"0C",X"FC",X"07",X"7E",X"00",X"7A",X"00",X"F2",X"01",X"F2",X"01",X"E0",X"03",X"E0", + X"03",X"C0",X"01",X"80",X"01",X"C0",X"01",X"80",X"07",X"04",X"0B",X"A0",X"00",X"00",X"00",X"B0", + X"01",X"00",X"00",X"B0",X"01",X"3C",X"00",X"F0",X"01",X"7E",X"00",X"F9",X"13",X"FF",X"00",X"FF", + X"9F",X"FF",X"81",X"F8",X"C7",X"FF",X"9F",X"FC",X"FF",X"FF",X"FF",X"FE",X"FF",X"FF",X"FF",X"00", + X"00",X"FC",X"41",X"00",X"00",X"00",X"20",X"04",X"09",X"80",X"02",X"00",X"00",X"C0",X"06",X"00", + X"00",X"C0",X"07",X"1C",X"00",X"C8",X"27",X"3E",X"00",X"F8",X"3F",X"7F",X"10",X"E0",X"0F",X"FF", + X"13",X"F0",X"FF",X"FF",X"1F",X"F0",X"FF",X"FF",X"1F",X"00",X"00",X"7E",X"08",X"03",X"08",X"14", + X"00",X"00",X"34",X"00",X"00",X"3C",X"F0",X"00",X"FF",X"F8",X"41",X"3C",X"FC",X"4F",X"FE",X"FF", + X"7F",X"FE",X"FF",X"7F",X"00",X"E0",X"23",X"03",X"08",X"A0",X"00",X"00",X"A0",X"01",X"00",X"E0", + X"C1",X"01",X"F8",X"E7",X"43",X"E0",X"F1",X"4F",X"F0",X"FF",X"7F",X"F0",X"FF",X"7F",X"00",X"C0", + X"23",X"02",X"07",X"0A",X"00",X"1A",X"00",X"1E",X"00",X"7F",X"8E",X"1E",X"9F",X"FF",X"FF",X"00", + X"40",X"02",X"16",X"01",X"04",X"08",X"1E",X"3C",X"0F",X"F8",X"4F",X"FC",X"07",X"FE",X"07",X"7F", + X"0F",X"FE",X"3F",X"FC",X"7F",X"F0",X"3F",X"F9",X"39",X"F8",X"7F",X"D0",X"3F",X"FC",X"0F",X"FC", + X"47",X"FE",X"07",X"FF",X"0D",X"E4",X"1F",X"C2",X"3F",X"C9",X"77",X"80",X"03",X"80",X"21",X"06", + X"24",X"30",X"00",X"00",X"00",X"00",X"0C",X"F0",X"01",X"00",X"00",X"80",X"0F",X"F0",X"1F",X"00", + X"00",X"F8",X"0F",X"E0",X"FF",X"FF",X"FF",X"FF",X"07",X"E0",X"FF",X"FF",X"FF",X"FF",X"07",X"E0", + X"FF",X"FF",X"FF",X"FF",X"07",X"C0",X"FF",X"FF",X"FF",X"FF",X"03",X"C0",X"FF",X"FF",X"FF",X"FF", + X"03",X"C0",X"FF",X"FF",X"FF",X"FF",X"03",X"80",X"FF",X"FF",X"FF",X"FF",X"01",X"80",X"FF",X"FF", + X"FF",X"FF",X"01",X"80",X"FF",X"FF",X"FF",X"FF",X"01",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"FF",X"FF",X"FF",X"FF",X"03",X"C0",X"FF",X"FF", + X"FF",X"FF",X"03",X"C0",X"FF",X"FF",X"FF",X"FF",X"03",X"C0",X"FF",X"FF",X"FF",X"FF",X"03",X"00", + X"7C",X"00",X"00",X"3E",X"00",X"00",X"93",X"01",X"80",X"C9",X"00",X"80",X"10",X"02",X"40",X"08", + X"01",X"40",X"11",X"05",X"A0",X"88",X"02",X"40",X"92",X"04",X"20",X"49",X"02",X"20",X"54",X"08", + X"10",X"2A",X"04",X"20",X"38",X"08",X"10",X"1C",X"04",X"F0",X"EF",X"1F",X"F8",X"F7",X"0F",X"20", + X"38",X"08",X"10",X"1C",X"04",X"20",X"54",X"08",X"10",X"2A",X"04",X"40",X"92",X"04",X"20",X"49", + X"02",X"40",X"11",X"05",X"A0",X"88",X"02",X"80",X"10",X"02",X"40",X"08",X"01",X"00",X"93",X"01", + X"80",X"C9",X"00",X"00",X"7C",X"00",X"00",X"3E",X"00",X"01",X"0F",X"18",X"3C",X"7E",X"FF",X"E7", + X"E7",X"81",X"81",X"E7",X"E7",X"E7",X"E7",X"E7",X"FF",X"FF",X"CD",X"F5",X"0E",X"11",X"0B",X"20", + X"1A",X"EE",X"FF",X"12",X"C2",X"EC",X"0E",X"CD",X"40",X"10",X"CD",X"E6",X"0F",X"C3",X"EC",X"0E", + X"3A",X"0B",X"20",X"A7",X"CA",X"DE",X"0E",X"CD",X"40",X"10",X"CD",X"A0",X"13",X"CD",X"B7",X"0F", + X"CD",X"B0",X"14",X"CD",X"29",X"15",X"CD",X"63",X"10",X"22",X"52",X"20",X"CD",X"60",X"12",X"21", + X"00",X"00",X"22",X"33",X"20",X"2A",X"52",X"20",X"CD",X"2D",X"11",X"C3",X"EC",X"0E",X"2A",X"52", + X"20",X"E5",X"CD",X"D0",X"10",X"CD",X"09",X"11",X"E1",X"CD",X"7B",X"10",X"CD",X"98",X"16",X"E1", + X"D1",X"C1",X"F1",X"FB",X"C9",X"21",X"02",X"20",X"7E",X"A7",X"CA",X"FF",X"0E",X"35",X"C9",X"23", + X"7E",X"A7",X"CA",X"0C",X"0F",X"35",X"2B",X"3A",X"05",X"20",X"77",X"C9",X"23",X"7E",X"A7",X"CA", + X"18",X"0F",X"35",X"3E",X"00",X"D3",X"05",X"C9",X"2A",X"00",X"20",X"7E",X"A7",X"C2",X"2C",X"0F", + X"3E",X"00",X"D3",X"05",X"3A",X"0A",X"20",X"A7",X"C0",X"D3",X"03",X"C9",X"F2",X"3B",X"0F",X"E6", + X"7F",X"32",X"05",X"20",X"23",X"22",X"00",X"20",X"C3",X"1B",X"0F",X"32",X"03",X"20",X"23",X"3A", + X"05",X"20",X"3D",X"32",X"02",X"20",X"3E",X"01",X"32",X"04",X"20",X"7E",X"23",X"22",X"00",X"20", + X"E6",X"7F",X"07",X"4F",X"06",X"00",X"21",X"50",X"1D",X"09",X"7E",X"D3",X"05",X"23",X"7E",X"D3", + X"06",X"C9",X"31",X"00",X"24",X"CD",X"49",X"12",X"AF",X"06",X"13",X"11",X"00",X"20",X"12",X"13", + X"05",X"C2",X"6E",X"0F",X"3D",X"12",X"13",X"12",X"21",X"91",X"1A",X"22",X"06",X"20",X"21",X"7E", + X"0F",X"E5",X"FB",X"D3",X"04",X"2A",X"06",X"20",X"7E",X"A7",X"CA",X"9F",X"0F",X"23",X"22",X"06", + X"20",X"EB",X"21",X"51",X"19",X"07",X"4F",X"06",X"00",X"09",X"7E",X"23",X"66",X"6F",X"E9",X"CD", + X"F3",X"12",X"CD",X"1A",X"17",X"CD",X"F6",X"16",X"CD",X"EB",X"14",X"3A",X"0A",X"20",X"A7",X"C8", + X"CD",X"5A",X"15",X"CD",X"DD",X"16",X"C9",X"21",X"86",X"20",X"11",X"0B",X"00",X"19",X"E5",X"CD", + X"D8",X"0F",X"E1",X"01",X"EF",X"00",X"FE",X"70",X"D2",X"CD",X"0F",X"06",X"10",X"7E",X"A1",X"B0", + X"77",X"7D",X"FE",X"B2",X"C2",X"BA",X"0F",X"C9",X"7E",X"A7",X"F0",X"23",X"7E",X"23",X"86",X"77", + X"23",X"7E",X"23",X"86",X"77",X"C9",X"21",X"4B",X"20",X"7E",X"A7",X"C0",X"47",X"21",X"09",X"20", + X"35",X"C2",X"14",X"10",X"36",X"1E",X"3A",X"45",X"20",X"A7",X"C2",X"0E",X"10",X"21",X"08",X"20"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/roms/romh.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/roms/romh.vhd new file mode 100644 index 00000000..d1853f40 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/roms/romh.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity romh is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of romh is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"AF",X"D3",X"03",X"C3",X"17",X"00",X"F5",X"C5",X"D5",X"E5",X"C3",X"9A",X"0E",X"00", + X"F5",X"C5",X"D5",X"E5",X"C3",X"B0",X"0E",X"DB",X"02",X"E6",X"10",X"CA",X"62",X"0F",X"06",X"01", + X"11",X"00",X"00",X"21",X"00",X"20",X"D3",X"04",X"70",X"7E",X"A8",X"CA",X"3D",X"00",X"4F",X"7D", + X"E6",X"01",X"79",X"C2",X"3B",X"00",X"B2",X"57",X"C3",X"3D",X"00",X"B3",X"5F",X"23",X"7C",X"FE", + X"40",X"C2",X"26",X"00",X"D3",X"04",X"2B",X"7C",X"FE",X"1F",X"CA",X"7A",X"00",X"7E",X"A8",X"CA", + X"61",X"00",X"4F",X"7D",X"E6",X"01",X"79",X"C2",X"5F",X"00",X"B2",X"57",X"C3",X"61",X"00",X"B3", + X"5F",X"78",X"2F",X"77",X"AE",X"CA",X"44",X"00",X"4F",X"7D",X"E6",X"01",X"79",X"C2",X"75",X"00", + X"B2",X"57",X"C3",X"77",X"00",X"B3",X"5F",X"C3",X"44",X"00",X"D3",X"04",X"23",X"7C",X"FE",X"40", + X"CA",X"9D",X"00",X"78",X"2F",X"AE",X"CA",X"98",X"00",X"4F",X"7D",X"E6",X"01",X"79",X"C2",X"96", + X"00",X"B2",X"57",X"C3",X"98",X"00",X"B3",X"5F",X"AF",X"77",X"C3",X"7A",X"00",X"78",X"07",X"47", + X"D2",X"23",X"00",X"7A",X"B3",X"CA",X"CC",X"00",X"EB",X"F9",X"11",X"00",X"20",X"06",X"00",X"21", + X"00",X"00",X"39",X"0E",X"10",X"AF",X"29",X"DA",X"BB",X"00",X"2F",X"12",X"13",X"3E",X"08",X"12", + X"13",X"0D",X"C2",X"B5",X"00",X"05",X"C2",X"AF",X"00",X"C3",X"1A",X"01",X"31",X"00",X"24",X"21", + X"00",X"00",X"11",X"00",X"00",X"0E",X"04",X"AF",X"86",X"D3",X"04",X"23",X"47",X"79",X"BC",X"78", + X"C2",X"D8",X"00",X"E5",X"21",X"1F",X"01",X"19",X"BE",X"3E",X"40",X"CA",X"F7",X"00",X"21",X"00", + X"20",X"34",X"21",X"28",X"01",X"19",X"7E",X"21",X"29",X"20",X"19",X"77",X"E1",X"13",X"0C",X"0C", + X"0C",X"0C",X"3E",X"24",X"B9",X"C2",X"D7",X"00",X"21",X"29",X"20",X"3A",X"00",X"20",X"A7",X"CA", + X"00",X"00",X"11",X"08",X"30",X"3E",X"08",X"CD",X"30",X"01",X"D3",X"04",X"C3",X"1A",X"01",X"00", + X"CA",X"40",X"19",X"47",X"E8",X"B8",X"00",X"BC",X"48",X"48",X"47",X"47",X"46",X"46",X"45",X"44", + X"F5",X"7E",X"23",X"A7",X"FA",X"31",X"01",X"D6",X"30",X"F2",X"4D",X"01",X"47",X"13",X"7B",X"E6", + X"1F",X"C2",X"46",X"01",X"14",X"14",X"04",X"C2",X"3D",X"01",X"C3",X"31",X"01",X"E5",X"D5",X"3C", + X"FE",X"0B",X"FA",X"57",X"01",X"D6",X"06",X"21",X"71",X"01",X"01",X"0A",X"00",X"09",X"3D",X"C2", + X"5D",X"01",X"EB",X"01",X"20",X"00",X"3E",X"0A",X"F5",X"1A",X"13",X"77",X"09",X"F1",X"3D",X"C2", + X"68",X"01",X"D1",X"E1",X"13",X"F1",X"3D",X"C2",X"30",X"01",X"C9",X"3C",X"7E",X"66",X"66",X"66", + X"66",X"66",X"66",X"7E",X"3C",X"18",X"1C",X"18",X"18",X"18",X"18",X"18",X"18",X"3C",X"3C",X"3C", + X"7E",X"66",X"60",X"7C",X"3E",X"06",X"06",X"7E",X"7E",X"3C",X"7E",X"66",X"60",X"38",X"78",X"60", + X"66",X"7E",X"3C",X"66",X"66",X"66",X"66",X"7E",X"7E",X"60",X"60",X"60",X"60",X"3E",X"3E",X"06", + X"06",X"3E",X"7E",X"60",X"66",X"7E",X"3C",X"3C",X"3E",X"06",X"06",X"3E",X"7E",X"66",X"66",X"7E", + X"3C",X"7E",X"7E",X"60",X"70",X"30",X"38",X"18",X"1C",X"0C",X"0C",X"3C",X"7E",X"66",X"66",X"3C", + X"7E",X"66",X"66",X"7E",X"3C",X"3C",X"7E",X"66",X"66",X"7E",X"7C",X"60",X"60",X"7C",X"3C",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"3C",X"7E",X"66",X"66",X"66",X"7E", + X"7E",X"66",X"66",X"3E",X"7E",X"66",X"66",X"3E",X"7E",X"66",X"66",X"7E",X"3E",X"3C",X"7E",X"66", + X"06",X"06",X"06",X"06",X"66",X"7E",X"3C",X"3E",X"7E",X"66",X"66",X"66",X"66",X"66",X"66",X"7E", + X"3E",X"7E",X"7E",X"06",X"06",X"3E",X"3E",X"06",X"06",X"7E",X"7E",X"7E",X"7E",X"06",X"06",X"3E", + X"3E",X"06",X"06",X"06",X"06",X"3C",X"7E",X"66",X"06",X"06",X"76",X"76",X"66",X"7E",X"3C",X"66", + X"66",X"66",X"66",X"7E",X"7E",X"66",X"66",X"66",X"66",X"3C",X"3C",X"18",X"18",X"18",X"18",X"18", + X"18",X"3C",X"3C",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"66",X"7E",X"3C",X"66",X"66",X"76", + X"3E",X"1E",X"1E",X"3E",X"76",X"66",X"66",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"7E", + X"7E",X"C3",X"C3",X"E7",X"E7",X"FF",X"FF",X"DB",X"C3",X"C3",X"C3",X"66",X"66",X"6E",X"6E",X"7E", + X"7E",X"76",X"76",X"66",X"66",X"3C",X"7E",X"66",X"66",X"66",X"66",X"66",X"66",X"7E",X"3C",X"3E", + X"7E",X"66",X"66",X"7E",X"3E",X"06",X"06",X"06",X"06",X"3C",X"7E",X"66",X"66",X"66",X"66",X"66", + X"66",X"7E",X"5C",X"3E",X"7E",X"66",X"66",X"7E",X"3E",X"76",X"66",X"66",X"66",X"3C",X"7E",X"66", + X"06",X"3E",X"7C",X"60",X"66",X"7E",X"3C",X"7E",X"7E",X"18",X"18",X"18",X"18",X"18",X"18",X"18", + X"18",X"66",X"66",X"66",X"66",X"66",X"66",X"66",X"66",X"7E",X"3C",X"66",X"66",X"66",X"66",X"66", + X"7E",X"3C",X"3C",X"18",X"18",X"C3",X"C3",X"C3",X"DB",X"FF",X"FF",X"E7",X"E7",X"C3",X"C3",X"66", + X"66",X"7E",X"3C",X"18",X"18",X"3C",X"7E",X"66",X"66",X"66",X"66",X"7E",X"3C",X"18",X"18",X"18", + X"18",X"18",X"18",X"7E",X"7E",X"60",X"70",X"38",X"1C",X"0E",X"06",X"7E",X"7E",X"C0",X"C0",X"C0", + X"C0",X"C0",X"C0",X"00",X"00",X"C0",X"C0",X"10",X"38",X"38",X"38",X"38",X"38",X"38",X"38",X"38", + X"7C",X"47",X"03",X"51",X"03",X"79",X"03",X"6F",X"03",X"8D",X"03",X"5B",X"03",X"83",X"03",X"65", + X"03",X"97",X"03",X"A1",X"03",X"AB",X"03",X"29",X"03",X"33",X"03",X"3D",X"03",X"1F",X"03",X"89", + X"0E",X"89",X"0E",X"89",X"0E",X"89",X"0E",X"89",X"0E",X"81",X"0D",X"81",X"0D",X"81",X"0D",X"81", + X"0D",X"81",X"0D",X"2B",X"0C",X"2B",X"0C",X"8D",X"0C",X"8D",X"0C",X"C1",X"0C",X"E9",X"0C",X"17", + X"0D",X"3D",X"0D",X"57",X"0D",X"71",X"0D",X"28",X"0B",X"7E",X"0B",X"CB",X"0B",X"F3",X"0B",X"13", + X"0C",X"C1",X"03",X"D6",X"05",X"B5",X"07",X"ED",X"08",X"FD",X"09",X"02",X"04",X"11",X"06",X"D9", + X"07",X"0D",X"09",X"1B",X"0A",X"43",X"04",X"4C",X"06",X"FD",X"07",X"2D",X"09",X"39",X"0A",X"84", + X"04",X"87",X"06",X"21",X"08",X"4D",X"09",X"57",X"0A",X"C5",X"04",X"C2",X"06",X"45",X"08",X"6D", + X"09",X"75",X"0A",X"06",X"05",X"FD",X"06",X"69",X"08",X"8D",X"09",X"93",X"0A",X"47",X"05",X"38", + X"07",X"8D",X"08",X"AD",X"09",X"B1",X"0A",X"88",X"05",X"73",X"07",X"B1",X"08",X"CD",X"09",X"CF", + X"0A",X"A2",X"05",X"89",X"07",X"C5",X"08",X"DD",X"09",X"D6",X"0A",X"BC",X"05",X"9F",X"07",X"D9", + X"08",X"ED",X"09",X"DD",X"0A",X"CD",X"09",X"DD",X"09",X"ED",X"09",X"CF",X"0A",X"D6",X"0A",X"DD", + X"0A",X"03",X"15",X"00",X"05",X"00",X"80",X"0D",X"00",X"80",X"0D",X"00",X"80",X"0F",X"00",X"C8", + X"9F",X"00",X"F8",X"FF",X"00",X"C0",X"17",X"00",X"C0",X"3F",X"00",X"C0",X"7F",X"00",X"C0",X"1F", + X"00",X"80",X"1F",X"00",X"00",X"07",X"00",X"80",X"0F",X"00",X"F8",X"3F",X"00",X"FC",X"7F",X"00", + X"CE",X"FF",X"01",X"C6",X"FF",X"03",X"C6",X"1F",X"17",X"C6",X"1F",X"0E",X"C6",X"1F",X"14",X"FA", + X"3F",X"20",X"03",X"15",X"00",X"05",X"00",X"80",X"0D",X"00",X"80",X"0D",X"00",X"80",X"0F",X"00", + X"C8",X"9F",X"00",X"F8",X"FF",X"00",X"C0",X"17",X"00",X"C0",X"3F",X"00",X"C0",X"7F",X"00",X"C0", + X"1F",X"00",X"80",X"1F",X"00",X"00",X"07",X"00",X"80",X"0F",X"00",X"F8",X"3F",X"00",X"FC",X"7F", + X"00",X"CE",X"FF",X"01",X"C6",X"FF",X"07",X"C6",X"1F",X"1E",X"C6",X"1F",X"70",X"C6",X"1F",X"00", + X"FA",X"3F",X"00",X"03",X"15",X"00",X"05",X"00",X"80",X"0D",X"00",X"80",X"0D",X"00",X"80",X"0F", + X"00",X"C8",X"9F",X"00",X"F8",X"FF",X"00",X"C0",X"17",X"00",X"C0",X"3F",X"00",X"C0",X"7F",X"00", + X"C0",X"1F",X"00",X"80",X"1F",X"00",X"00",X"07",X"00",X"80",X"0F",X"00",X"F8",X"3F",X"00",X"FC", + X"FF",X"01",X"CE",X"FF",X"0F",X"C6",X"1F",X"7F",X"C6",X"1F",X"00",X"C6",X"1F",X"00",X"C6",X"1F", + X"00",X"FA",X"3F",X"00",X"03",X"15",X"00",X"05",X"00",X"80",X"0D",X"00",X"80",X"0D",X"00",X"80", + X"0F",X"00",X"C8",X"9F",X"00",X"F8",X"FF",X"00",X"C0",X"17",X"00",X"C0",X"3F",X"00",X"C0",X"7F", + X"00",X"C0",X"1F",X"00",X"80",X"1F",X"00",X"00",X"07",X"08",X"80",X"0F",X"F0",X"F8",X"FF",X"1F", + X"FC",X"FF",X"0F",X"CE",X"FF",X"00",X"C6",X"1F",X"00",X"C6",X"1F",X"00",X"C6",X"1F",X"00",X"C6", + X"1F",X"00",X"FA",X"3F",X"00",X"03",X"15",X"00",X"05",X"00",X"80",X"0D",X"00",X"80",X"0D",X"00", + X"80",X"0F",X"00",X"C8",X"9F",X"00",X"F8",X"FF",X"00",X"C0",X"17",X"00",X"C0",X"3F",X"00",X"C0", + X"7F",X"00",X"C0",X"1F",X"00",X"80",X"1F",X"C0",X"00",X"07",X"38",X"80",X"0F",X"0C",X"F8",X"FF", + X"0F",X"FC",X"FF",X"03",X"CE",X"FF",X"00",X"C6",X"1F",X"00",X"C6",X"1F",X"00",X"C6",X"1F",X"00", + X"C6",X"1F",X"00",X"FA",X"3F",X"00",X"03",X"15",X"00",X"05",X"00",X"80",X"0D",X"00",X"80",X"0D", + X"00",X"80",X"0F",X"00",X"C8",X"9F",X"00",X"F8",X"FF",X"00",X"C0",X"17",X"00",X"C0",X"3F",X"00", + X"C0",X"7F",X"00",X"C0",X"1F",X"C0",X"80",X"1F",X"70",X"00",X"07",X"3C",X"80",X"0F",X"0F",X"F8", + X"FF",X"03",X"FC",X"FF",X"01",X"CE",X"FF",X"00",X"C6",X"1F",X"00",X"C6",X"1F",X"00",X"C6",X"1F", + X"00",X"C6",X"1F",X"00",X"FA",X"3F",X"00",X"03",X"15",X"00",X"05",X"00",X"80",X"0D",X"00",X"80", + X"0D",X"00",X"80",X"0F",X"00",X"C8",X"9F",X"00",X"F8",X"FF",X"00",X"C0",X"17",X"80",X"C0",X"3F", + X"50",X"C0",X"7F",X"60",X"C0",X"1F",X"30",X"80",X"1F",X"38",X"00",X"07",X"1C",X"80",X"0F",X"0E", + X"F8",X"FF",X"07",X"FC",X"FF",X"03",X"CE",X"FF",X"01",X"C6",X"1F",X"00",X"C6",X"1F",X"00",X"C6", + X"1F",X"00",X"C6",X"1F",X"00",X"FA",X"3F",X"00",X"02",X"0C",X"F0",X"3F",X"F0",X"3F",X"E0",X"3D", + X"C0",X"79",X"C0",X"71",X"C0",X"E1",X"C0",X"E1",X"E0",X"60",X"70",X"70",X"34",X"34",X"38",X"38", + X"F0",X"F0",X"02",X"0C",X"F0",X"3F",X"E0",X"3F",X"C0",X"1F",X"C0",X"1F",X"C0",X"1F",X"00",X"1F", + X"00",X"1E",X"00",X"1C",X"00",X"0C",X"00",X"0D",X"00",X"0E",X"00",X"3C",X"02",X"0C",X"F0",X"3F", + X"F0",X"3F",X"E0",X"1F",X"C0",X"0F",X"80",X"1F",X"00",X"3E",X"C0",X"7D",X"E0",X"78",X"70",X"30", + X"34",X"34",X"38",X"38",X"F0",X"F0",X"03",X"13",X"40",X"01",X"00",X"60",X"03",X"00",X"E0",X"03", + X"00",X"F4",X"17",X"00",X"FC",X"1F",X"00",X"E0",X"02",X"00",X"E0",X"0F",X"00",X"E0",X"03",X"00", + X"E0",X"03",X"00",X"C0",X"01",X"00",X"E0",X"03",X"00",X"FC",X"0F",X"00",X"FE",X"3F",X"00",X"F3", + X"7F",X"00",X"F3",X"E3",X"02",X"F3",X"C3",X"01",X"F1",X"83",X"02",X"FE",X"03",X"04",X"FC",X"07", + X"00",X"03",X"13",X"40",X"01",X"00",X"60",X"03",X"00",X"E0",X"03",X"00",X"F4",X"17",X"00",X"FC", + X"1F",X"00",X"E0",X"02",X"00",X"E0",X"0F",X"00",X"E0",X"03",X"00",X"E0",X"03",X"00",X"C0",X"01", + X"00",X"E0",X"03",X"00",X"FC",X"0F",X"00",X"FE",X"1F",X"00",X"F3",X"7F",X"00",X"F3",X"E3",X"01", + X"F3",X"03",X"07",X"F1",X"03",X"00",X"FE",X"03",X"00",X"FC",X"07",X"00",X"03",X"13",X"40",X"01", + X"00",X"60",X"03",X"00",X"E0",X"03",X"00",X"F4",X"17",X"00",X"FC",X"1F",X"00",X"E0",X"02",X"00", + X"E0",X"0F",X"00",X"E0",X"03",X"00",X"E0",X"03",X"00",X"C0",X"01",X"00",X"E0",X"03",X"00",X"FC", + X"1F",X"00",X"FE",X"FF",X"00",X"F3",X"FF",X"07",X"F3",X"03",X"00",X"F3",X"03",X"00",X"F1",X"03", + X"00",X"FE",X"03",X"00",X"FC",X"07",X"00",X"03",X"13",X"40",X"01",X"00",X"60",X"03",X"00",X"E0", + X"03",X"00",X"F4",X"17",X"00",X"FC",X"1F",X"00",X"E0",X"02",X"00",X"E0",X"0F",X"00",X"E0",X"03", + X"00",X"E0",X"03",X"00",X"C0",X"01",X"01",X"E0",X"03",X"1E",X"FC",X"FF",X"03",X"FE",X"FF",X"03", + X"F3",X"0F",X"00",X"F3",X"03",X"00",X"F3",X"03",X"00",X"F1",X"03",X"00",X"FE",X"03",X"00",X"FC", + X"07",X"00",X"03",X"13",X"40",X"01",X"00",X"60",X"03",X"00",X"E0",X"03",X"00",X"F4",X"17",X"00", + X"FC",X"1F",X"00",X"E0",X"02",X"00",X"E0",X"0F",X"00",X"E0",X"03",X"00",X"E0",X"03",X"0C",X"C0", + X"81",X"03",X"E0",X"C3",X"00",X"FC",X"FF",X"00",X"FE",X"3F",X"00",X"F3",X"0F",X"00",X"F3",X"03", + X"00",X"F3",X"03",X"00",X"F1",X"03",X"00",X"FE",X"03",X"00",X"FC",X"07",X"00",X"03",X"13",X"40", + X"01",X"00",X"60",X"03",X"00",X"E0",X"03",X"00",X"F4",X"17",X"00",X"FC",X"1F",X"00",X"E0",X"02", + X"00",X"E0",X"0F",X"00",X"E0",X"03",X"00",X"E0",X"03",X"06",X"C0",X"C1",X"03",X"E0",X"F3",X"00", + X"FC",X"3F",X"00",X"FE",X"1F",X"00",X"F3",X"0F",X"00",X"F3",X"03",X"00",X"F3",X"03",X"00",X"F1", + X"03",X"00",X"FE",X"03",X"00",X"FC",X"07",X"00",X"03",X"13",X"40",X"01",X"00",X"60",X"03",X"00", + X"E0",X"03",X"00",X"F4",X"17",X"00",X"FC",X"1F",X"00",X"E0",X"02",X"04",X"E0",X"8F",X"06",X"E0", + X"03",X"03",X"E0",X"83",X"03",X"C0",X"C1",X"01",X"E0",X"E3",X"00",X"FC",X"7F",X"00",X"FE",X"3F", + X"00",X"F3",X"1F",X"00",X"F3",X"03",X"00",X"F3",X"03",X"00",X"F1",X"03",X"00",X"FE",X"03",X"00", + X"FC",X"07",X"00",X"02",X"0A",X"F8",X"07",X"70",X"0F",X"70",X"0E",X"70",X"1C",X"30",X"1C",X"38", + X"0C",X"1C",X"0E",X"0C",X"06",X"0E",X"07",X"3C",X"1E",X"02",X"0A",X"FC",X"03",X"F8",X"03",X"F0", + X"03",X"F0",X"03",X"C0",X"03",X"C0",X"03",X"80",X"03",X"80",X"01",X"C0",X"01",X"80",X"07",X"02", + X"0A",X"FC",X"03",X"F8",X"01",X"F0",X"00",X"E0",X"01",X"C8",X"03",X"9C",X"07",X"0E",X"07",X"06", + X"03",X"87",X"03",X"1E",X"0F",X"02",X"11",X"50",X"00",X"D8",X"00",X"F8",X"00",X"FE",X"03",X"B8", + X"00",X"F8",X"01",X"F8",X"00",X"60",X"00",X"F0",X"00",X"FC",X"03",X"FE",X"07",X"FF",X"06",X"F9", + X"0C",X"F9",X"18",X"F9",X"20",X"FE",X"01",X"FE",X"01",X"02",X"11",X"50",X"00",X"D8",X"00",X"F8", + X"00",X"FE",X"03",X"B8",X"00",X"F8",X"01",X"F8",X"00",X"60",X"00",X"F0",X"00",X"FC",X"03",X"FE", + X"0F",X"FF",X"3C",X"F9",X"60",X"F9",X"00",X"F9",X"00",X"FE",X"01",X"FE",X"01",X"02",X"11",X"50"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/spram.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/sprom.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/sprom.vhd new file mode 100644 index 00000000..a81ac959 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Boothill_MiST/rtl/sprom.vhd @@ -0,0 +1,82 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_aclr_a : STRING; + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/BowlingAlley.qpf b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/BowlingAlley.qpf new file mode 100644 index 00000000..e03e4c0b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/BowlingAlley.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 16:15:41 June 05, 2019 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "16:15:41 June 05, 2019" + +# Revisions + +PROJECT_REVISION = "BowlingAlley" diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/BowlingAlley.qsf b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/BowlingAlley.qsf new file mode 100644 index 00000000..872504f6 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/BowlingAlley.qsf @@ -0,0 +1,171 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 13:13:10 June 05, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Invaders_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/BowlingAlley_mist.sv +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/BowlingAlley_memory.sv +set_global_assignment -name VHDL_FILE rtl/sprom.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name QIP_FILE ../../../../common/mist/mist.qip + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY BowlingAlley_mist +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== + set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# --------------------------- +# start ENTITY(Invaders_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top + set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top + set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Invaders_mist) +# ------------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/BowlingAlley.sdc b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/BowlingAlley.sdc new file mode 100644 index 00000000..f91c127c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/BowlingAlley.sdc @@ -0,0 +1,126 @@ +## Generated SDC file "vectrex_MiST.out.sdc" + +## Copyright (C) 1991-2013 Altera Corporation +## Your use of Altera Corporation's design tools, logic functions +## and other software and tools, and its AMPP partner logic +## functions, and any output files from any of the foregoing +## (including device programming or simulation files), and any +## associated documentation or information are expressly subject +## to the terms and conditions of the Altera Program License +## Subscription Agreement, Altera MegaCore Function License +## Agreement, or other applicable license agreement, including, +## without limitation, that your use is for the sole purpose of +## programming logic devices manufactured by Altera and sold by +## Altera or its authorized distributors. Please refer to the +## applicable agreement for further details. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition" + +## DATE "Sun Jun 24 12:53:00 2018" + +## +## DEVICE "EP3C25E144C8" +## + +# Clock constraints + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty + +# tsu/th constraints + +# tco constraints + +# tpd constraints + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + + + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] + +#************************************************************** +# Create Generated Clock +#************************************************************** + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + +#************************************************************** +# Set Input Delay +#************************************************************** + +set_input_delay -add_delay -clock_fall -clock [get_clocks {CLOCK_27}] 1.000 [get_ports {CLOCK_27}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {CONF_DATA0}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DI}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SCK}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}] + +#************************************************************** +# Set Output Delay +#************************************************************** + +set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_L}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_R}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {LED}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {VGA_*}] + +#************************************************************** +# Set Clock Groups +#************************************************************** + +set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}] + +#************************************************************** +# Set False Path +#************************************************************** + + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + +set_multicycle_path -to {VGA_*[*]} -setup 2 +set_multicycle_path -to {VGA_*[*]} -hold 1 + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/README.txt b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/README.txt new file mode 100644 index 00000000..7f6452b7 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/README.txt @@ -0,0 +1,26 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Bowling Alley port to MiST by Gehstock +-- 05 June 2019 +-- +--------------------------------------------------------------------------------- +-- +-- Midway 8080 Hardware +-- Audio based on work by Paul Walsh. +-- Audio and scan converter by MikeJ. +--------------------------------------------------------------------------------- +-- +-- +-- Keyboard inputs : +-- +-- F1 : Start +-- SPACE : Fire +-- RIGHT/LEFT : Movement +-- +-- Joystick support. +-- +-- +--------------------------------------------------------------------------------- +ToDo: Color Prom + Controls + DIP + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/Snapshot/BowlingAlley.rbf b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/Snapshot/BowlingAlley.rbf new file mode 100644 index 0000000000000000000000000000000000000000..23ba85871cf31c3a3a5d296a6712db686cd6f2af GIT binary patch literal 245721 zcmeFa3wR_~b?;kUQzL}q*xfxPAqXFLadVl=b} z&-eibLQbyLa?4Ck3^w3PUL<4t+TasHYz%pPHzXdDF^`1AhCt%vn8x=&qfo zoyb-A`ho6icN@#^^S1Kz5J-SLT~|G?7lfx9a{Q}Z^Y-$5)m58$x~}V`LFKz?(0z`7 zwQJs9p07H>lcyi=HOF_X*Swv)yyy_*b1+Xo+I6+^O3z_A4y7w?`E?%X19Y_kl@U$4 z3Y4}S(wxQ5<@tJE%uVllm08Y@*v2)ygP6$KR_=o-bYq@-pIuAkP;L zJzoTfCf#>~(gaFN@6!88pu3##2lBTEOXm^7Sk^UJE7w z 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 fm>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac dac ( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +wire m_up = ~status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_up | joystick_0[3] | joystick_1[3]; +wire m_down = ~status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_down | joystick_0[2] | joystick_1[2]; +wire m_left = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_left | joystick_0[1] | joystick_1[1]; +wire m_right = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_right | joystick_0[0] | joystick_1[0]; +wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; +wire m_bomb = btn_fire2 | joystick_0[5] | joystick_1[5]; +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_left = 0; +reg btn_right = 0; +reg btn_down = 0; +reg btn_up = 0; +reg btn_fire1 = 0; +reg btn_fire2 = 0; +reg btn_fire3 = 0; +reg btn_coin = 0; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h75: btn_up <= key_pressed; // up + 'h72: btn_down <= key_pressed; // down + 'h6B: btn_left <= key_pressed; // left + 'h74: btn_right <= key_pressed; // right + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h14: btn_fire3 <= key_pressed; // ctrl + 'h11: btn_fire2 <= key_pressed; // alt + 'h29: btn_fire1 <= key_pressed; // Space + endcase + end +end + +endmodule diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T8080se.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T8080se.vhd new file mode 100644 index 00000000..65b92d54 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T8080se.vhd @@ -0,0 +1,194 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80_ALU.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80_ALU.vhd new file mode 100644 index 00000000..e09def1e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80_ALU.vhd @@ -0,0 +1,361 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80_MCode.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80_Pack.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80_Reg.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/T80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/dac.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- Refer to Xilinx Application Note XAPP154. +-- +-- This DAC requires an external RC low-pass filter: +-- +-- dac_o 0---XXXXX---+---0 analog audio +-- 3k3 | +-- === 4n7 +-- | +-- GND +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/invaders.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/invaders.vhd new file mode 100644 index 00000000..0a4a7814 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/invaders.vhd @@ -0,0 +1,283 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaderst is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire : in std_logic; + Fire2 : in std_logic; + MoveLeft : in std_logic; + MoveRight : in std_logic; + DIP : in std_logic_vector(7 downto 0); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0); + SoundCtrl5 : out std_logic_vector(5 downto 0); + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic + ); +end invaderst; + +architecture rtl of invaderst is + + component mw8080 + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); + end component; + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal GDB3 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(6 downto 2); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; +begin + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; + + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; + if WD_Cnt = 255 then + Rst_n_s_i <= '0'; + end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then + WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then + if Sounds(0) = '1' and Old_S0 = '0' then + WD_Cnt <= WD_Cnt + 1; + end if; + if PortWr(6) = '1' then + WD_Cnt <= (others => '0'); + end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: mw8080 + port map( + Rst_n => Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + Video => Video, + HSync => HSync, + VSync => VSync); + + with AD_i(9 downto 8) select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + GDB3 when "11"; +-- S when others; + + GDB0(0) <= '0'; -- Language + GDB0(1) <= '0'; -- Language + GDB0(2) <= '0'; -- Demo_Sounds + GDB0(3) <= '0'; -- Game_Time + GDB0(4) <= '0'; -- Coinage + GDB0(5) <= '0'; -- Difficulty + GDB0(6) <= '1'; -- Cabinet + GDB0(7) <= '1'; -- Unused + + GDB1(0) <= not Coin;-- Active High ! + GDB1(1) <= not Fire; + GDB1(2) <= not Sel1Player; + GDB1(3) <= not Fire2; + GDB1(4) <= '1'; -- + GDB1(5) <= '1'; -- + GDB1(6) <= '1'; -- + GDB1(7) <= '1'; -- Unused ? + + GDB2(0) <= '1'; -- TRACKBALL Y + GDB2(1) <= '1'; -- TRACKBALL Y + GDB2(2) <= '1'; -- TRACKBALL Y + GDB2(3) <= '1'; -- TRACKBALL Y + GDB2(4) <= '0'; -- TRACKBALL Y + GDB2(5) <= '0'; -- TRACKBALL Y + GDB2(6) <= '0'; -- TRACKBALL Y + GDB2(7) <= '0'; -- TRACKBALL Y + + GDB3(0) <= '1'; -- TRACKBALL X + GDB3(1) <= '1'; -- TRACKBALL X + GDB3(2) <= '1'; -- TRACKBALL X + GDB3(3) <= '1'; -- TRACKBALL X + GDB3(4) <= '0'; -- TRACKBALL X + GDB3(5) <= '0'; -- TRACKBALL X + GDB3(6) <= '0'; -- TRACKBALL X + GDB3(7) <= '0'; -- TRACKBALL X + + PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; + PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; + PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; + PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; + PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + OldSample := '0'; + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0); + end if; + if PortWr(4) = '1' and OldSample = '0' then + D5(15 downto 8) <= DB; + D5(7 downto 0) <= D5(15 downto 8); + end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0); + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/invaders_audio.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/mw8080.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/mw8080.vhd new file mode 100644 index 00000000..b9a88f96 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/mw8080.vhd @@ -0,0 +1,336 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n, Rd_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/pll.qip b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/pll.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/pll.vhd new file mode 100644 index 00000000..f8d0b139 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/pll.vhd @@ -0,0 +1,382 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + sub_wire2 <= sub_wire0(1); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + c1 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 20, + clk1_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire4, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "20.000000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "ps" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "20" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "20.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK1 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "20" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/d.cpu.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/d.cpu.hex new file mode 100644 index 00000000..3bf22e70 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/d.cpu.hex @@ -0,0 +1,129 @@ +:10000000C03AAC22B7CAA7402139222200223A19AD +:100010002257FE01CA7740060A48592200223E0FA5 +:10002000CDC8007EB8F2294047237EB9F230404F58 +:10003000237EBBF237405F3E12CD184315C21B40F2 +:100040007B3225221E0FCD2845C26540411CCD289C +:1000500045C265401C3A252247CD2845C26540CDA2 +:100060000745C3A7403A1922572139222200227B93 +:10007000CD1B43B8CA9A403E06CD18433AAC2286FF +:100080003212203E923214203E0C3210203E0432B6 +:100090001F20C5D5CDE90001D1C13E12CD184315B1 +:1000A000C26C40AF32AC223A9222B7F2BD40210E70 +:1000B00033221622118309CDB303C345053A3722F3 +:1000C0003C323722FE0BCA45053D0707C688321071 +:1000D000203E2A3212203E9F3214203E04321F203E +:1000E000CDE900013A1020C604321020CDE900010C +:1000F000AF323622213922228122CDD1433A372212 +:10010000FE0ACA3141FE05C216413A9222B7C21D0B +:10011000413E01C348413A9222B7CA9D13210E3392 +:10012000221622118309CDB3033EFF329222C39DD2 +:1001300013211511CD4042219B22229822AF329AE1 +:10014000223EB0328B223E0932AC22210E0ACD4132 +:1001500044CD0745C39D133A342221302032032277 +:100160002200203E0FCD50023621CDEC003E10CDB6 +:1001700050023A03223DC25D41C9AF321122D3047D +:100180003A1122FE02DA7E41AF321122C9D5CDD515 +:1001900041D12A81223E01CDC8000602131A86FEF3 +:1001A0000AFAA941D60A23342B772305C29C41C3FE +:1001B000D541F5CDD541F12A81228623FE0AFAC721 +:1001C0004134D60AC3BC412B77237EFE0AFAD541BF +:1001D000D60A7723342A81223E06CDC8007EC60483 +:1001E0003212203EBF3214203E04321F20AF3207AD +:1001F000220103002A8122097EB7C204423A072263 +:10020000B7CA15427E0707C624320722321020C51E +:10021000CDE90001C11114201AD608120DF8C2F45C +:10022000413E01320722C3F4413E123212203ECA3F +:10023000321420228122CDE841213922228122C993 +:10024000111020AF321F2006057E1223131305C2A2 +:1002500049427E1B1223221C20CDE900013A1220C4 +:100260002116208632122023233A142086321420AD +:100270002335C25942D3042A1C207EFEFFC24042CD +:10028000C9EBCDC8004E2100000DFA914219C38977 +:10029000420E047CB7F29942371F677D1F6F0DC273 +:1002A0009342C9F5CD18434E2346F1D60BCD1843E2 +:1002B0007E8177237E8877C9F52A0422CDC8005E27 +:1002C0002356F1CD1843935F237E9A572100000DEA +:1002D000FAD74219C3CF423A2522B7F07C2F677D67 +:1002E0002F6F23C9320A222A00222200200600CDC5 +:1002F000C8005E23567AB7FAFF4205792F4F03EB09 +:1003000009EB722B730E02EBCD9342EB3A0A22C635 +:1003100007CD5002732372C92A0022856FD2214370 +:10032000247EB7C97CB7CA3543FEFFC07DFEF0D836 +:100330002600C339437DFE10D02E003A03223C3202 +:100340000322C93A8822B7C83A8322B7C02187223C +:1003500035F036102A84223A862207B7F263432109 +:100360005F450701050009228422328622F680D3E8 +:10037000077E32E420CDE9000E3E0532EF20C9F5BC +:10038000CD96432A81223E07CDC8000603F14E7761 +:10039000237905C28E432A81223E06CDC8007E3CC9 +:1003A0003212203E9D3214203E04321F203E023283 +:1003B0000322232289227E321020CDE900012A89DE +:1003C000223A1220C6083212203A03223DC2AF431D +:1003D000C9CDDA43C3E443CDE4433EB23214203EF8 +:1003E00078C3EB433E943214203E7C3210202A81A5 +:1003F000223E06CDC8007ED6073212203E04321FB0 +:1004000020CDE90001C93EB23214203E80C3EB4347 +:100410002A8E22CD4144214009228E22C9218D22DB +:1004200035F036103A0922EE01320922CDD541CD00 +:10043000E443C9214022713E12CDC80005C23644B2 +:10044000C9228E22EB214A33221622CDB303C921C1 +:100450000E3322162211B0093A8822B7CA6244111B +:10046000D009CDB303CD1507C315072A98223A9EAC +:10047000227723229822219A22343210203E0532FC +:1004800012203A8B22321420D608328B223E0432BC +:100490001F20CDE90001C921B145C3A04421A345D6 +:1004A0003E0532A92222AA223EFF32A82221A922F9 +:1004B00035FACA442AAA22EB2122201A77132323D1 +:1004C0001A7713EB22AA22C3DA1A2AAA227E32381A +:1004D00020237E323920237E324820237E32492059 +:1004E000AF32A822D308D30AC3F3162A8122E5210A +:1004F000AD222281223E283212203E67321420CDC6 +:10050000E841E1228122C93A19224F2139222200F1 +:10051000223E0FCDC80036002336002336003E129F +:10052000CD18430DC20E45C92139223A1922577BF5 +:10053000CDC8007EB8C03E1293CDC80015C22F456D +:10054000C911580B21670B3A9422B7CA4F45EBE506 +:1005500021DC3F221622CDB30311220BCDB303D1F0 +:10056000CDB303C976000201016D000402026400EC +:100570000503035B0007050552000503034900045A +:100580000202400002010120FDEAFE48FB60FE205D +:10059000FD00FF00FAD8FE00FEC0FE70FCF0FE4831 +:1005A000FAA0FF1B301A2F182E162D142C00010351 +:1005B000001B6C1A6D186E166F1470FE000001752A +:1005C0006E6420474C4F42414C1D556E61626C6514 +:1005D00020746F2061737369676E20494E434C55D8 +:1005E00068452066696C6521526567697374657238 +:1005F0002065787072657373696F6E206973206E01 +:10060000CA56143A1522B7C25614C35414616C6901 +:100610006420726567697374657220706169722203 +:10062000526567697374657220657870726573735B +:10063000696F6E2067726561746572207468616E9F +:1006400020371A4D697373696E67206F7220696E67 +:1006500076616C6964206F706572616E64CA424F26 +:100660004C574F4225000009000006010000000021 +:10067000BE45C8D441524353FB0F0100200000C8BF +:1006800043414DD50F0100000000D9414C50B0024C +:100690000100240000CB43415453A8210100240051 +:1006A00000D4554F48538C030102000000CE494846 +:1006B000530A0F0101000000D254434853150F01A3 +:1006C00001000000D250575354B421010200000031 +:1006D000D34D5753542D0F0180000000C3534D4F8D +:1006E00052CD1E010C320000DA4953504843EE0F40 +:1006F0000100040000C44154534C2D0201FF1F00AF +:1007000000B04A424F750F0100200401C3454A4220 +:100710004F810F0100200401CF4E4A424FD33401D4 +:1007200002200401D443434D4C320105200401C38F +:100730004353D42E0107200401D4554F444E53E0B7 +:10074000170108200401CC5648444C4FBD0F010945 +:10075000200401CC5656444C4FD015010C20040106 +:10076000D44243454D57340102000000D2544E4359 +:100770004DC90F0105000000D25057534E43FF00F2 +:100780000104000000CB53414D43E20F0101000082 +:1007900000CE454552435361210100240000C4416D +:1007A000564D4711010F210401D354494253960F6E +:1007B0000111210401D4455345522D2E010000049E +:1007C00001C35653544E4977120110000401B1562B +:1007D00053544E492B100136000401B1544F4D497A +:1007E000548F260153000401D454414D49549B3782 +:1007F000015A000401C54C504D4153191B016400BE +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/e.cpu.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/e.cpu.hex new file mode 100644 index 00000000..2d1a15fc --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/e.cpu.hex @@ -0,0 +1,129 @@ +:10000000CA051816043E09856F7EFEFECA3518B76C +:10001000C277183E0ECDA34282FE34D22318362674 +:10002000C32A18FE7BDA3518367F7AFE02CA5318C7 +:100030001EFEC36D183E0CCDA3424F82FE10D24669 +:10004000183602C353183A3322B7CA771879FE5CC0 +:10005000DA77181EFD0E013E0506042A0022856F80 +:1000600036002305C260183E0C0DCA59183E09D34C +:100070000A2A0022856F732A00227EFE6CC29F1816 +:100080003AA822B7CA9F1823237EFE1BC29C1823BE +:10009000237EFE72CA9744FE30CA9D442A00220184 +:1000A0001000093A03223DC2F5172120203A02220E +:1000B0003203222200223DCAD31A3208223E098589 +:1000C0006F7EB7FAC41A2A002232072201100009F3 +:1000D0002204223A0722473E09856F7EB7FAB71AF3 +:1000E000A0C2B71A3209222A042223234623234E10 +:1000F0002A002216097ED64CCAFF183E02160B3281 +:100100002E222323869047322422F216192F3C47B1 +:100110003E0132092278322C22BAD2B71A7A322F13 +:100120002223235621B01178856FD22E19245E3AEE +:100130002E2282914F322522F247192F3C4F3A0945 +:1001400022EE0132092279212F22BED2B71A322D96 +:10015000227E21AF11856FD25B19247EC6025779AA +:1001600021B011856FD26919247E83BAD2B71A3EA5 +:1001700007CDB842220F22EB220D22483A24223228 +:1001800025223E05CDB842EB220B222A0F22197CF4 +:10019000B7CA9719F2C41A2A04223E09CDC8007EB4 +:1001A000FE013600CAB1193E09CD1843FE01C2C393 +:1001B000193A2E22B7CABF19D308D30AC3C319D319 +:1001C00009D30A3E09CD184336002A0B22118011AB +:1001D0003A2E22B7CAE81978FE09FAE5193A2D2213 +:1001E000D60E2F3C4711921178CD8142220F221159 +:1001F00089113A2E22B7CAFC1911A111782A0D22B1 +:10020000CD8142EB3E05320A223283223A0922B7DF +:10021000CA1A1A7B2F5F7A2F57132A0F2219220F1F +:1002200022EB2A04223A0A22220020856F7E83775D +:100230005F237E8A7757CD05432A0F223A2E22B7B5 +:10024000CA5C1A3A0A22FE07C27C1A0E017CB7F277 +:10025000531A371F677D1F6F0DC24D1AEB2A0022FC +:100260002200203A0A22856F7E93775F237E9A7759 +:1002700057CD05433A0A22FE07CAB71A2A0D223A79 +:100280002E22B7CA8E1A3E0E119211C3931A1180F4 +:10029000113E0890CD8142220F223E07320A222AC7 +:1002A0000B221189113A2E22B7CAAF1A11A1117867 +:1002B000CD8142EBC30C1A2A04223A08223D3208AF +:1002C00022C2CC180110002A0022093A03223DC3A1 +:1002D000B0182B3A06223DC2EC17D3043A1122FE85 +:1002E00001DADA1A3A2220070707E607D306AF3207 +:1002F00011222120202200203E09CD5002B7C21930 +:100300001B3E06CD50021100FFB7F2111BBAC219F5 +:100310001B722B733E06CD05432120203A02222278 +:1003200000222200203203223E09CD1843CA3C1B82 +:10033000FEFECA3C1BFEFDC2A01B36FF2346234E19 +:100340002A00227EFE4CCA701B23237EB8C2571B94 +:1003500023237EB9CAA01B78FE58D2751B3A3422DB +:100360003C3202223233222A00227EFE6CCA751BE6 +:100370001621C3771B16053E0FCD1843F572CDEC41 +:10038000003E0FCD1843FE21C29E1B36042A0022D8 +:100390007EFE68C2981B3E48C60477C37E1BF17779 +:1003A0003E10CD18433A03223DC21F1BCD4343C329 +:1003B000F3163E05322F20CDE900020610CD7A411A +:1003C00005C2BD1B3A8822B7CAEC1B3A9622B7C2B7 +:1003D000EC1B3A1222B7C2E01B3A8322B7CAEC1BCD +:1003E0003E2132EF20329622CDE9000E2122203626 +:1003F0000123233625CD5741210E11CD4042CD7A20 +:1004000041212020220020CDEC003E0A320822AFFC +:10041000322E223A34224F3238222130201130201D +:100420003203222200203E09CD5002FE01C25B1C95 +:10043000D5C5CDEC00C1D1060F2A00207E122313B2 +:1004400005C23C1C3E0512133A0822FE0ACA5C1C77 +:10045000FE07CA5C1C322E22C35C1C0D3E10CD5020 +:10046000023A08223D3208223A03223DC2201C797A +:10047000FE02C2811C3A2E22B7C2811C3E0132A864 +:10048000223A1522B7CA8E1C2139222281222A81C2 +:10049000223E05CDC80079323422B7CAA31C3600EB +:1004A000C3F91C3A1222B7CABA1C360021A0083E72 +:1004B00024D30F3E20D306C3CF1C7EFE05CAC21C28 +:1004C0003C3421C11123233DC2C51C5E2356EBCD14 +:1004D00041443A8822B7CAF91C2A84223A1222B728 +:1004E000CAE51C232323EB21AD223600231A7723F0 +:1004F000131A77233600CDEB44CD7A412A81223A74 +:100500003522C60FCDC8003A3422473A38229077B8 +:10051000AFD3062A81223E05CDC8007EB7CA421D50 +:100520003E12D30FF33A0820F620D305320820FB01 +:10053000CD7A41CD7A41F33A0820E6DF320820D364 +:1005400005FB3E08D3063E0432DF203E3532D42080 +:100550003E3732D2203E1432D020CDE9000D212288 +:10056000207EC60477FEF3D29A1DFED0DA721DAF4C +:10057000D306CDE90002CD7A413AD220FE07CA5E09 +:100580001D3E1032D020CDE9000D3AD220D60132E6 +:10059000D220FE07C2521DC35E1D3A8822B7CAA8E8 +:1005A0001D3A3422B7CCEB44CD10443A1522B7CAD9 +:1005B0002B1E3A3422B7CACA1D3A1222B7C2C71D2F +:1005C0003C321222C38614CD57413A9122B7CAF168 +:1005D0001DF33A0820E604C2E51DF604320820D3D4 +:1005E00005FBC3F11DE6FB320820D305FBAF3291BA +:1005F00022CD4F443A8822EE01328822CD43073A79 +:100600008822B7CA1A1E3E0432EF2021A022CD292B +:100610004221A422CD2942C39D13D30721A422CD78 +:10062000294221A022CD2942C39D13213522343AEB +:100630003422473A3822904F3A1222B7CA541E3A0F +:100640003422B7CA541ECD7A413A3722FE0ACA5420 +:100650001ECD57413A3422473A382290473E0A2A63 +:100660008122CDC8007EB7CAAB1E237886772B3592 +:10067000CA781E2323C3651EE5C5237ECDB241CDB6 +:1006800096432A81223E09CDC8007EFE20C2941ED8 +:100690002BC38A1E3620CD9643C1E1545D13131A35 +:1006A00077AF1223131A772BC3651E2225223A3403 +:1006B00022B7CAF41E3A1222B7C2D31E3C3212220B +:1006C0003A3722FE0AC286143A3522FE03C2861445 +:1006D000C3621F3E20CD7F433A3522FE03CA621F0C +:1006E0003E0A21342296CDB2413A3722D60AC28739 +:1006F0001FC3621F3A1222B73E18CAFF1E3E1C32A9 +:100700009E22CD7F433A12224F3A3722FE0AC21A66 +:100710001FAF321222C5CD6B44C13A8822B7CA3905 +:100720001F2A84220DC22A1F2323EBCD8D413A3587 +:1007300022FE03CA621FC3511F3A3522FE03CA625A +:100740001F2A252236010DCA4B1F3423360A2336B1 +:10075000003A3722FE0AC2871F210909CD4144C34E +:10076000E9133A3422B7CA6F1FCD7A41CD57413AC7 +:100770003522FE03C2871F3A8822B7CA871F3E0A66 +:1007800021342296CDB241CDD743CD41453A3722CF +:10079000FE0AC2CE1F219B222298223E0532122041 +:1007A0003E04321F203EB0328B223214203A9A226D +:1007B0003DFACE1F329A227E32102023222522CDEE +:1007C000E900012A25223A1420D608C3AA1FAF3215 +:1007D0003522213622343A1922BECA01402A81220A +:1007E0003E12CDC800228122CDD143C39D13643770 +:1007F00023EB2B732372EB11E905CD2437D20620AE +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/f.cpu.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/f.cpu.hex new file mode 100644 index 00000000..952f245b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/f.cpu.hex @@ -0,0 +1,129 @@ +:10000000010101010101010101010101FF01FF1FC6 +:10001000011001100110FD1705140514FD17011042 +:1000200001100110FF1F00000000001C001400144C +:10003000FF170110011001100110FD170514051420 +:10004000071C3C247F7D7D7D7F00D034000318FF9A +:1000500000002400016800103400014800FF240063 +:10006000016804002408002004008B08002004110B +:100070003408001804117B08001800D02400011176 +:1000800000D07B00011100289C00014200389C0038 +:10009000014204289C0800020428DD0800028C2A82 +:1000A0009F000001842EBF000001744A9C000001E3 +:1000B0008C4ECA000001244EA70000017843B20014 +:1000C0000001FF74749C0000019078CA00000124B4 +:1000D00078A7000001786DB2000001FF749E9C00BB +:1000E000000194A2CA00000124A2A7000001789791 +:1000F000B2000001FF74C89C00000198CCCA000047 +:100100000124CCA700000178C1B2000001FF081152 +:1001100035000146FF00009C00014200109C0001D8 +:100120004204019C0800020401DE0800028802C8A3 +:10013000000001840BC0000001B4049F000803FF0D +:100140004040404040404040043332313141414121 +:10015000042333323231313104132333323232311A +:100160000413232333323232041413232333323261 +:10017000041413232323333204141313232332339D +:1001800000010205080B0E0F100003060708070602 +:10019000030000000102030506080A0C0D0E0F10F3 +:1001A00010000203050607080808070605030200F9 +:1001B00000010409101924314051640102004B4A26 +:1001C000749EC88F0ABC0AED0A000B140B5E3E0435 +:1001D000322F2021E03F2D3600C2D611D304257CDA +:1001E000FE23C2D611C9CDCE112110201610360023 +:1001F0002315C2EE113E7032E0203E6232E2203E14 +:100200000432EF20AF328322329F223A902232888A +:1002100022214910CD4042215010CD4042232204DA +:10022000223A1922FE04CA51122A13223A07204701 +:100230007E90323022CA3B12F25112789632072059 +:100240003A19223C3219222A04223DCA2912C31A21 +:10025000123A1922B7C27B123A0720B7C27B123C6E +:10026000321522CDA50621603F118D07221622CD21 +:10027000B30321A022CD2942C39D13CDA506D304EB +:100280003A9F22B7C2C712DB04E608219322BECAF6 +:10029000C71277B7CAC212CD59073A8822EE013287 +:1002A0008822B7C2B412D3073E2132EF20CDE90035 +:1002B0000EC3BF123E0432EF20218722CD5243CD20 +:1002C00043073E06329F223A1122B7CADE12AF32EE +:1002D0001122219F227EB7CADB1235CD43433A1942 +:1002E000224FB7CAF312DB04E604C2071379FE04F7 +:1002F000CA7E122A13223A0720477E90473A3022BC +:10030000B8CA7E12C32912F33A0820F60432082034 +:10031000D305FBCD2C07214910CD4042215010CDF3 +:1003200040423A8C22E6F7328C22D30E2139222227 +:1003300081223A19224711BF110E007123712371D6 +:10034000237123712371231A771323362023362038 +:1003500023362023713E08CDC80005C23B13AF32BF +:10036000362232152232352232922232952232AC96 +:10037000223C323722CDD14321BD11DB02E608CA2F +:1003800089133A1922233297227E3228223A882270 +:10039000B7CA9D133E2132EF20CDE9000EAF3212D5 +:1003A0002232A8223A1522B7C2E9132A81223E043A +:1003B000CD1B433294220604B7CABE1306023A8C00 +:1003C00022E6F9B0328C22D30ECD4145DB02E64065 +:1003D000CAE9133A362217171717E610F321082037 +:1003E000477EE6EFB077D305FBAF32832232962209 +:1003F0003A8822B7CA05143E0432EF20CDE9000E38 +:100400003E0532EF203E0A323422213020017212A2 +:1004100016003E0432032278323222793231223AF7 +:100420000322320822364C23722370237223712355 +:100430003E0472233DC2321436011E0619360423CF +:1004400079D6144F3A08223DC222140610DB02E688 +:1004500020C30046060E3A322280473A3122D60A9D +:100460004F3A03223DC214142130203A3422320282 +:1004700022220020CDEC003E0FCD50023605233A5B +:1004800002223DC26E14AF3233223C320222AF321E +:100490002B22212020220020220022366C2A00203C +:1004A0002336002336F3233600233663CDEC003E9B +:1004B00005322F203A1522B7CAE0142A1A223A1C14 +:1004C000223DF2CA142183453E0601040009221A86 +:1004D00022321C223A0720B7C25306EBC3D7168438 +:1004E0003A2B22B7C209153E09D30FF33A0820F67A +:1004F00001320820D305FBCD7A41F33A0820E6FE0D +:10050000320820D305FBC37115CDEC0021BB08CD0B +:100510004144F33A0820F608320820D305FB3E0593 +:10052000320322FE04C228151120003E4621BA2AB9 +:100530003600193DC23015321122D3043A1122FE81 +:1005400004C23A15214910CD4042AF321122D304E2 +:100550003A1122FE04C24E153A03223DC22015F381 +:100560003A0820E6F7320820D305FB2A00222200B1 +:10057000203A2322FEFFF28915D3043A1122B7CA8A +:100580007915AF321122C37115AF320922328D2293 +:10059000320822329F22CDEC00CD1D44CD43432AA8 +:1005A0000022220020AF321122D3043A9F22B7C288 +:1005B0002516DB02E640CAD61506103A36220FDAB7 +:1005C000C4150602DB04A0CACC153E01219422BE4C +:1005D000CA2516C3EB15DB04E602219522BECA2507 +:1005E0001677B7CA25163A9422EE01F5CD4145F1AA +:1005F000329422CD41453A1222B7C209162A8122ED +:100600003E04CDC8003A9422773A8C22E6F94F3A5C +:100610009422B73E04CA1A163E02B1D30E328C227F +:100620003E06329F223A1122B7CAA915219F227E87 +:10063000B7CA3516353A0822B7CA5C163C320822CA +:10064000FE0CCAB1162A1E223A2322BCFA5C16C23C +:10065000B1163A2222BDFA5C16C2B1162A00202336 +:100660004E2346EB2A2222221E22CD2443097CEB74 +:10067000FE58DA7A16FEF2DA7C163EF277FED0D217 +:100680008D163A0822B7C28D163C3208222B7323EE +:10069000234E2346EB2A2022CD244309EB723E252C +:1006A000BADAA516773E7EBED2AC16772B73C39608 +:1006B000153A0922B7C42C44CD10443A1F22210018 +:1006C000FEBCFACA163E01C38F142100F9BCF2D455 +:1006D00016221E22111E223E05CD18433E10D306BF +:1006E00006041A77132305C2E216702120203E016A +:1006F000C330173A2920B7C217173A9422B7C21746 +:10070000170106002A272009222720EB212020227A +:1007100000203E07CD05433A3322B7CAEA172130FD +:1007200020AF3207223AA822B7FAAD443A02223D5E +:100730002200223203223E09856F7EB7CA4717FE88 +:10074000FDC2CD17C3C8173E052A0022856F5E2360 +:10075000567AB7F25C172F577B2F5F13234E234631 +:1007600078B7F26B172F47792F4F033E05F57AE6DE +:1007700004C2A21778E604C2A217EB29EB6069094C +:10078000444DF13DC26D172A00227EFE4CCAC817A7 +:100790003E09856F360306042B360005C29817C341 +:1007A000CD17F12140117807070782856FD2B11765 +:1007B000247EF50F0F0F0FE60F4F3E05CDE442F1FB +:1007C000E60F4F3E07CDE4423E0132072201100002 +:1007D0002A0022093A03223DC230173A0722B7C243 +:1007E000EA173A2920FEFFCAB21B3E043206222134 +:1007F00020203A022222002232032216087EFE6CBA +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/g.cpu.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/g.cpu.hex new file mode 100644 index 00000000..30dd2127 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/g.cpu.hex @@ -0,0 +1,129 @@ +:100000005B034F525B034F555B054F4445525B0802 +:100010005B504C4159455253085B4A4F5545555228 +:1000200053085B535049454C4552084445504F5383 +:1000300049545B074D455454455A5B0B574552464E +:10004000454E5B53494530055B434F494E065B5077 +:1000500049454345075B4D55454E5A4501530153AC +:10006000014E12505553485B53544152545B425514 +:1000700054544F4E3013415050555945525B5355CF +:100080005230424F55544F4E301653544152544BF8 +:100090004E4F5046304245544145544947454E30F5 +:1000A000085B5B5B5350415245085B5B5B535041BF +:1000B0005245085B5B5B5350415245175B5B5B46A7 +:1000C0004F554C305B5B53484F4F54305B5B41475F +:1000D00041494E1B5B5B4641555445305B5B54497F +:1000E0005245525B41305B5B4E4F55564541551969 +:1000F0005B5B464F554C305B5B4E4F43484D414C2C +:10010000305B5B57455246454E0F5B5B53484F4F44 +:1001100054305B5B414741494E135B5B5449524548 +:10012000525B41305B5B4E4F5556454155125B5B10 +:100130004E4F43484D414C305B5B57455246454E10 +:10014000015B015B015B075B5B5B5B5B4F52075BCA +:100150005B5B5B5B4F55095B5B5B5B5B4F44455295 +:100160000F5B5B5B47414D45305B5B5B4F564552D8 +:10017000075B5B5B5B46494E0A5B535049454C4508 +:100180004E44450E5B5B4C415354305B5B465241E1 +:100190004D450E5B4445524E494552305B434F55E9 +:1001A000500E5B4C45545A544552305B575552469D +:1001B0000A524547554C4154494F4E095245474C08 +:1001C000454D454E540A42455354494D4D554E47B1 +:1001D000085B5B5B464C415348085B5B5B464C41AC +:1001E0005348085B5B5B424C49545A05464C4153AB +:1001F0004805464C41534805424C49545A04464F21 +:10020000525B05504F55525B05465545525B0E5BA0 +:100210005B42454552305B5B4652414D450E5B5B50 +:10022000434F5550305B5B42494552450E5B5B4244 +:10023000494552305B5B52554E4445175C5B50520A +:100240004553535B53454C454354305B5B425554D7 +:10025000544F4E215C5B415050555945525B5355AC +:100260005230424F55544F4E5B44453053454C45F8 +:100270004354494F4E195C5B574145484C4B4E4FD8 +:100280005046305B5B4245544145544947454E0E0C +:100290005B5B5B535452494B45305B5B5B580E5B79 +:1002A0005B5B535452494B45305B5B5B580E5B5B69 +:1002B0005B535452494B45305B5B5B580F5B5B5B58 +:1002C000444F55424C45305B5B5B58580F5B5B5B62 +:1002D000444F55424C45305B5B5B5858105B5B5B51 +:1002E000444F5050454C54305B5B5B58580E5B5B41 +:1002F0005455524B4559305B5B585858015B015B74 +:100300000F5B5B484559484559305B5B5858585816 +:10031000015B015B095B484F4C595B434F57015BE5 +:10032000015B1130505553485B425554544F4E3089 +:10033000464F525B1130505553485B425554544F11 +:100340004E30464F525B1130505553485B42555426 +:10035000544F4E30464F525B04484F4F4B04484F6A +:100360004F4B04484F4F4B08535452414947485450 +:10037000085354524149474854085354524149473D +:100380004854D201013C0C01013F0C0106400C070E +:1003900001421046022A0D3301B80D0701460C0731 +:1003A000014D0C0701540C06025B0C0602670C069B +:1003B00002730C06027F0C06028B0C0602970C06D9 +:1003C00002A30C0602AF0C0602BB0C0602C70C0807 +:1003D00001EB0C0801F30C0801FB0C0801030D08EC +:1003E000010B0D0801130D08011B0D0801230D0C55 +:1003F00002D30C02013D0C2C039E0E2301170E416B +:10040000013A0E23017B0E1A01EB0D1201050E0CB1 +:1004100002220F0C023A0F0C02520F0C026A0F0C50 +:1004200002820F0C029C0F0C02B40F0C02CC0F0CBA +:1004300002E40F1A020E100902FC0F15010707FF54 +:10044000FFFFFFFFFFFF41221408142241406070AC +:10045000787C7E7F00000000000000FE01FF0303A7 +:10046000030303FF03FE0100000003FF03FF030279 +:100470000300001E033F0333033303F703E603EED9 +:1004800001FF033303330387038601FF03FF0330B8 +:100490000030003F003F00E001F30333033303BFAC +:1004A00003BF01E001F30333033303FF03FE010F36 +:1004B000003F00FB00E30383030300EE01FF03336F +:1004C000033303FF03EE01FE01FF03330333033F56 +:1004D000031E00F000FC03FE07FE07FF0FFF0FFFE7 +:1004E0000FFF0FFE07FE07FC03F000000078FFFF80 +:1004F0007800000070787C3C1C0303183C3C3C3CBA +:1005000018181800070F1F1E1C606000001EFFFF58 +:100510001E000060601C1E1F0F07001818183C3CCE +:100520003C3C1803031C3C7C787000020002000273 +:1005300000020002000200020002000200020002AB +:10054000000200020002000200020602080270021D +:10055000080206020002780214021602140278024F +:1005600000023E024002780240023E0200023C02CB +:100570004202420242027E020002420242027E0225 +:100580004202420200027E020402080204027E02CB +:10059000000200020002000200020002000200024B +:1005A000000200020002000200020002000200023B +:1005B0000002000200020002000000000000000033 +:1005C0000000000000000000060870080600781413 +:1005D000161478003E4078403E003C4242427E0085 +:1005E00042427E4242007E0408047E11151F000034 +:1005F0001F0608061F00001F091F0000171D051F0A +:10060000000105051F1E081E00041E0400001F1126 +:10061000111F0000101F11261909093F0021292967 +:10062000293F00202020203F001F203C201F001ECB +:100630002121211E001A2525253F3A2921211F00AD +:100640003F100C023F0021213F21210020202020CB +:100650003F001F203C201F001E2121211E001A25C3 +:1006600025253F000000000000001F203C201F0047 +:100670001E2121211E003F100C023F261909093FAF +:1006800000212929293F003F100C023F003F100C98 +:10069000023F0021213F2121001F203C201FFFFF9E +:1006A000010101010101010101010101010101013A +:1006B000010101010101FFFF010100010100010130 +:1006C0000001010001010001010001010001010020 +:1006D000010100010100010100010100010100010F +:1006E00001000101000101000101000101000101FF +:1006F00000010100010100010100010100010100F0 +:1007000001010001010001010001010001010001DE +:10071000010001010001010001010001010001FFD0 +:10072000FF01001C00140014FF170110011001103C +:100730000110FD1705140514071CFF1E81128112FC +:100740008112AD16A514A514AD1729102910291072 +:10075000EF1FFF1F011001100110BD17A514A514F4 +:10076000ED160912091209120F1E8003FF1E011057 +:1007700001100110FF1E8002F802080208020802A0 +:10078000F803EF1F291029102910AD17A514A5147F +:10079000BD16811281128112FF1EEF1FEF1F29105B +:1007A00029102910AD17A514A514BD1701100110AB +:1007B0000110FF1FFF1F011001100110FD1F050098 +:1007C00005000D000900090009000F00E01F3F109F +:1007D00001100110BD17A514A514BD1701100110BB +:1007E0003F10E01FFF1F011001100110BD17A514DD +:1007F000A514BD16811281128112FF1EFF01010195 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/h.cpu.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/h.cpu.hex new file mode 100644 index 00000000..94b01ac2 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/roms/h.cpu.hex @@ -0,0 +1,129 @@ +:10000000C3580285004B1563FBC94F00009C37782D +:10001000F5E5D5C5CDCB043A11223C3211223A295F +:10002000223D322922C264003A15223A2822B7C260 +:100030003600B7CA64003D322822C264003A152255 +:10004000B7C25A0021972235CA53003EBE32282239 +:10005000C364003C329222C36400DB02E604CA643B +:1000600000329122210920DB052F479670CD8800B0 +:10007000222222210C20DB062F479670CD880022F9 +:100080002022C1D1E1F1FBC9B7FA9600FE21FA9D09 +:10009000003E21C39D00FEE0F29D003EE023470E9E +:1000A000007E2F57237E2F5F13EB0906027CB7F2E9 +:1000B000B300371F677D1F6F05C2AD00EB7B8677EE +:1000C0005F2B7E8A77676BC9856FD024C9070707C6 +:1000D000072100201600E6F05F19C9D1E17E472311 +:1000E000E5D5CDCD00220020C9CDDB002A00204E71 +:1000F00021830B79CDC8005E2356EB221121EB231F +:100100005E2356EB220F213E0FCD5002B71F322740 +:1001100022D22201060A11D301CD46013A2722E656 +:1001200010C03A2722060211D301B7C23101118053 +:1001300001CD46012A002023235E2323563E0ACD0B +:100140005002732372C9AFD30278CD5002E607D3B1 +:10015000013A1221217801CDC8006E260019EB2A40 +:100160001121D52DC26201CD26022A11213E2094F3 +:100170004F06002A0F21EBC9463C32281E140A0004 +:100180001AD302DB012FB67713231AD302DB012F18 +:10019000B67713231AD302DB012FB67713231AD3B2 +:1001A00002DB012FB67713231AD302DB012FB677B8 +:1001B00013231AD302DB012FB67713231AD302DBE2 +:1001C000012FB6771323AFD302DB012FB67709AF28 +:1001D000D302C91AD302DB012FAE7713231AD3023D +:1001E000DB012FAE7723131AD302DB012FAE771377 +:1001F000231AD302DB012FAE7713231AD302DB01BC +:100200002FAE7713231AD302DB012FAE7713231AF5 +:10021000D302DB012FAE771323AFD302DB012FAE66 +:100220007709AFD302C978CD50020F0F0FE61F57E1 +:100230002378FE0ACA3802237E0F0F0F47E6E0B28A +:100240005F78E61FC62457C9CDC8007E23666FC9F4 +:100250002A0020CDC8007EC9310024DB02E680C21E +:10026000BC02AF322822329322321522329022323F +:100270008722D3052100200620772305C279023288 +:100280001C2221A0220608772305C287023E4032A5 +:100290008622214009228E22FBC35306000102035D +:1002A0000405060708090A0B0C0D0E0F100F0E0DA2 +:1002B0000C0B0A09080706050403020106011100D8 +:1002C00000210020D304707EA8CACF02CD89032369 +:1002D0007CFE40C2C402D3042B7CFE1FCAF4027E03 +:1002E000A8CAE702CD8903782F77AECAD602CD8996 +:1002F00003C3D602D304237CFE40CA0B03782FAE7F +:10030000CA0603CD8903AF77C3F402780747D2C189 +:10031000027AB3CA3A03EBF911002006002100006B +:10032000390E10AF29DA29032F12133E1812130DBC +:10033000C2230305C21D03C38403310024210C32F0 +:10034000E52100001199033E0A320322010004AFA7 +:1003500086D304230DC2500305C250033CCA6A036E +:100360001AE3EBC5CDA303C1EBE3133A03223DCA65 +:100370007D03FE02C24903210040C34903E17DFE23 +:100380000CCA0000D304C384034F7DE60179C296F2 +:1003900003B257C39803B35FC94848474746464529 +:1003A000454444D5E5EBCDE203CDF103E1D113C9DA +:1003B0002A1622EB3AB1224E2306003DFAC3030966 +:1003C000C3B703EB793DF8F51A13D5FE30C2D60357 +:1003D000CD1507C3DD03CDE203CDF10309D1F1C390 +:1003E000C503EB213E04D64147070780CDC800EB8B +:1003F000C93E05F501E0FF091AAE77F13D09C8F5E0 +:1004000013C3F803EB3D211104CDE803CDF103093B +:10041000C940447E40407252525A4E425A5A5A7E05 +:100420000E08087E004E4A4A32007E4A4A7A00424E +:1004300022120A063C5A5A5A3C040A0A0A7E7814C6 +:100440001614787E4A4A4A343C424242247E424252 +:10045000423C7E525252427E121202023C424252B0 +:10046000747E1010107E42427E424232423E0202B0 +:100470007E181824427E404040407E0408047E7E60 +:100480000418207E3C4242423C7E1212120C3C4236 +:1004900042225C7E1212324C244A5A522402027EBC +:1004A00002023E4040403E06186018063E4078403A +:1004B0003E4224182442060870080662725A4E46CC +:1004C00000000000007060500804952105207E4F58 +:1004D00017DA0E05237EA7CAF204352B3E8FB677B6 +:1004E0003A0820F606320820D3053E24D30F3E20DA +:1004F000D306DB042FE6014779E640CA31054FCD2C +:100500003105B9C8233423343E01321822C9357E5F +:10051000E60FCA2A05FE08C2F2043A0820E6FD32B8 +:100520000820D305AFD306C3F2043E7FA677C3F2FB +:100530000421052078A7C240053E40B677E640C9B1 +:100540003EBFA677C9216009CD41443A1922470E22 +:1005500000CD33442139222200223A1922FE01CA59 +:10056000B30547050E033E12CDC80022042279CD03 +:10057000C800EB79CD1843EBBEFA9E05C291052B5E +:10058000EB2B7E0DF277052A042205C26405C3B366 +:10059000052A04223E07CDC8003601C38705C53AA7 +:1005A000192290470E01CD3344C12A042222002291 +:1005B000C387052139223A1922472281223E07CDDD +:1005C0001B43C2CD05C5CDDA43CD0644C12A8122E5 +:1005D0003E12CDC80005C2BA05218037111E003E6B +:1005E000433600233600233600193DC2E105216061 +:1005F0003F118D07221622CDB30321A0223A882273 +:10060000B7CA070621A4220E0322042279CDC8000E +:10061000EB79CD1843EBBEFA3606C225062BEB2B41 +:100620007E0DF215062A0422EB2A00220E047E1209 +:1006300023130DC22E062A0422CD2942CD1D07CD3B +:100640001D07CD1D07CD10443A88223290223E016D +:10065000321522F33A0820E602320820D305FB21A6 +:10066000BB11DB02E610CA6A0623221322DB02E674 +:1006700003FE03FA77063D32B122AF321822321957 +:1006800022328C22329422D30ED306D3073A15227B +:10069000B7CAE6113A0720B7C2E6117E323022CD42 +:1006A000A506C39D13CD2C07CD430711B707CDB3C6 +:1006B00003CD15073A1922B7CADA063A8C22F60892 +:1006C000328C22D30E116208CDB3033A1922FE04F4 +:1006D000C8110108CDB303CD1507112A08CDB00309 +:1006E0003A3022CD0404114708CDB3033A3022FE3C +:1006F00001CAFA06115C08CDB3033A1922B7C8CD76 +:10070000150711F007CDB3033A19223CCD040411AB +:100710000F08C3B3032A162223221622C9AF3211AF +:1007200022D3043A1122FE60DA2107C9210D33AF2A +:10073000067811D0FF0E1077230DC237071905C2B6 +:100740003507C93A88220601B7CA4E0706003A8C17 +:1007500022E6FEB0328C22D30ECD4F443A1922B796 +:10076000C268073A0720B7C8113B0ACDB303CD15BD +:100770000711FD09CDB30311EB093A8822B7CA84EA +:100780000711B009CDB303CD1507C31507093048CC +:10079000495B53434F52450E4D45494C4C455552CC +:1007A0003053434F524510484F454348305354450A +:1007B000524745424E49530D544F5B535441525496 +:1007C0005B47414D4512504F55525B534F55455273 +:1007D000304150505559455217554D5B4441535B7C +:1007E000535049454C305A555B5354415254454E31 +:1007F00004464F525B05504F55525B0546554552D6 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/spram.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/sprom.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/sprom.vhd new file mode 100644 index 00000000..a81ac959 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BowlingAlley_MiST/rtl/sprom.vhd @@ -0,0 +1,82 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_aclr_a : STRING; + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/GunFight.qpf b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/GunFight.qpf new file mode 100644 index 00000000..f68bb246 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/GunFight.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2013 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.0 Build 162 10/23/2013 SJ Web Edition +# Date created = 21:27:39 November 20, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "21:27:39 November 20, 2017" + +# Revisions + +PROJECT_REVISION = "GunFight" diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/GunFight.qsf b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/GunFight.qsf new file mode 100644 index 00000000..03524a57 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/GunFight.qsf @@ -0,0 +1,178 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 22:12:52 July 17, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# GunFight_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/GunFight_mist.sv +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/GunFight_memory.sv +set_global_assignment -name VHDL_FILE rtl/GunFight_overlay.vhd +set_global_assignment -name VHDL_FILE rtl/sprom.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name QIP_FILE ../../../common/mist/mist.qip + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name TOP_LEVEL_ENTITY GunFight_mist + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== + set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# --------------------------- +# start ENTITY(GunFight_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top + set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top + set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(GunFight_mist) +# ------------------------- + +# -------------------------------- +# start ENTITY(spaceinvaders_mist) + +# end ENTITY(spaceinvaders_mist) +# ------------------------------ +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/GunFight.sdc b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/GunFight.sdc new file mode 100644 index 00000000..f91c127c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/GunFight.sdc @@ -0,0 +1,126 @@ +## Generated SDC file "vectrex_MiST.out.sdc" + +## Copyright (C) 1991-2013 Altera Corporation +## Your use of Altera Corporation's design tools, logic functions +## and other software and tools, and its AMPP partner logic +## functions, and any output files from any of the foregoing +## (including device programming or simulation files), and any +## associated documentation or information are expressly subject +## to the terms and conditions of the Altera Program License +## Subscription Agreement, Altera MegaCore Function License +## Agreement, or other applicable license agreement, including, +## without limitation, that your use is for the sole purpose of +## programming logic devices manufactured by Altera and sold by +## Altera or its authorized distributors. Please refer to the +## applicable agreement for further details. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition" + +## DATE "Sun Jun 24 12:53:00 2018" + +## +## DEVICE "EP3C25E144C8" +## + +# Clock constraints + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty + +# tsu/th constraints + +# tco constraints + +# tpd constraints + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + + + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] + +#************************************************************** +# Create Generated Clock +#************************************************************** + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + +#************************************************************** +# Set Input Delay +#************************************************************** + +set_input_delay -add_delay -clock_fall -clock [get_clocks {CLOCK_27}] 1.000 [get_ports {CLOCK_27}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {CONF_DATA0}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DI}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SCK}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}] + +#************************************************************** +# Set Output Delay +#************************************************************** + +set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_L}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_R}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {LED}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {VGA_*}] + +#************************************************************** +# Set Clock Groups +#************************************************************** + +set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}] + +#************************************************************** +# Set False Path +#************************************************************** + + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + +set_multicycle_path -to {VGA_*[*]} -setup 2 +set_multicycle_path -to {VGA_*[*]} -hold 1 + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/README GunFight.txt b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/README.txt similarity index 100% rename from Arcade_MiST/Midway-Taito 8080 Hardware/README GunFight.txt rename to Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/README.txt diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/clean.bat b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/GunFight_memory.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/GunFight_memory.sv new file mode 100644 index 00000000..3e64a989 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/GunFight_memory.sv @@ -0,0 +1,129 @@ + +module GunFight_memory( +input Clock, +input RW_n, +input [15:0]Addr, +input [15:0]Ram_Addr, +output [7:0]Ram_out, +input [7:0]Ram_in, +output [7:0]Rom_out +); + +wire [7:0]rom_data_0; +wire [7:0]rom_data_1; +wire [7:0]rom_data_2; +wire [7:0]rom_data_3; +wire [7:0]rom_data_4; +wire [7:0]rom_data_5; +wire [7:0]rom_data_6; +wire [7:0]rom_data_7; + + +sprom #( + .init_file("./roms/gf-h.hex"), + .widthad_a(9), + .width_a(8)) +u_rom_h ( + .clock(Clock), + .Address(Addr[8:0]), + .q(rom_data_0) + ); + +sprom #( + .init_file("./roms/gf-g.hex"), + .widthad_a(9), + .width_a(8)) +u_rom_g ( + .clock(Clock), + .Address(Addr[8:0]), + .q(rom_data_1) + ); + +sprom #( + .init_file("./roms/gf-f.hex"), + .widthad_a(9), + .width_a(8)) +u_rom_f ( + .clock(Clock), + .Address(Addr[8:0]), + .q(rom_data_2) + ); + +sprom #( + .init_file("./roms/gf-e.hex"), + .widthad_a(9), + .width_a(8)) +u_rom_e ( + .clock(Clock), + .Address(Addr[8:0]), + .q(rom_data_3) + ); + + sprom #( + .init_file("./roms/gf-d.hex"), + .widthad_a(9), + .width_a(8)) +u_rom_d ( + .clock(Clock), + .Address(Addr[8:0]), + .q(rom_data_4) + ); + +sprom #( + .init_file("./roms/gf-c.hex"), + .widthad_a(9), + .width_a(8)) +u_rom_c ( + .clock(Clock), + .Address(Addr[8:0]), + .q(rom_data_5) + ); + +sprom #( + .init_file("./roms/gf-b.hex"), + .widthad_a(9), + .width_a(8)) +u_rom_b ( + .clock(Clock), + .Address(Addr[8:0]), + .q(rom_data_6) + ); + +sprom #( + .init_file("./roms/gf-a.hex"), + .widthad_a(9), + .width_a(8)) +u_rom_a ( + .clock(Clock), + .Address(Addr[8:0]), + .q(rom_data_7) + ); + +always @(Addr, rom_data_0, rom_data_1, rom_data_2, rom_data_3, rom_data_4, rom_data_5, rom_data_6, rom_data_7) begin + Rom_out = 8'b00000000; + case (Addr[12:9]) + 4'b0000 : Rom_out = rom_data_0; + 4'b0001 : Rom_out = rom_data_1; + 4'b0010 : Rom_out = rom_data_2; + 4'b0011 : Rom_out = rom_data_3; + + 4'b0100 : Rom_out = rom_data_4; + 4'b0101 : Rom_out = rom_data_5; + 4'b0110 : Rom_out = rom_data_6; + 4'b0111 : Rom_out = rom_data_7; + default : Rom_out = 8'b00000000; + endcase +end + +spram #( + .addr_width_g(13), + .data_width_g(8)) +u_ram0( + .address(Ram_Addr[12:0]), + .clken(1'b1), + .clock(Clock), + .data(Ram_in), + .wren(~RW_n), + .q(Ram_out) + ); +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/GunFight_mist.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/GunFight_mist.sv new file mode 100644 index 00000000..220eef32 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/GunFight_mist.sv @@ -0,0 +1,197 @@ +module GunFight_mist( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Gun Fight;;", + "O34,Scanlines,Off,25%,50%,75%;", +// "O5,Overlay, On, Off;", + "T6,Reset;", + "V,v1.20.",`BUILD_DATE +}; + +assign LED = 1; +assign AUDIO_R = AUDIO_L; + + +wire clk_sys; +wire pll_locked; +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_sys) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0,joystick_1; +wire scandoublerD; +wire ypbpr; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; +wire [7:0] audio; +wire hsync,vsync; +wire hs, vs; +wire r,g,b; + +wire [15:0]RAB; +wire [15:0]AD; +wire [7:0]RDB; +wire [7:0]RWD; +wire [7:0]IB; +wire [5:0]SoundCtrl3; +wire [5:0]SoundCtrl5; +wire Rst_n_s; +wire RWE_n; +wire Video; +wire HSync; +wire VSync; + +invaderst invaderst( + .Rst_n(~(status[0] | status[6] | buttons[1])), + .Clk(clk_sys), + .ENA(), + .Coin(btn_coin), + .Sel1Player(btn_one_player), + .Fire1(~joystick_0[4]), + .Fire2(~joystick_1[4]), + .GunUp1(gun1_up), + .GunDown1(gun1_dw), + .MoveLeft1(~joystick_0[1]), + .MoveRight1(~joystick_0[0]), + .MoveUp1(~joystick_0[3]), + .MoveDown1(~joystick_0[2]), + .GunUp2(gun2_up), + .GunDown2(gun2_dw), + .MoveLeft2(~joystick_1[1]), + .MoveRight2(~joystick_1[0]), + .MoveUp2(~joystick_1[3]), + .MoveDown2(~joystick_1[2]), +// .DIP(dip), + .RDB(RDB), + .IB(IB), + .RWD(RWD), + .RAB(RAB), + .AD(AD), + .SoundCtrl3(SoundCtrl3), + .SoundCtrl5(SoundCtrl5), + .Rst_n_s(Rst_n_s), + .RWE_n(RWE_n), + .Video(Video), + .HSync(hs), + .VSync(vs) + ); + +GunFight_memory GunFight_memory ( + .Clock(clk_sys), + .RW_n(RWE_n), + .Addr(AD), + .Ram_Addr(RAB), + .Ram_out(RDB), + .Ram_in(RWD), + .Rom_out(IB) + ); + +invaders_audio invaders_audio ( + .Clk(clk_sys), + .S1(SoundCtrl3), + .S2(SoundCtrl5), + .Aud(audio) + ); + +mist_video #(.COLOR_DEPTH(3)) mist_video( + .clk_sys(clk_sys), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({Video,Video,Video}), + .G({Video,Video,Video}), + .B(3'b000), + .HSync(hs), + .VSync(vs), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .scandoubler_disable(scandoublerD), + .ce_divider(1), + .scanlines(status[4:3]), + .ypbpr(ypbpr) + ); + +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac #( + .c_bits(8)) +dac ( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + + +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_coin = 0; + +reg gun1_up = 0; +reg gun1_dw = 0; +reg gun2_up = 0; +reg gun2_dw = 0; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h15: gun1_up <= key_pressed; // Q + 'h35: gun1_dw <= key_pressed; // Y + 'h75: gun2_up <= key_pressed; // Arrow up + 'h72: gun2_dw <= key_pressed; // Arrow down + endcase + end +end + +endmodule diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/GunFight_overlay.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/GunFight_overlay.vhd new file mode 100644 index 00000000..0bbba7ca --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/GunFight_overlay.vhd @@ -0,0 +1,127 @@ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + + +entity GunFight_overlay is + port( + Video : in std_logic; + Overlay : in std_logic; + CLK : in std_logic; + Rst_n_s : in std_logic; + HSync : in std_logic; + VSync : in std_logic; + O_VIDEO_R : out std_logic; + O_VIDEO_G : out std_logic; + O_VIDEO_B : out std_logic; + O_HSYNC : out std_logic; + O_VSYNC : out std_logic + ); +end GunFight_overlay; + +architecture rtl of GunFight_overlay is + + signal HCnt : std_logic_vector(11 downto 0); + signal VCnt : std_logic_vector(11 downto 0); + signal HSync_t1 : std_logic; + signal Overlay_G1 : boolean; + signal Overlay_G2 : boolean; + signal Overlay_R1 : boolean; + signal Overlay_G1_VCnt : boolean; + signal VideoRGB : std_logic_vector(2 downto 0); +begin + process (Rst_n_s, Clk) + variable cnt : unsigned(3 downto 0); + begin + if Rst_n_s = '0' then + cnt := "0000"; + elsif Clk'event and Clk = '1' then + if cnt = 9 then + cnt := "0000"; + else + cnt := cnt + 1; + end if; + end if; + end process; + + p_overlay : process(Rst_n_s, Clk) + variable HStart : boolean; + begin + if Rst_n_s = '0' then + HCnt <= (others => '0'); + VCnt <= (others => '0'); + HSync_t1 <= '0'; + Overlay_G1_VCnt <= false; + Overlay_G1 <= false; + Overlay_G2 <= false; + Overlay_R1 <= false; + elsif Clk'event and Clk = '1' then + HSync_t1 <= HSync; + HStart := (HSync_t1 = '0') and (HSync = '1'); + + if HStart then + HCnt <= (others => '0'); + else + HCnt <= HCnt + "1"; + end if; + + if (VSync = '0') then + VCnt <= (others => '0'); + elsif HStart then + VCnt <= VCnt + "1"; + end if; + + if HStart then + if (Vcnt = x"1F") then + Overlay_G1_VCnt <= true; + elsif (Vcnt = x"95") then + Overlay_G1_VCnt <= false; + end if; + end if; + + if (HCnt = x"027") and Overlay_G1_VCnt then + Overlay_G1 <= true; + elsif (HCnt = x"046") then + Overlay_G1 <= false; + end if; + + if (HCnt = x"046") then + Overlay_G2 <= true; + elsif (HCnt = x"0B6") then + Overlay_G2 <= false; + end if; + + if (HCnt = x"1A6") then + Overlay_R1 <= true; + elsif (HCnt = x"1E6") then + Overlay_R1 <= false; + end if; + + end if; + end process; + + p_video_out_comb : process(Video, Overlay_G1, Overlay_G2, Overlay_R1) + begin + if (Video = '0') then + VideoRGB <= "000"; + else + if Overlay_G1 or Overlay_G2 then + VideoRGB <= "010"; + elsif Overlay_R1 then + VideoRGB <= "100"; + else + VideoRGB <= "111"; + end if; + end if; + end process; + + + O_VIDEO_R <= VideoRGB(2) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_G <= VideoRGB(1) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_B <= VideoRGB(0) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_HSYNC <= HSync; + O_VSYNC <= VSync; + + +end; \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T8080se.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T8080se.vhd new file mode 100644 index 00000000..65b92d54 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T8080se.vhd @@ -0,0 +1,194 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80_ALU.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80_ALU.vhd new file mode 100644 index 00000000..e09def1e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80_ALU.vhd @@ -0,0 +1,361 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80_MCode.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80_Pack.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80_Reg.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/T80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/gun.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/gun.sv new file mode 100644 index 00000000..507462e5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/gun.sv @@ -0,0 +1,13 @@ +module gun( +input clk, +input gun1up, +input gun1dw, +input gun2up, +input gun2dw, +output [2:0] gun1out, +output [2:0] gun2out +); + +//0x06, 0x02, 0x00, 0x04, 0x05, 0x01, 0x03 +wire [6:0]gun[6:0]gun = () +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/invaders.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/invaders.vhd new file mode 100644 index 00000000..e29e4774 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/invaders.vhd @@ -0,0 +1,307 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.NUMERIC_STD.ALL; + + +entity invaderst is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire1 : in std_logic; + Fire2 : in std_logic; + GunUp1 : in std_logic; + GunDown1 : in std_logic; + MoveLeft1 : in std_logic; + MoveRight1 : in std_logic; + MoveUp1 : in std_logic; + MoveDown1 : in std_logic; + GunUp2 : in std_logic; + GunDown2 : in std_logic; + MoveLeft2 : in std_logic; + MoveRight2 : in std_logic; + MoveUp2 : in std_logic; + MoveDown2 : in std_logic; + DIP : in std_logic_vector(8 downto 1); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0); + SoundCtrl5 : out std_logic_vector(5 downto 0); + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic + ); +end invaderst; + +architecture rtl of invaderst is + + component mw8080 + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); + end component; + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(6 downto 2); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; + signal gun1 : std_logic_vector(3 downto 0); + signal gun2 : std_logic_vector(3 downto 0); + +signal state1 : unsigned(2 downto 0); +signal state2 : unsigned(2 downto 0); + +type gun_array is array(0 to 6) of std_logic_vector(3 downto 0); +signal gun: gun_array := ( + X"6",X"2",X"0",X"4",X"5",X"1",X"3"); + +begin + +process (Clk, GunUp1, GunUp2, GunDown1, GunDown2) +begin +if Clk = '1' then + if GunUp1 = '1' and not (state1 = 6) then state1 <= state1 + 1; elsif + GunDown1 = '1' and not (state1 = 0) then state1 <= state1 - 1; elsif + GunUp2 = '1' and not (state2 = 6) then state2 <= state2 + 1; elsif + GunDown2 = '1' and not (state2 = 0) then state2 <= state2 - 1; end if; + end if; +end process; + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; +-- no Watchdog + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; +-- if WD_Cnt = 255 then +-- Rst_n_s_i <= '0'; +-- end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then +-- WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then +-- if Sounds(0) = '1' and Old_S0 = '0' then +-- WD_Cnt <= WD_Cnt + 1; +-- end if; +-- if PortWr(6) = '1' then +-- WD_Cnt <= (others => '0'); +-- end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: mw8080 + port map( + Rst_n => Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + Video => Video, + HSync => HSync, + VSync => VSync); + +with AD_i(9 downto 8) select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + S when others; + +--GDB <= GDB0 and GDB1 and GDB2 and S;--todo + + GDB0(0) <= not MoveUp1; + GDB0(1) <= not MoveDown1; + GDB0(2) <= not MoveLeft1; + GDB0(3) <= not MoveRight1; + GDB0(4) <= not Gun1(0);--todo + GDB0(5) <= not Gun1(1);--todo + GDB0(6) <= not Gun1(2);--todo + GDB0(7) <= not Fire1; + + GDB1(0) <= not MoveUp2; + GDB1(1) <= not MoveDown2; + GDB1(2) <= not MoveLeft2; + GDB1(3) <= not MoveRight2; + GDB1(4) <= Gun2(0);--todo + GDB1(5) <= Gun2(1);--todo + GDB1(6) <= Gun2(2);--todo + GDB1(7) <= not Fire2; + + GDB2(0) <= '0';--Coinage + GDB2(1) <= '0';--Coinage + GDB2(2) <= '0';--Coinage + GDB2(3) <= '0';--Coinage + GDB2(4) <= '0';--Game_Time + GDB2(5) <= '0';--Game_Time + GDB2(6) <= Coin; + GDB2(7) <= Sel1Player; + + PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; + PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; + PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; + PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; + PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + OldSample := '0'; + gun1 <= gun(to_integer(state1)); + gun2 <= gun(to_integer(state2)); + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0); + end if; + if PortWr(4) = '1' and OldSample = '0' then + D5(15 downto 8) <= DB; + D5(7 downto 0) <= D5(15 downto 8); + end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0); + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/invaders_audio.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/mw8080.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/mw8080.vhd new file mode 100644 index 00000000..b9a88f96 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/mw8080.vhd @@ -0,0 +1,336 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n, Rd_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/pll.qip b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/pll.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/pll.vhd new file mode 100644 index 00000000..d65b9f9b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/pll.vhd @@ -0,0 +1,350 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire4_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire4_bv(0 DOWNTO 0) <= "0"; + sub_wire4 <= To_stdlogicvector(sub_wire4_bv); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + sub_wire2 <= inclk0; + sub_wire3 <= sub_wire4(0 DOWNTO 0) & sub_wire2; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_UNUSED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire3, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-a.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-a.hex new file mode 100644 index 00000000..c83404c4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-a.hex @@ -0,0 +1,18 @@ +:020000040000FA +:2000000000001902007A0100FC00007E0500FE0380FC0340FE0738F9033EF0FF0FA0FF03F4 +:2000200080FF0080FF00C0FF00E0FF00E0FF0170FF0330FE0730FC0F30FE0F30FE0F30F8C0 +:200040000F20F00700F00700F00700C00700800700000700000300400300800300000F045B +:200060000BA0000000B0010000B0013C00B0017E00F913FF00FF9FFF81F8C7FF9FFCFFFF88 +:20008000FFFEFFFFFF0000FF400000002000031C007E0080FF01E0FF07F0FF0FF0FF0FF810 +:2000A000FF1FF8FF1FF8FF1FF8E71FF0C30FF0810FE08107C0810380C301F0FF0FE0FF07E2 +:2000C000E0FF07F4FF2F843C21048120048120068160F7FFEF0681600400200400200400EE +:2000E000200400204A0D460C870CC40B090D050CC80C86228221C321002145224121042277 +:20010000061AFF08000CFAFE0316FD0201141328740B3336740B1230740B32368C0B1228EB +:200120008C0B0C38740B0C2A740B0D30740B0C2A8C0B0C388C0B0F30740B1111115265990B +:20014000999911111153759999991111115485999999C400747020FFA00AB400008E0E000F +:200160000047414B45404040404D53454F4040404040404040404040404040404040404073 +:200180004040404040404040404040404000002547524C404649474851494C50454F51405C +:2001A000434D494C4040404040404040404040474551404F454144553A3A3A3A3A3A203A19 +:2001C0003A3A3A3A3A4040444F41543B4040474D51404B453B484555404E414F444C454F86 +:2001E0003B2E554D52404841534540434F454449513C00001A4E52504840425251514D4CAF +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-b.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-b.hex new file mode 100644 index 00000000..e9efe4ee --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-b.hex @@ -0,0 +1,18 @@ +:020000040000FA +:200000001F00FA3F000315000500800D00800D00800F00C89F00F8FF00C01700C03F00C0CE +:200020007F00C01FC0801F7000073C800F0FF8FF03FCFF01CEFF00C61F00C61F00C61F0040 +:20004000C61F00FA3F000315000500800D00800D00800F00C89F00F8FF00C01700C03F0088 +:20006000C07F00C01F00801FC0000738800F0CF8FF0FFCFF03CE7F00C61F00C61F00C61F29 +:2000800000C61F00FA3F000315000500800D00800D00800F00C89F00F8FF00C01700C03F48 +:2000A00000C07F00C01F00801F00000708800FF0F8FF1FFCFF0FCEFF00C61F00C61F00C678 +:2000C0001F00C61F00FA3F000315000500800D00800D00800F00C89F00F8FF00C01700C028 +:2000E0003F00C07F00C01F00801F00000700800F00F83F00FCFF01CEFF0FC61F7FC61F0016 +:20010000C61F00C61F00FA3F000315000500800D00800D00800F00C89F00F8FF00C01700E1 +:20012000C03F00C07F00C01F00801F00000700800F00F83F00FCFF00CEFF01C6FF07C61FBC +:200140001EC61F70C61F00FA3F000315000500800D00800D00800F00C89F00F8FF00C01713 +:2001600000C03F00C07F00C01F00801F00000700800F00F83F00FC7F00CEFF01C6FF03C61F +:200180001F17C61F0EC61F14FA3F20030CF03F00F03F00E03D00C07900C07100C0E100C08F +:2001A000E100E06000707000343400383800F0F000030CF03F00E03F00C01F00C01F00C0AB +:2001C0001F00C01F00001E00001C00000C00000D00000E00003C00030CF03F00F03F00E037 +:2001E0001F00C00F00801F00003E00C07C00E07800703000343400383800F0F00003200421 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-c.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-c.hex new file mode 100644 index 00000000..73d416cb --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-c.hex @@ -0,0 +1,18 @@ +:020000040000FA +:200000007E3C181C1818181818183C3C3C7E66607C3E06067E7E3C7E6660387860667E3CF8 +:20002000666666667E7E606060603E3E06063E7E60667E3C3C3E06063E7E66667E3C7E7E24 +:2000400060703038181C0C0C3C7E66663C7E66667E3C3C7E66667E7C60607C3C10383838A6 +:2000600038383838387CC0C0C0C0C0C00000C0C00000000000000000C0C00000002040FF0D +:2000800040200000F0C0A09008040201000078FCCCE07030300030300000000000000000C1 +:2000A0000000183C7E6666667E7E66663E7E66663E7E66667E3E3C7E6606060606667E3C50 +:2000C0003E7E6666666666667E3E7E7E06063E3E06067E7E7E7E06063E3E060606063C7E62 +:2000E0006606067676667E3C666666667E7E666666663C3C1818181818183C3C06060606BE +:20010000060606067E7EC3C3E7E7FFFFDBC3C3C366666E6E7E7E767666663C7E66666666A7 +:2001200066667E3C3E7E66667E3E060606063E7E66667E3E766666663C7E66063E7C60664B +:200140007E3C7E7E181818181818181866666666666666667E3C66666666667E3C3C18181B +:20016000C3C3C3DBFFFFE7E7C3C366667E3C1818181818180116101818181858781B1A1E49 +:200180001E9898783818181818181818021B000100038003C007C007601D00318007E01F53 +:2001A000F03D383904418003C007E00FF81F3E2907E90001000900050005081F381B3829C6 +:2001C000CC37FE5D0315000500800D00800D00800F00C89F00F8FF00C01780C03F50C07FB8 +:2001E00060C01F30801F3800071C800F0EF8FF07FCFF03CEFF01C61F00C61F00C61F00C6BA +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-d.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-d.hex new file mode 100644 index 00000000..f5711b67 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-d.hex @@ -0,0 +1,18 @@ +:020000040000FA +:20000000CE0F3E07C3FB053A0820A7C8218208220020C921C52034C8352A00202B22002086 +:20002000C90413010C610F0A24100F035A0001296D0F0026035A00010B990F143D052A203C +:20004000C30100004000660BAA8B0D4A0D8B0D035A00066320C6035400FE027800C8034B69 +:2000600000010BA40F143D033C00053D20C2FF400060006627A0C7220021C7220340000902 +:2000800021080127D50F012A052A20C30200004000A00BAA8B0D4A0D8B0D0004130F0A019F +:2000A00009AF0F0C2E010CB80FA23E052A20C0010000480066139A8B0D870C8B0D053D20FB +:2000C000C0FFE7A0480066139AC722C321C72206632006000004F800000AC80675200600CB +:2000E0000004F800000AC806872006000004F800000AC806992006000004F800000AC8031B +:200100001E000109C50F0C2E030A072A20073D20000105A40F0E2E14099B080C05202A20B7 +:2001200020FD0D0DC202030F000B2A20105F0E12032D00099B080E6010095D090E6050093E +:200140005D090E6090095D090E7810095D090E9010095D090E9050095D090E90900DB2025E +:200160000917090C02203D20D039230DB202030A000B3D20D09B2311032D00099B08610489 +:200180007304780487042A042A042A04B0048C0499049E04AB043E043E043E0417058407B8 +:2001A0008407840784078407840749056C051308E9053D06490655068D069D067006AD0674 +:2001C0008206BC064907380775078507AB070708E907EF07A305C9031B0936093C09420930 +:2001E00048094E0954095A09630900020000000000000000440000003C7E666666666666C7 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-e.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-e.hex new file mode 100644 index 00000000..4372dd3e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-e.hex @@ -0,0 +1,18 @@ +:020000040000FA +:20000000F21406471C7BE61FC20D06141404C20406C3FC05E5D521F809CA2406010A00097C +:200020003DC21F06EB0120003E0AF51A137709F13DC22A06D1E113F13DC2FB05C92A0020BE +:200040007E23220020320320C92A00207E23220020321520C9F3E10100001100003E1031DD +:200060000F40C513BAC26206AFD301310024FBE92A00205E2356232200201AE6BF1213AFA0 +:2000800012C92A00205E2356EB220020C92A00205E2356230E0FCD7203220020C92A002076 +:2000A0005E2356230E09CD7203220020C92A00205E2356232200201AEE6012C9210E0FAF2C +:2000C000D3023A02203DFAEB06FE02F41907FE05FAD5063E045E235623D55E2356230600CA +:2000E000E3F5CD2D02F1E13DF2D5063A162047E680C2030778F68032162021220F3A052060 +:20010000C3C5063A1620E640C0F6403216203E04D302AF21360FC3D506E5F52150207EE6C4 +:2001200080C22D07EB0E0F21520FCD72033A1620F640321620F1E1C92A00205E235623226E +:2001400000201A3C2712CDA3052A00205E235623F33E801213137E2312131313131AC60867 +:20016000124E234623220020131313EB71237023AF772377C92A00207ED301237E232200FB +:2001800020321420C92A00203A1D205E235623220020922E0267CD5903EBE54B70230DC244 +:2001A0009C07E10E200915C29A07C921002111C40B1AA7C87723134F1A13477723C578064B +:2001C0000009472B1A13D5571E0006087A1F577B175F05C2CC0773D10DC2C307C178060088 +:2001E000094705C2BD07C3B107213F20C3F207212C205E0104000956CD59031B151515219A +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-f.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-f.hex new file mode 100644 index 00000000..e3ba8b5d --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-f.hex @@ -0,0 +1,18 @@ +:020000040000FA +:20000000220020C93A0920FE22F4A705C9AEC84F0601790FDA20044F7807471313C3120483 +:2000200078AE77A0EB4E236669E91AE6700F0F0FA7C8321A2021E20E112A20C34F041AE675 +:20004000700F0F0FA7C8321B2021F00E113D204F0600094E2346EB36C0110B00197123706B +:20006000C906FEC268040600212A2036C01105001970C90602C3630406FFC27F0406002113 +:200080002A2036C02370C90601C37A0406FEC293040600213D20C36B040602C38E0406FF07 +:2000A000C2A5040600213D20C382040601C3A004C82163207EE680CAC1042175207EE68021 +:2000C000C01112201AA7C0E5EB11A23E011020CDFA043EE2D301112C2001081A3A1A2021D6 +:2000E000FE0ECD7C03E1F336C623712373232323702372FB3E02321420C90A3C02FE06FA90 +:20010000110577472103207E3611A7CA100536027821A40FC3FB05C82187207EE680CA28CF +:20012000052199207EE680C01113201AA7C0E5EB11B83E011120CDFA043ED2D301113F204F +:2001400001F8F63A1B20C3DF04C83E04321420D301210720343A06204FE603BED036007900 +:200160001F1FE6033C21082086E60777C83A0420A7C03A0820A7C83D32082006603A06202E +:20018000E630CA90054F78C6104779D610C285057832042021C62035210220AF772377232B +:2001A0002377C9AF3203200E04211E201102201A1F1F1F1FE60FC2BB053E10C63077231A2F +:2001C000E60FF63077062B79FE03C2D605062C1AA7C2D6053640132370230DC2AF053E08AD +:2001E000211E20110524C3FB052A00207E235E235623D55E235623220020E1F57E23D63030 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-g.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-g.hex new file mode 100644 index 00000000..f925841c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-g.hex @@ -0,0 +1,18 @@ +:020000040000FA +:200000002777C21802C314022115207EA7CA180235C2180221C52035DB0247DB02B8210602 +:2000200020119E09CC0D04F1C1D1E1FBC97AB3C81A134F1A8032BC201A1347C5E51A13D3AC +:2000400004DB0377230DC23D02AFD304DB0377E101200009C105C23B023ABC2047C9E57EE2 +:2000600023CD80025AE3AE771F1FE3232323CD80022B46E1AE77237EB02BC03EBFA677C93D +:20008000E603477E23864F239623DA970296D297022B2B7156AFC92B2B05C2A7022BAF969F +:2000A00077233E10C3BA022B36002305C2B4023E60C3BA0205C294023E4056A7C9AF5E7796 +:2000C00023567723477AB3EBC9E5010F0009444D2F32BD203E60BA21AB20D2E00221B2202D +:2000E00071237023CD5903732372237123E37EEB210B0019EBE3732372EB1717DA14031769 +:20010000DA3E032B562B5E0104003E8009732372E1AE77C9E13E50BDC8E53E2ABD214903AC +:20012000CA26032151033A0920E60C0F856FD23203245E2356E1E5010D00AFC30C03AF7782 +:20014000237723772377E177C98B0DB10DD70DB10DC722ED221323ED227BE6074F0603AF0C +:200160007A1F577B1F5F05C25F03E521002419EBE1C9F37E2312130DC27303C9D55F160084 +:200180001978462356E1865F232323237E8257C93E08210220060070233DC29703CD5506BA +:2001A000212108220020FB2A00203AC620A7CAB403219B085E23220020160021AE0919197F +:2001C0005E2356EB11A603D5E9CD1308DB0047DB00B8211720117E09CC0D04DB0147DB017C +:2001E000B8211820118E09CC0D04211C207EA7CA04043600075F160021D609195E2356EB88 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-h.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-h.hex new file mode 100644 index 00000000..45ba5324 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/roms/gf-h.hex @@ -0,0 +1,18 @@ +:020000040000FA +:200000000000310024C39003E5D5C5F5C3870077E5D5C5F521B9207E2F77A7FAEA00216F53 +:2000200020E5CDBD02CA38001A1377231A1377780E1F0905A7CA2800E1111200197DFEB727 +:20004000C2210021A220E5CDBD02CA76001A13EB73237223EBD3027E12133E03D304DB038D +:20006000B677237E1213AFD304DB03B677780E1F0905A7CA5700E111EEFF197DFE5AC246AC +:200080000021B220C391003AB920A7FA180221AB20CDBD02D5CAB400CDBD02EBD5CDBD02A8 +:2000A000D1CAB400E54B70230DC2A600E10E200915C2A400E1CDBD02CA18021A13D302D5FE +:2000C000E3CDBD025E235623E322BA200600CD2D02E35E235623E3CD2D022ABA20E30C71B6 +:2000E000237023D1732372C318022163207EA7E5F25101237EA7237EFA0301FE70D2080172 +:20010000C35101FE90D25101110C00197EA7CA510111F8FF197ED610FEC0D25101E1E5363E +:20012000A023237E1F1F1F1FE60F4F232323237E321D20D6101F1FE630B11F5F1600213A48 +:200140000F19791F7ED24C011F1F1F1FE60F321C20E1111200193EABBDC2ED002163207ECF +:20016000A7F283013EFF32C420CD5E027E17F67FA677F28301E501090009CD59037323721C +:200180002371E1011200093EABBDC25F012ABE207DB4C29801212A2022C020AF32BD207EC9 +:2001A000A7F2B101CD5E023ABD20A7CCC90222BE20111300193E63BDC2BE01212A203AC0F1 +:2001C00020BDC29F012114207EA7CAD40135C2D401AFD30121092035F20802362221042060 +:2001E0007EA7CAF601C6992777C2F601EB21C42034C29D03EB342103207EA7CA0802C69922 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/spram.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/sprom.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/sprom.vhd new file mode 100644 index 00000000..a81ac959 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/GunFight_MiST/rtl/sprom.vhd @@ -0,0 +1,82 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_aclr_a : STRING; + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/LunarRescue.qpf b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/LunarRescue.qpf new file mode 100644 index 00000000..76b4c91f --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/LunarRescue.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2013 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.0 Build 162 10/23/2013 SJ Web Edition +# Date created = 21:27:39 November 20, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "21:27:39 November 20, 2017" + +# Revisions + +PROJECT_REVISION = "LunarRescue" diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/LunarRescue.qsf b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/LunarRescue.qsf new file mode 100644 index 00000000..51170b9a --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/LunarRescue.qsf @@ -0,0 +1,168 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 19:49:43 June 08, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# LunarRescue_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION "13.1 SP4.26" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY LunarRescue_mist +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== +set_global_assignment -name EDA_OUTPUT_DATA_FORMAT NONE -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# ------------------------------ +# start ENTITY(LunarRescue_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(LunarRescue_mist) +# ---------------------------- +set_global_assignment -name SYSTEMVERILOG_FILE rtl/LunarRescue_mist.sv +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/LunarRescue_memory.sv +set_global_assignment -name VHDL_FILE rtl/sprom.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/LunarRescue_Overlay.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name VHDL_FILE rtl/roms/col.vhd +set_global_assignment -name QIP_FILE ../../../common/CPU/T80/T80.qip +set_global_assignment -name QIP_FILE ../../../common/mist/mist.qip +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/LunarRescue.sdc b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/LunarRescue.sdc new file mode 100644 index 00000000..f91c127c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/LunarRescue.sdc @@ -0,0 +1,126 @@ +## Generated SDC file "vectrex_MiST.out.sdc" + +## Copyright (C) 1991-2013 Altera Corporation +## Your use of Altera Corporation's design tools, logic functions +## and other software and tools, and its AMPP partner logic +## functions, and any output files from any of the foregoing +## (including device programming or simulation files), and any +## associated documentation or information are expressly subject +## to the terms and conditions of the Altera Program License +## Subscription Agreement, Altera MegaCore Function License +## Agreement, or other applicable license agreement, including, +## without limitation, that your use is for the sole purpose of +## programming logic devices manufactured by Altera and sold by +## Altera or its authorized distributors. Please refer to the +## applicable agreement for further details. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition" + +## DATE "Sun Jun 24 12:53:00 2018" + +## +## DEVICE "EP3C25E144C8" +## + +# Clock constraints + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty + +# tsu/th constraints + +# tco constraints + +# tpd constraints + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + + + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] + +#************************************************************** +# Create Generated Clock +#************************************************************** + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + +#************************************************************** +# Set Input Delay +#************************************************************** + +set_input_delay -add_delay -clock_fall -clock [get_clocks {CLOCK_27}] 1.000 [get_ports {CLOCK_27}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {CONF_DATA0}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DI}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SCK}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}] + +#************************************************************** +# Set Output Delay +#************************************************************** + +set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_L}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_R}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {LED}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {VGA_*}] + +#************************************************************** +# Set Clock Groups +#************************************************************** + +set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}] + +#************************************************************** +# Set False Path +#************************************************************** + + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + +set_multicycle_path -to {VGA_*[*]} -setup 2 +set_multicycle_path -to {VGA_*[*]} -hold 1 + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/README LunarRescue.txt b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/README.txt similarity index 100% rename from Arcade_MiST/Midway-Taito 8080 Hardware/README LunarRescue.txt rename to Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/README.txt diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/clean.bat b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/LunarRescue_Overlay.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/LunarRescue_Overlay.vhd new file mode 100644 index 00000000..8ec20801 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/LunarRescue_Overlay.vhd @@ -0,0 +1,366 @@ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + + + +--Not Cleaned, iam to lazy for this + + +entity LunarRescue_Overlay is + port( + Video : in std_logic; + Overlay : in std_logic; + CLK : in std_logic; + Rst_n_s : in std_logic; + HSync : in std_logic; + VSync : in std_logic; + CAB : in std_logic_vector(9 downto 0); + O_VIDEO_R : out std_logic; + O_VIDEO_G : out std_logic; + O_VIDEO_B : out std_logic; + O_HSYNC : out std_logic; + O_VSYNC : out std_logic + ); +end LunarRescue_Overlay; + +architecture rtl of LunarRescue_Overlay is + + signal HCnt : std_logic_vector(11 downto 0); + signal VCnt : std_logic_vector(11 downto 0); + signal HSync_t1 : std_logic; + signal Overlay_A1 : boolean; + signal Overlay_A1_VCnt : boolean; + signal Overlay_A2 : boolean; + signal Overlay_A3 : boolean; + signal Overlay_A3_VCnt : boolean; + signal Overlay_A4 : boolean; + signal Overlay_A4_VCnt : boolean; + + signal Overlay_R1 : boolean; + signal Overlay_R1_VCnt : boolean; + signal Overlay_R2 : boolean; + signal Overlay_R3 : boolean; + + signal Overlay_Y1 : boolean; + signal Overlay_Y1_VCnt : boolean; + signal Overlay_Y2 : boolean; + signal Overlay_Y3 : boolean; + signal Overlay_Y4 : boolean; + signal Overlay_Y4_VCnt : boolean; + signal Overlay_Y5 : boolean; + signal Overlay_Y5_VCnt : boolean; + + signal Overlay_G1 : boolean; + signal Overlay_G1_VCnt : boolean; + signal Overlay_G2 : boolean; + signal Overlay_G3 : boolean; + signal Overlay_G4 : boolean; + signal Overlay_G4_VCnt : boolean; + + signal Overlay_P1 : boolean; + signal Overlay_P2 : boolean; + signal Overlay_P2_VCnt : boolean; + signal Overlay_P3 : boolean; + signal Overlay_P3_VCnt : boolean; + signal Overlay_P4 : boolean; + signal Overlay_P4_VCnt : boolean; + + signal VideoRGB : std_logic_vector(2 downto 0); + signal COLOR : std_logic_vector(3 downto 0); + +begin + process (Rst_n_s, Clk) + variable cnt : unsigned(3 downto 0); + begin + if Rst_n_s = '0' then + cnt := "0000"; + elsif Clk'event and Clk = '1' then + if cnt = 9 then + cnt := "0000"; + else + cnt := cnt + 1; + end if; + end if; + end process; + + p_overlay : process(Rst_n_s, Clk) + variable HStart : boolean; + begin + if Rst_n_s = '0' then + HCnt <= (others => '0'); + VCnt <= (others => '0'); + HSync_t1 <= '0'; + + Overlay_G1 <= false; + Overlay_G1_VCnt <= false; + Overlay_G2 <= false; + Overlay_G3 <= false; + Overlay_G4 <= false; + Overlay_G4_VCnt <= false; + + Overlay_A1 <= false; + Overlay_A1_VCnt <= false; + Overlay_A2 <= false; + Overlay_A3 <= false; + Overlay_A3_VCnt <= false; + Overlay_A4 <= false; + Overlay_A4_VCnt <= false; + + Overlay_R1 <= false; + Overlay_R1_VCnt <= false; + Overlay_R2 <= false; + Overlay_R3 <= false; + + Overlay_Y1 <= false; + Overlay_Y1_VCnt <= false; + Overlay_Y2 <= false; + Overlay_Y3 <= false; + Overlay_Y4 <= false; + Overlay_Y4_VCnt <= false; + Overlay_Y5 <= false; + Overlay_Y5_VCnt <= false; + + Overlay_P1 <= false; + Overlay_P3 <= false; + Overlay_P3_VCnt <= false; + Overlay_P4 <= false; + Overlay_P4_VCnt <= false; + + elsif Clk'event and Clk = '1' then + HSync_t1 <= HSync; + HStart := (HSync_t1 = '0') and (HSync = '1'); + + if HStart then + HCnt <= (others => '0'); + else + HCnt <= HCnt + "1"; + end if; + + if (VSync = '0') then + VCnt <= (others => '0'); + elsif HStart then + VCnt <= VCnt + "1"; + end if; + + if HStart then + if (Vcnt >= 0) and (Vcnt <= 99) then + Overlay_A1_VCnt <= true; + else + Overlay_A1_VCnt <= false; + end if; + + if (Vcnt >= 100) and (Vcnt <= 149 ) then + Overlay_R1_VCnt <= true; + else + Overlay_R1_VCnt <= false; + end if; + + if (Vcnt >= 150) and (Vcnt <= 240) then + Overlay_Y1_VCnt <= true; + else + Overlay_Y1_VCnt <= false; + end if; + + if (Vcnt >= 236) and (Vcnt <= 16) then + Overlay_G1_VCnt <= true; + else + Overlay_G1_VCnt <= false; + end if; + + if (Vcnt >= 0) and (Vcnt <= 72) then + Overlay_G4_VCnt <= true; + Overlay_Y5_VCnt <= true; + else + Overlay_G4_VCnt <= false; + Overlay_Y5_VCnt <= false; + end if; + + if (Vcnt >= 73) and (Vcnt <= 200) then + Overlay_P3_VCnt <= true; + else + Overlay_P3_VCnt <= false; + end if; + + if (Vcnt >= 224) and (Vcnt <= 230) then + Overlay_P4_VCnt <= true; + else + Overlay_P4_VCnt <= false; + end if; + + if (Vcnt >= 160) and (Vcnt <= 166 ) then + Overlay_A3_VCnt <= true; + else + Overlay_A3_VCnt <= false; + end if; + + if (Vcnt >= 24 ) and (Vcnt <= 230 ) then + Overlay_A4_VCnt <= true; + else + Overlay_A4_VCnt <= false; + end if; + + if (Vcnt >= 32 ) and (Vcnt <= 222 ) then + Overlay_P2_VCnt <= true; + else + Overlay_P2_VCnt <= false; + end if; + end if; + + if (Vcnt >= 42 ) and (Vcnt <= 216 ) then------------------------------------ + Overlay_Y4_VCnt <= true; + else + Overlay_Y4_VCnt <= false; + end if; + + if (HCnt = 518)then--ok + if Overlay_A1_VCnt then Overlay_A1 <= true; end if; + if Overlay_R1_VCnt then Overlay_R1 <= true; end if; + if Overlay_Y1_VCnt then Overlay_Y1 <= true; end if; + elsif (HCnt >= 540) then + if Overlay_A1_VCnt then Overlay_A1 <= false; end if; + if Overlay_R1_VCnt then Overlay_R1 <= false; end if; + if Overlay_Y1_VCnt then Overlay_Y1 <= false; end if; + end if; + + if (HCnt = 528)then--check + if Overlay_G1_VCnt then Overlay_G1 <= true; end if; + elsif (HCnt >= 540) then + if Overlay_G1_VCnt then Overlay_G1 <= false; end if; + end if; + + if (HCnt = 486) then--ok + Overlay_R2 <= true; + elsif (HCnt = 502) then + Overlay_R2 <= false; + end if; + + if (HCnt = 438) then--ok + Overlay_Y2 <= true; + elsif (HCnt = 470) then + Overlay_Y2 <= false; + end if; + + if (HCnt = 373) then--ok + Overlay_G2 <= true; + elsif (HCnt = 445) then + Overlay_G2 <= false; + end if; + + if (HCnt = 324) then--ok + Overlay_P1 <= true; + elsif (HCnt = 380) then + Overlay_P1 <= false; + end if; + + if (HCnt = 275) then--ok + Overlay_A2 <= true; + elsif (HCnt = 327) then + Overlay_A2 <= false; + end if; + + if (HCnt = 210) then--ok + Overlay_Y3 <= true; + elsif (HCnt = 274) then + Overlay_Y3 <= false; + end if; + + if (HCnt = 166) then--ok + Overlay_R3 <= true; + elsif (HCnt = 214) then + Overlay_R3 <= false; + end if; + + if (HCnt = 70) then--ok + Overlay_G3 <= true; + elsif (HCnt = 170) then + Overlay_G3 <= false; + end if; + + if (HCnt = 70) then--check + if Overlay_P4_VCnt then Overlay_P4 <= true; end if; + elsif (HCnt = 86) then + if Overlay_P4_VCnt then Overlay_P4 <= false; end if; + end if; + + if (HCnt = 0) then--ok + if Overlay_Y5_VCnt then Overlay_Y5 <= true; end if; + if Overlay_P3_VCnt then Overlay_P3 <= true; end if; + elsif (HCnt = 70) then + if Overlay_Y5_VCnt then Overlay_Y5 <= false; end if; + if Overlay_P3_VCnt then Overlay_P3 <= false; end if; + end if; + + if (HCnt = 164) then--check + if Overlay_A3_VCnt then Overlay_A3 <= true; end if; + elsif (HCnt = 172) then + if Overlay_A3_VCnt then Overlay_A3 <= false; end if; + end if; + + if (HCnt = 118) then--check + if Overlay_A4_VCnt then Overlay_A4 <= true; end if; + elsif (HCnt = 134) then + if Overlay_A4_VCnt then Overlay_A4 <= false; end if; + end if; + + if (HCnt = 102) then--check + if Overlay_P2_VCnt then Overlay_P2 <= true; end if; + elsif (HCnt = 118) then + if Overlay_P2_VCnt then Overlay_P2 <= false; end if; + end if; + + if (HCnt = 86) then--check + if Overlay_Y4_VCnt then Overlay_Y4 <= true; end if; + elsif (HCnt = 102) then + if Overlay_Y4_VCnt then Overlay_Y4 <= false; end if; + end if; + + if (HCnt = 486) then--ok + if Overlay_G4_VCnt then Overlay_G4 <= true; end if; + elsif (HCnt = 470) then + if Overlay_G4_VCnt then Overlay_G4 <= false; end if; + end if; + + end if; + end process; + + p_video_out_comb : process(Video) + begin + if (Video = '0') then + VideoRGB <= "000"; + elsif Overlay_R1 or Overlay_R2 or (Overlay_R3 and not Overlay_A3) then--Red + VideoRGB <= "100"; + elsif Overlay_A1 or Overlay_A2 or Overlay_A3 or Overlay_A4 then--Aqua + VideoRGB <= "011"; + elsif (Overlay_Y1 and not Overlay_G1) or Overlay_Y2 or Overlay_Y3 or Overlay_Y4 or Overlay_Y5 then--Yellow + VideoRGB <= "110"; + elsif Overlay_G1 or Overlay_G2 or (Overlay_G3 and not (Overlay_P4 or Overlay_A4 or Overlay_P2 or Overlay_Y4))-- or Overlay_G4 + then + VideoRGB <= "010"; + elsif Overlay_P1 or Overlay_P2 or Overlay_P3 or Overlay_P4 then--Purple + VideoRGB <= "101"; +-- elsif not (Overlay_G4) then--white + else + VideoRGB <= "111";-- end if; + end if; + end process; + +colPROM: entity work.col +port map( + clk => Clk, + addr => CAB, --should be Video Counters + data => COLOR +); + O_VIDEO_R <= VideoRGB(2) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_G <= VideoRGB(1) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_B <= VideoRGB(0) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + +-- O_VIDEO_R <= COLOR(2); +-- O_VIDEO_G <= COLOR(1); +-- O_VIDEO_B <= COLOR(0); + O_HSYNC <= HSync; + O_VSYNC <= VSync; + + +end; \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/LunarRescue_memory.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/LunarRescue_memory.sv new file mode 100644 index 00000000..3f7ca5bf --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/LunarRescue_memory.sv @@ -0,0 +1,103 @@ +module LunarRescue_memory( +input Clock, +input RW_n, +input [15:0]Addr, +input [15:0]Ram_Addr, +output [7:0]Ram_out, +input [7:0]Ram_in, +output [7:0]Rom_out +); + +wire [7:0]rom_data_0; +wire [7:0]rom_data_1; +wire [7:0]rom_data_2; +wire [7:0]rom_data_3; +wire [7:0]rom_data_4; +wire [7:0]rom_data_5; + + +sprom #( + .init_file("./roms/lrescue_1.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_h ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_0) + ); + +sprom #( + .init_file("./roms/lrescue_2.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_g ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_1) + ); + +sprom #( + .init_file("./roms/lrescue_3.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_f ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_2) + ); + +sprom #( + .init_file("./roms/lrescue_4.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_e ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_3) + ); + +sprom #( + .init_file("./roms/lrescue_5.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_i ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_4) + ); + +sprom #( + .init_file("./roms/lrescue_6.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_j ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_5) + ); + +always @(Addr, rom_data_0, rom_data_1, rom_data_2, rom_data_3, rom_data_4, rom_data_5) begin + Rom_out = 8'b00000000; + case (Addr[15:11]) + 5'b00000 : Rom_out = rom_data_0; + 5'b00001 : Rom_out = rom_data_1; + 5'b00010 : Rom_out = rom_data_2; + 5'b00011 : Rom_out = rom_data_3; + 5'b01000 : Rom_out = rom_data_4; + 5'b01001 : Rom_out = rom_data_5; + default : Rom_out = 8'b00000000; + endcase +end + +spram #( + .addr_width_g(13), + .data_width_g(8)) +u_ram0( + .address(Ram_Addr[12:0]), + .clken(1'b1), + .clock(Clock), + .data(Ram_in), + .wren(~RW_n), + .q(Ram_out) + ); +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/LunarRescue_mist.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/LunarRescue_mist.sv new file mode 100644 index 00000000..e09110e2 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/LunarRescue_mist.sv @@ -0,0 +1,209 @@ +module LunarRescue_mist( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Lunar Resc.;;", + "O2,Rotate Controls,Off,On;", + "O34,Scanlines,Off,25%,50%,75%;", + "O5,Overlay, On, Off;", + "T6,Reset;", + "V,v1.20.",`BUILD_DATE +}; + +assign LED = 1; +assign AUDIO_R = AUDIO_L; + + +wire clk_sys; +wire pll_locked; +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_sys) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0,joystick_1; +wire scandoublerD; +wire ypbpr; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; +wire [7:0] audio; +wire hsync,vsync; +wire hs, vs; +wire r,g,b; + +wire [15:0]RAB; +wire [15:0]AD; +wire [7:0]RDB; +wire [9:0]CAB; +wire [7:0]RWD; +wire [7:0]IB; +wire [5:0]SoundCtrl3; +wire [5:0]SoundCtrl5; +wire Rst_n_s; +wire RWE_n; +wire Video; +wire HSync; +wire VSync; + +invaderst invaderst( + .Rst_n(~(status[0] | status[6] | buttons[1])), + .Clk(clk_sys), + .ENA(), + .Coin(btn_coin), + .Sel1Player(~btn_one_player), + .Sel2Player(~btn_two_players), + .Fire(~m_fire), + .MoveLeft(~m_left), + .MoveRight(~m_right), + .DIP(dip), + .RDB(RDB), + .IB(IB), + .RWD(RWD), + .RAB(RAB), + .AD(AD), + .SoundCtrl3(SoundCtrl3), + .SoundCtrl5(SoundCtrl5), + .Rst_n_s(Rst_n_s), + .RWE_n(RWE_n), + .Video(Video), + .CAB(CAB), + .HSync(HSync), + .VSync(VSync) + ); + +LunarRescue_memory LunarRescue_memory ( + .Clock(clk_sys), + .RW_n(RWE_n), + .Addr(AD), + .Ram_Addr(RAB), + .Ram_out(RDB), + .Ram_in(RWD), + .Rom_out(IB) + ); + +invaders_audio invaders_audio ( + .Clk(clk_sys), + .S1(SoundCtrl3), + .S2(SoundCtrl5), + .Aud(audio) + ); + +LunarRescue_Overlay LunarRescue_Overlay ( + .Video(Video), + .Overlay(~status[5]), + .CLK(clk_sys), + .Rst_n_s(Rst_n_s), + .HSync(HSync), + .VSync(VSync), + .CAB(CAB), + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs) + ); + +mist_video #(.COLOR_DEPTH(3)) mist_video( + .clk_sys(clk_sys), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r,r}), + .G({g,g,g}), + .B({b,b,b}), + .HSync(hs), + .VSync(vs), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .rotate({1'b0,status[2]}), + .scandoubler_disable(scandoublerD), + .scanlines(status[4:3]), + .ce_divider(1), + .ypbpr(ypbpr) + ); + +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac dac ( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +wire m_left = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_left | joystick_0[1] | joystick_1[1]; +wire m_right = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_right | joystick_0[0] | joystick_1[0]; +wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_left = 0; +reg btn_right = 0; +reg btn_down = 0; +reg btn_up = 0; +reg btn_fire1 = 0; +reg btn_coin = 0; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h75: btn_up <= key_pressed; // up + 'h72: btn_down <= key_pressed; // down + 'h6B: btn_left <= key_pressed; // left + 'h74: btn_right <= key_pressed; // right + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h29: btn_fire1 <= key_pressed; // Space + endcase + end +end + + + +endmodule diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/invaders.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/invaders.vhd new file mode 100644 index 00000000..ed759c73 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/invaders.vhd @@ -0,0 +1,245 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaderst is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire : in std_logic; + MoveLeft : in std_logic; + MoveRight : in std_logic; + DIP : in std_logic_vector(7 downto 0); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0); + SoundCtrl5 : out std_logic_vector(5 downto 0); + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + CAB : out std_logic_vector(9 downto 0); + HSync : out std_logic; + VSync : out std_logic + ); +end invaderst; + +architecture rtl of invaderst is + + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(6 downto 2); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; +begin + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; + + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; + if WD_Cnt = 255 then + Rst_n_s_i <= '0'; + end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then + WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then + if Sounds(0) = '1' and Old_S0 = '0' then + WD_Cnt <= WD_Cnt + 1; + end if; + if PortWr(6) = '1' then + WD_Cnt <= (others => '0'); + end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: entity work.mw8080 + port map( + Rst_n => Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + CAB => CAB, + Video => Video, + HSync => HSync, + VSync => VSync); + + with AD_i(9 downto 8) select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + S when others; + + GDB0(0) <= DIP(7); + GDB0(1) <= DIP(6); + GDB0(2) <= DIP(5); + GDB0(3) <= '1'; + GDB0(4) <= not Fire; + GDB0(5) <= not MoveLeft; + GDB0(6) <= not MoveRight; + GDB0(7) <= DIP(4); + + GDB1(0) <= not Coin; + GDB1(1) <= not Sel2Player; + GDB1(2) <= not Sel1Player; + GDB1(3) <= '1'; + GDB1(4) <= not Fire; + GDB1(5) <= not MoveLeft; + GDB1(6) <= not MoveRight; + GDB1(7) <= '1'; + + GDB2(0) <= DIP(3); + GDB2(1) <= DIP(2); + GDB2(2) <= '0';--TILT + GDB2(3) <= DIP(1); + GDB2(4) <= not Fire; + GDB2(5) <= not MoveLeft; + GDB2(6) <= not MoveRight; + GDB2(7) <= '1'; + + PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; + PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; + PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; + PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; + PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + OldSample := '0'; + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0); + end if; + if PortWr(4) = '1' and OldSample = '0' then + D5(15 downto 8) <= DB; + D5(7 downto 0) <= D5(15 downto 8); + end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0); + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/invaders_audio.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/mw8080.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/mw8080.vhd new file mode 100644 index 00000000..7a8f0d58 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/mw8080.vhd @@ -0,0 +1,337 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + CAB : out std_logic_vector(9 downto 0); + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n, Rd_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + CAB <= std_logic_vector(CntE7(4 downto 0)) & std_logic_vector(CntE5(4 downto 0)); + + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/pll.qip b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/pll.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/pll.vhd new file mode 100644 index 00000000..d65b9f9b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/pll.vhd @@ -0,0 +1,350 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire4_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire4_bv(0 DOWNTO 0) <= "0"; + sub_wire4 <= To_stdlogicvector(sub_wire4_bv); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + sub_wire2 <= inclk0; + sub_wire3 <= sub_wire4(0 DOWNTO 0) & sub_wire2; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_UNUSED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire3, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/col.bin b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/col.bin new file mode 100644 index 00000000..e65c5a07 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/col.bin @@ -0,0 +1 @@ +                                                                                                             \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/col.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/col.vhd new file mode 100644 index 00000000..f798fd72 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/col.vhd @@ -0,0 +1,86 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity col is +port ( + clk : in std_logic; + addr : in std_logic_vector(9 downto 0); + data : out std_logic_vector(3 downto 0) +); +end entity; + +architecture prom of col is + type rom is array(0 to 1023) of std_logic_vector(3 downto 0); + signal rom_data: rom := ( + "1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111", + "1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111", + "1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111", + "1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111", + "1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111", + "1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111", + "1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111", + "1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111","1111", + "1101","1101","1100","1100","1100","1100","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1100","1001","1111","1110","1110", + "1101","1101","1100","1100","1100","1110","1111","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1100","1001","1111","1110","1110", + "1101","1101","1100","1100","1011","1110","1111","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1100","1001","1111","1110","1110", + "1101","1101","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1100","1001","1111","1110","1110", + "1101","1101","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1100","1001","1111","1110","1110", + "1101","1101","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1100","1001","1111","1110","1110", + "1101","1101","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1100","1001","1111","1110","1110", + "1011","1011","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1110","1110", + "1011","1011","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1110","1110", + "1011","1011","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1001","1001", + "1011","1011","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1001","1001", + "1011","1011","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1001","1001", + "1011","1011","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1001","1001", + "1011","1011","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1001","1001", + "1011","1011","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1001","1001", + "1011","1011","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1001","1001", + "1011","1011","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1001","1001", + "1011","1011","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1001","1001", + "1011","1011","1100","1101","1011","1110","1100","1100","1110","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1001","1001", + "1011","1011","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1101","1101", + "1011","1011","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1101","1101", + "1011","1011","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1101","1101", + "1011","1011","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1101","1101", + "1011","1011","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1101","1101", + "1111","1111","1100","1101","1011","1110","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1101","1101", + "1111","1111","1100","1100","1011","1110","1111","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1101","1101", + "1111","1111","1011","1100","1100","1110","1111","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1101","1101", + "1111","1111","1100","1100","1100","1100","1100","1100","1001","1001","1001","1101","1101","1101","1101","1110", + "1110","1110","1011","1011","1011","1100","1100","1100","1100","1101","1101","1111","1001","1111","1101","1100"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_1.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_1.hex new file mode 100644 index 00000000..5ff2d9cd --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_1.hex @@ -0,0 +1,129 @@ +:10000000000000C34B160000F5C5D5E5C3E70500A9 +:10001000F5C5D5E53E8032BE2021C02035CD4B0A46 +:10002000DB010FDA66003AEA20A7CA42003AEB2069 +:10003000FE09D23E00C6012732EB20CDAC0AAF321A +:10004000EA203AE920A7C260003AEF20A7C2E60EF4 +:100050003AEB20A7C26B003ABF21A7C2E60E000010 +:10006000E1D1C1F1FBC93E01C33F003A5820A7C20C +:1000700060003E01CDDC08310024FBCDA401CDBDE4 +:100080000A21133011501D0E04CD2A05D3063AEB78 +:10009000203DCD974A0E14C28901116A0BCD2A0565 +:1000A000DB01E604CA8E000699AF32EE203AEB205F +:1000B000802732EB20CDAC0ACD184C22F82022FC50 +:1000C00020CDD402CDDF02CDEA02CDC5480620CD39 +:1000D0000049CDA401CD9805CDAC4C21010122E50C +:1000E00020CDB447CD4C4CCD8F02CDE349CDD402C9 +:1000F0000000000000CDF202CDCA01CD6102CD7931 +:1001000002CD4602CDA901CD781F3A2720A7D306FC +:10011000CA0A01CD1210C223013A2820FE02D306DA +:10012000C213012129203600CD30040000002A2D01 +:10013000203A2C20FEFE010014C4850109221D2056 +:10014000CD6D0D2113203601215E207EA7C2304CDB +:100150002114207EA7C2AA04215D207EA7C26203CB +:10016000CD770CD3063A1D20FEB0DC7F023A1D206D +:10017000FEB0D4580D3A1620A7CC9D0DCD054CCD20 +:100180007B48C34801010010C911550BCD2A05DB7E +:10019000010F0FDA9D010FDAA700C38E0006983E0B +:1001A00001C3AA003E01C3AA01AF32E920C9000081 +:1001B00000000000C9C5E51A772B1B0DC2B701E18D +:1001C00001200009C105C2B501C9210224119118FD +:1001D000010318CD1B0C21052401030ACD1B0C21A2 +:1001E000043D11D818010318CDB50121C73E11F601 +:1001F0001801030ACDB5012102270E17113118D5B8 +:10020000C50608CD000AC1D10DC35B1D11EB19C590 +:100210000608CD000AC10DC20C02CD22172E000E19 +:10022000067EE680C43002110500190DC22102C904 +:10023000E5C57EE67F47235E2356234E237E67690E +:10024000CD000AC1E1C9CD22172EACC3CA4B002193 +:100250000127111718C50610CD000AC10DC25202A0 +:10026000C9211C250E0E11F319C5E50605CD000A9E +:10027000E12424C10DC26602C911131AC3A90D3AA3 +:100280001320A7C82126207EA7C03601C36D0DCD3F +:1002900022172EAE4E79A7C8211B3BC5110B1AE5BC +:1002A0000608CD000AE12525C10DC29B02C9000048 +:1002B00000C9000000C9CD8C052311F5201ABE1B12 +:1002C0002B1ACAC902D0C3CB02BED07E1213237E22 +:1002D00012C3004706C011A31A210020C3040B0655 +:1002E000C021002111A31BC3040B06C0210022C39F +:1002F000E402060121292070CD22172E40702E56CF +:1003000070C90600C3F402060121292070CD22170E +:100310002E70702E9070217020702E7C702E887040 +:10032000C90600C30903CDA401CD2103CD020321D9 +:1003300013203600CD9D4ACD14492A1D20010310FB +:10034000CD300C0E0411231AC52A1D20010210CD38 +:10035000180C3E08CDD505C10DC24803CD1949C3BF +:10036000CB05CD26030000C3A54A2EAC3500CAB08C +:1003700004CD424BC3C61E3AEF20A7C83AC620C3DD +:10038000440A00003600CD744CCD224FCD2103C36A +:10039000B91FCD22172EAE34E5CD8F02E12EA07EFF +:1003A000A7CAD4032EAE7EFE06CC0E04CDCB05CD5F +:1003B00022172EA25E2356EBCD0A4FCDA44CCDCBF7 +:1003C00005CDB54CCD22172EAB342EAF342E000602 +:1003D000AACDE402CDCB05C90000211B3D79A7C8F9 +:1003E0000025253DD306C2E103C50610CD340ACD54 +:1003F0004249000000E5CDF549CD0A4F3E10CDD56C +:1004000005E1000000000000C10DC2E903C9C521DB +:10041000142A11AD1E0E10CDB305CD004D00000005 +:100420000000000000215000CD0A4F000000C1C9AB +:10043000CD22172E2D7EFE04210625D44604114A16 +:1004400004060DC3000A21063DC93E083E003E2AAF +:10045000003E02003E2810000000000000000000E6 +:10046000000000000000003600CD020321132036FA +:1004700000CDD20D3AAE20A7C2290621010122A04B +:10048000203AA120A7D306C28104CD8316211320D0 +:100490003601211B203601CD070321162036012A03 +:1004A0009E203A9D2047C3340A00CD6704C35801FB +:1004B000CDB602CDD4020000AF32EE20CDA401CDE6 +:1004C0000203CD210321132D11634B0E0ACDB30579 +:1004D000CD974B3AE320A7C40A47CDC04CCDF84C8A +:1004E000CD864BCDCB05CDA901C37316CD8C05238D +:1004F00011F5201ABE1B2B1ACAC902D0C3CB0200A9 +:1005000000000000000000000000F378D305060A98 +:100510000E000DC2120505C21005FBC94E2346236D +:1005200079867723788677C90E021AD5CD3605D11C +:10053000130DC22A05C9CD9B0B0605D306CD000AB3 +:10054000C5AF770120000977097709C1C9CD8C05AE +:100550003AF120A7C8AF32F120E52AF220EBE17E84 +:100560008327775F237E8A277757237E23666F7AD8 +:10057000CD74057BD5F50F0F0F0FE60FCD8705F175 +:10058000E60FCD8705D1C9C61CC336053AC6200F74 +:1005900021F820D821FC20C92101240E1C06DFE50A +:1005A000C536001120001905C2A105C1E1230DC205 +:1005B0009D05C9D51ACD3605D13E0732C0203AC0B7 +:1005C000203DC2BE05130DC2B305C93E40C3D505CB +:1005D0003E80C3D50532C0203AC020A7D306C2D87A +:1005E00005C900000000003ADC20A7CA8C0EDB0120 +:1005F000E606C41606CD7C03E610060121CB20C218 +:100600000B067EA723C20B062B0600702AD92023D7 +:1006100022D920C360003E0132E120C9210000221E +:10062000CB20C9CD4208C3A0063AEF20A7C8E1C33A +:10063000620300000000003E20C3D5053E05C3D57F +:1006400005015006CD7C03E660CA55060DC244067E +:1006500005C24406C9E1C921CB2011C208061ACD42 +:10066000040B000000000000119A082117270E1744 +:10067000CD2A05211227115B1CCD0407211027CD9F +:100680000407210E270E05CD0607210E331143095D +:100690000628CD000A11B1080E1021062ACD2A0520 +:1006A0003ADC20A7CA78083ADA20FE20D27808CDB2 +:1006B0001607CD7C03E660FE40CC2F07FE20CC85DC +:1006C000073AE120A7C278083ACC20A7C2CF070199 +:1006D0003001CD2607CD1E073ADA20FE1DC2A00646 +:1006E0000605C521062A0620CDEB09CD3C0611B131 +:1006F0000821062A0E04CD2A05CD3C06C105C2E21A +:1007000006C3A0060E0B0605CD000AC5016001094F +:10071000C10DC20607C92ADD203E2AC336052ADDDF +:10072000203E1BC336050DC2260705C22607C9CDCC +:100730004106CD1E072ADD207DFE11CA6007FE0F8F +:10074000CA69077CFE33CA740724247CFE35D25460 +:1007500007C35A07CD1E07210D3622DD20C3160719 +:100760007CFE3BD27907C36F077CFE3BD27F072418 +:1007700024C35A072634C34907210F27C35A072128 +:100780000D27C35A07CD4106CD1E072ADD207DFE69 +:1007900011CAA907FE0FCABA077CFE28DAC307FEF2 +:1007A00034C2AF072633C3AF077CFE28DAB407256F +:1007B00025C35A07211127C35A077CFE28DAC90727 +:1007C000C3AF07210F3BC35A0721113BC35A07018F +:1007D000FF20CD26073ADB20FE0AD25D083ADD2055 +:1007E000FE11CAFD07FE0FCA03083ADE20FE32D210 +:1007F0000B08CD3B08C616CD4208C3A006CD3B086A +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_2.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_2.hex new file mode 100644 index 00000000..c79ee941 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_2.hex @@ -0,0 +1,129 @@ +:10000000C32306CD3B08C60BC32306FE35D27808B2 +:100010003ADB20A7CA31082ADF202522DF203E1B39 +:10002000CD360521DB203521CF203ADB20856F3608 +:100030001BCD1C0600000000C3A0063ADE20D62718 +:100040000FC921CF20F53ADB20856FF1772ADF2019 +:10005000CD360522DF2021DB2034C31C063ADD200B +:10006000FE0DC278083AEE20FE32D27008C378083E +:10007000FE36D27808C31008AF32DC20CD2009CD7F +:100080008D08C398050650211E2DC3EB092ACD20EB +:1000900011CF203ADB204FC32A0507082B12020E8E +:1000A0001104111B1B110406081213110013080E72 +:1000B0000D0D000C041B2E2F2F2F2F2F2F2F2F2F26 +:1000C0002F2E000000001B1B1B1B1B1B1B1B1B1BC5 +:1000D000000000011127073000000000325820AF57 +:1000E00032BF21C93AEF20A7C83AC620C3440A3A12 +:1000F000EF20A7CA9247C36203000000000000007F +:10010000000000E5D5110004193E1CCD3605D1E1F3 +:10011000C36F05CD8C057E23666F292929297CC9EB +:100120003ADB20A7CA3709473E0A90373F1FC62D42 +:10013000672E1E22CD20C9211E2D22CD203E0A323F +:10014000DB20C9001F141609001E01011E001F1527 +:10015000150A000000000000000000001F15151126 +:10016000001F08041F001F11110E003AEF20A7CA3C +:100170007F093A1820A7C2380FCD410AC3380F2A89 +:100180001020CDC009E603C291097DFEB5D4A409B3 +:10019000232210207E0FDAAA0F0FDACB0FAF321C0A +:1001A00020C3480F2EA6C900000002010101000271 +:1001B0000202020202020000000000000000000033 +:1001C0003A12203C321220C9CD2C0AC5E51AD304BC +:1001D000DB03AE772313AFD304DB03AE77E101205B +:1001E0000009C105C2CB09C9CD2C0AC5E5AF7723EB +:1001F0007723E101200009C105C2EB09C9CD2C0A12 +:10020000C51A771301200009C105C2000AC9CD2C07 +:100210000AC5E51AD304DB03772313AFD304DB034A +:1002200077E101200009C105C2110AC97DE607D3A3 +:1002300002C31F0BAFC57701200009C105C2350AF3 +:10024000C9C377030FDB02D0DB01C9DB02E604C8B8 +:100250003A5920A7C03100240604C5CD9805C10530 +:10026000C25A0A3E01325920CDA401FB11571C216C +:1002700016300E04CDB305CDCB05C30B4C00000EDC +:100280001C211E24117F0BC32A0521F820C3960AC6 +:1002900021FC20C3960A5E2356237E23666FC30388 +:1002A000090E0721013511541DC32A053AEB2021FF +:1002B000013CC61CC3360521F420C3960ACD340B7D +:1002C000CD7F0ACD8A0ACD900ACDB70ACD2009CDBF +:1002D0008D08CDA10AC3AC0A21BE20461AE680A82B +:1002E000C037C9322B241C16110D0A080706050455 +:1002F000030201342E27221C181513100E0D0C0BAF +:10030000090705FF1A77231305C2040BC9E5232348 +:100310005E2356234E2346E1D55E2356EBD1C9C555 +:1003200006037C1F677D1F6F05C2220B7CE63FF62C +:100330002067C1C92100243600237CFE40C2370B50 +:10034000C906000C041B0E1504111B1B0F0B001813 +:100350000411261B271D1B0E111B1E0F0B0018045A +:1003600011121B011413130E0D1B0E0D0B181B1D68 +:100370000F0B001804111B1B011413130E0D1B1B74 +:1003800012020E11042B1D1B1B1B1B1B1B1B1B1BFB +:100390001B1B1B12020E11042B1E1B115B1CA7C87A +:1003A000E5210000C5010500093DC2A50B19EBC1FF +:1003B000E1C9CD2C0AC5E51AD304DB032FA67723A8 +:1003C000131AD304DB032FA6772313AFD304DB0365 +:1003D0002FA677E101200009C105C2B50BC9CD2CBC +:1003E0000AC5E51AD304DB03A6CAF10B3E0132505D +:1003F00020DB03AE7723130DC2E30BAFD304DB0383 +:10040000A6CA090C3E01325020DB03AE77E1012081 +:100410000009C105C2E10BC9CD2C0AC5E51A772335 +:10042000130DC21D0CE101200009C105C21B0CC93E +:10043000CD2C0AC5E5AF77230DC2350CE1012000B4 +:1004400009C105C2330CC9010010D3060DC24A0C04 +:1004500005C24A0CC9CD2C0AC5E51AD304DB032F0B +:10046000A6772313AFD304DB032FA677E101200087 +:1004700009C105C2580CC9210C207EA7C83600212D +:100480000000220020CD22172E722256200E087E58 +:10049000A7CA9A0CCD3D0DD2D20CCD450DC28F0C02 +:1004A000CD22172E92CDE74C0E047EA7CAB50CCDF7 +:1004B0003D0DD2C90CCD450DC2AA0C0000002A0684 +:1004C0002001F8FA09C3211F00CD500DDADB0CC35F +:1004D000B50CCD500DDADB0CC39A0C3A072023BEC5 +:1004E000D2E60CC3B50CF53E188647F1B8DAF40C29 +:1004F00000C3B50CC34E1E00CD370DE5CD1E490619 +:100500001311B719CDFD09CDE11DE1E50613CDFDB0 +:1005100009CDE11DC3E51E00E1E57DD6086F061893 +:10052000CD7917E10618CD7917C3004F0000000000 +:1005300000000000000000235E2356EBC9233A06AA +:1005400020C608BEC92A56202323232256200DC9BF +:10055000F53E088647F1B8C90000003A1620A7C842 +:100560002125207EA7C0360121292036003A2C20E3 +:10057000FEFE2A2D20010011C4990D090612CD2C72 +:100580000AC53E01AE770000C31E4801200009C124 +:1005900005C2810DC3804F0DC901000DC9219C20EA +:1005A0007EE610110B1AC47902CD22172E2D4E7E35 +:1005B000A7C8237EA7C4C00D2323230DC2B30DC932 +:1005C000E5C523D5CD380DD1D50608CDFD09D1C15E +:1005D000E1C92A1D207CFE3CDAF50DFED4D2F50DD2 +:1005E0007DFE1BDAF50DFE20DAFB0DFE28DA4C0E3F +:1005F000FE30DA760E21AE203601C97CFE44D204EC +:100600000EC3F50DFE56DA420EFE84D2110EC3F56E +:100610000DFE94DA470EFEC4D21E0EC3F50DFED4B5 +:10062000DA260EC3F50DC32F1E00CD221736002388 +:1006300023CD370D229E2078329D2000000000003F +:1006400000C92E00C3311E2E05C3311E7CFE3CD2D4 +:10065000550EC3F50DFE59DA710EFE7DD2620EC342 +:10066000F50DFE96DA6A0EC3F50D2E140630C33E64 +:100670001E2E0FC36C0E7CFE73D27F0EC3F50DFED3 +:100680009CDA870EC3F50D2E19C3451EAF32BE206E +:10069000219C20342150207EA7C4BF0E3AE920A718 +:1006A000C260003AEF20A7CA2547CDDD12215320B2 +:1006B0007EFE01CC9A11CDF04CCDB64FC360003612 +:1006C000002A1D207DFEB8D20C1FFE30DAD50E2187 +:1006D0005D203601C97CFE3CDACF0EFED4D2CF0EAF +:1006E0002114203601C9215320347EE60377CDDD65 +:1006F00012CD040F3AA020A7C4C510CDAB49CD3A06 +:100700004EC360003A5320A7CA1B0FFE01CA9A11BC +:10071000FE02CA5C13FE03CAC214C93A1320A7C85A +:10072000CDAC12CD364C3A1D20FEBADA350F3A1652 +:1007300020A7CA480FC36B09E6600707DAAA0F07AC +:10074000DACB0F211C203600CD9A0F3A1620A7CA0B +:10075000580FCD5310C3690FCD1210C48B0F3A1D23 +:1007600020FE40DA820FCDE70F211D20CD0D0BC5F5 +:10077000D5CDB20B211B20CD1C052A1D20D1C1C314 +:10078000DE0BCD8249CDED0FC3690FC3CB4C347E58 +:10079000E60123233600C036FFC93A1620A7211BE5 +:1007A00020C2A70F36FEC93601C93A1E20211C20DF +:1007B000FEE0D2C60F3A1620A7C2961D3602C348E5 +:1007C0000F3603C3480F3600C3480F3A1E20211CC2 +:1007D00020FE30DAC60F3A1620A7C2E20F36FEC35B +:1007E000480F36FDC3480FCD1210CA1810CD341073 +:1007F000DA2B10C3ED4ECD4810211A20347EE601CD +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_3.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_3.hex new file mode 100644 index 00000000..e4e4a765 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_3.hex @@ -0,0 +1,129 @@ +:10000000112C18CC0E102A23200605C3C80911276D +:1000100018C9CD410AE610C92117207EA7C3674938 +:100020002A23200605112C18C3550C211A20CDFDBA +:100030000FC3F60F2117207EA7C241103601CD73E2 +:100040004F2A23207DFE30C92A1D2001F8030922F2 +:100050002320C92117207EA7C25E10CD48100000C2 +:1000600000000000CD2010CD48100000000000006E +:100070000000219820CD1210CA9510E5211B2036D2 +:1000800002E1C3FC0F0000000000000000000000BF +:100090000000009800E523347EE601211B20C2AB5E +:1000A000103601E1347EE604C300103600C3A3100D +:1000B000CD22172EAD7E21FB19A7C4C11022A72087 +:1000C000C921031AC921A2207EA7C2D610CD8B1D3B +:1000D000CDB010CDFB10CDFB10CD22172EAD7EA7DD +:1000E000C229113AA520FE19DC0411211E203AA6CE +:1000F00020BEDA0B1121A320CD1C0521A520CD0D9A +:100100000BC3C8092100FF22A320C921010022A39B +:1001100020211D203AA520BED21E11C3F5102100BA +:100120000022A020AF32A220C921AD207EA7C23C70 +:10013000113AA520FE19DA3C11C3F5103601210051 +:100140000122A320211E203AA620BED25111C3F5C0 +:100150001021010022A320211D203AA520BED26437 +:1001600011C3F510CD22172EAD3600C31E11CD22BE +:10017000172E2D4EE52B2B2B23CD32123600CD37EB +:100180000D22A5200608CDE809E17EA7C8357EFE30 +:1001900003DA9511C92EAD3601C93A1620A7CC173E +:1001A000162129207EA7C44612CDEB48000000216D +:1001B00088207EA7C8237EA7C2001236012A8A2083 +:1001C0004E7DFE37D42112228A20CD22172E72CDE9 +:1001D0003B12C2ED112A8A2023228A20CD22172E1B +:1001E0008C7EFE04C22C12210000C36F1EE52A8AF9 +:1001F0002023228A20E1CD370D01000909228E201B +:10020000218E20CD0D0BCD550C218E207EFE40DAA7 +:100210002412218C20CD1C05218E20CD0D0BC3C8AE +:10022000092E27C92A8E200603CD79172189203669 +:1002300000C9110300190DC23512C979A7CA4312AA +:10024000CD32127EA7C9112E20CDD80AD8212D205B +:10025000CD0D0BCD180C3A2E20FE28DC9C12FEC8CA +:10026000D4A2123A1620A7CC7612212B20CD1C0541 +:100270002127203601C92A2D200100100911F71766 +:10028000010210CD2C0AC5E51AB67723130DC288DA +:1002900012E101200009C105C28612C9212C2036B5 +:1002A00002C9212C2036FE21282034C93A1620A765 +:1002B000C83A1D20FEB8D0CD1210C2CC12210D209C +:1002C0007EA7C2C8123601C9233601C9210E207E7D +:1002D000A7C836002B36002100203601C921002096 +:1002E0007EA7C8237EA7C2F51236012A1D20010869 +:1002F0000509220620110720CDD80AD0210620CDDD +:100300000D0BCD57172106207EFEB8D24D132104C8 +:1003100020CD1C05CD901DCD2C0AC5E51AD304DBDC +:1003200003A6CA2A133E01320C20DB03AE77231347 +:10033000AFD304DB03A6CA3E133E01320C20DB031D +:10034000AE77E101200009C105C21A13C92A0620AF +:100350000603CD7917210000220020C93A1620A7F4 +:10036000CC3316CD22172E407EA7C25D142E707E90 +:10037000A7C8C3271FC5E57EF5E680CABD13F1F502 +:100380000707223420217B19DC4914223A20F1008E +:10039000000000000000002A3420CD370D22382054 +:1003A000213820CD0D0BCDFD092139207EFEE0D472 +:1003B0004D14213620CD1C052A3820EBF5F1E12320 +:1003C00073237223C10DC275132170207EA7C82329 +:1003D0007EA7C21A1436012A72204E7DFE56D45AC8 +:1003E00014227220CD22172E7ECD3B12C207142A72 +:1003F000722023227220CD22172E8A7EFE04C24351 +:1004000014210000C3731EE52A722023227220E10A +:10041000CD370D01000909227620217620CD0D0B64 +:10042000CD550C2176207EFE40DA3B14217420CD80 +:100430001C05217620CD0D0BC3C8092A76200603A2 +:10044000CD79172171203600C9218E19C9E52A38C6 +:10045000200613CDE809E13628C92E47C9CDA514D9 +:1004600022652021F718226920CD22172E414E2324 +:10047000C5E5CD380D226720CD9B1DCDFD09216836 +:10048000207EFEEAD49814216520CD1C052A672021 +:10049000EBC3A11DC27014C9E52A6720060BCDE885 +:1004A00009E13628C9CD22172EAB7EA7210001C84D +:1004B000FE01210001C8C37B1EC900732372230003 +:1004C00000C93A1620A7CC3F16CD22172E567EA77C +:1004D000C2B7152E907EA7C8E5CD5915223620212A +:1004E000A119223A20E1234E23C5E57EA7CA1215A1 +:1004F000CD370D223820213820CD0D0BCDFD09211F +:1005000039207EFE28DC6E15213620CD1C052A38C8 +:1005100020EBC3B31DC2E914217C207EA7C8237E33 +:10052000A7C2971536012A7E204E7DFE47D4561568 +:10053000227E20CD22172E92CD3B12C289152A7E13 +:100540002023227E20CD22172E8B7EFE04C283150F +:10055000210000C3771E2E37C9CD22172EAB7EA7F0 +:100560002100FFC8FE012100FEC8C3621FC9E52AA1 +:1005700038200613CDE809E136E0C92A82200603B7 +:10058000CD7917217D203600C9E52A7E20C3BE1D06 +:1005900001000909228220218220CD0D0BCD550CAE +:1005A0003A8220FE40DA7B15218020CD1C05218275 +:1005B00020CD0D0BC3C809CD0216226520213919A3 +:1005C000226920CD22172E574E23C5E5CD380D22A6 +:1005D0006720216720CD0D0BCDFD092168207EFE0F +:1005E00028DCF515216520CD1C052A6720EBC3AA60 +:1005F0001DC2CA15C9E52A6720060BCDE809E136F8 +:10060000EDC9CD22172EAB7EA72100FFC8FE012128 +:1006100000FEC8C3911EC92111270E05E5219420B3 +:10062000347EA10603C22F16E111DF19C3000AE1CF +:10063000C3340A210F3B0E01E5219520C32016216A +:1006400008360E04E5219620C32016310024AFD3CE +:1006500003D30421002011A31A0600CD040B2100AE +:100660002111A31B06C0D5CD040B210022D106C049 +:10067000CD040BAFD303D305CDA90100000000FBCF +:10068000C3B546CDCB0521F7182263200000002119 +:1006900039192261200606CD22172E414E23C5E5C9 +:1006A000CD380D2267202A6320C3CB1DC29E162A97 +:1006B0006320110B0019226320C5CD470CCD2217F2 +:1006C0002E574E23C5E5CD380D2267202A6120C361 +:1006D000D61DC2C4162A6120110B0019226120C147 +:1006E00005C29716CDD64FCDF11ECD22172E417ED5 +:1006F000FE0AD2F616342E577EFE0BD2FF1634CDEC +:10070000F61DCD0E17210836CD0E17210F3B06031F +:10071000C3340AEB2A6720060BC3FD090000000062 +:1007200000003AC62067C90001020300010203006D +:1007300001020300010203000102030001020300A1 +:100740000102030101020300010203000102030090 +:1007500001020300010203CD2C0AC5E51AD304DB14 +:10076000032FA6772313AFD304DB032FA677E10172 +:10077000200009C105C25A17C9CD2C0AC5E5AFD35F +:1007800004DB03772300AFD304DB0377E101200010 +:1007900009C105C27C17C9000000008001C003E048 +:1007A00047E047F04FF04FF85DF85DFC7FFC5FFEDF +:1007B0005DFF5DFF0FFF0F011C0118013801700183 +:1007C00070017001F001F001F001F00170017001A1 +:1007D0007001300138011CFF0FFF0FFF5DFE5DFC53 +:1007E0005FFC7FF85DF85DF04FF04FE047E047C0F9 +:1007F000038001000000000000000002019E03E2EF +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_4.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_4.hex new file mode 100644 index 00000000..871ee3ed --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_4.hex @@ -0,0 +1,129 @@ +:1000000007F806E007FC0EFC0EE007F806E2079E84 +:100010000302010000000000012735785E78DEDE73 +:10002000785E78342701003050885030305CCF5CE7 +:1000300030FF7FFFFF7F3FFF7F83CFFFC1FFFFC503 +:10004000D5D1FFC1DDC1FFF3C1D0D8FAFEFEFFFF5D +:10005000FFFFFFFFE0FFFFE0EEE0FFFFE0EEE0FF6D +:10006000FFFFFEFEFAF8C8800080D0D8FAFEFEFE40 +:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2AD +:10008000EAE8FFFFE0EEE0FFFFFFFFFFFFFFFFFDFD +:10009000E4FFFFFFFFFFFFFFFFCCFF33BFFFFFEFDA +:1000A000FF3F8FFFFFF9FFE3E7FFEBDCFF1FDBFF05 +:1000B000FFFFFFFFFBFFFFFFFFFFCFFFFFFDFFE3A2 +:1000C0009FFFFB03FFEF00FFD300FFFF00FFFF00D8 +:1000D000FFFF00FFFB00FF7100FFFFFF7FEF1FD955 +:1000E000F9037FFF019B7F00FE1F00FF03003F001D +:1000F00000070000010000000000101C2242224402 +:10010000221C00000000101C3E1E3E1C00000000CF +:100110000000081C0C1C0800000000000000080C77 +:1001200008000000000000000000080000000000BF +:10013000000000000000000000081424221214082F +:100140000000000000081C3C1E1C0800000000000D +:10015000081C1C1C08000000000000081C1C0800F3 +:100160000000000000000008000000000000000087 +:10017000000000000000000000000000000008086F +:100180001C1E37BFBEF6F6BEBF371E1C0808000097 +:10019000000008081C7E6C78EC786C7E1C08080057 +:1001A0000000000000000C1E96BCF4BC961E0C0063 +:1001B0000000000040F040000000040E143A3E1D14 +:1001C0003D3E1D2E0C040000000000880120044E5E +:1001D00014BA381D39BE340C8A2C014012000002BA +:1001E00007020000000000FC023F020001070F01AF +:1001F0000001031028502810000000000001637C5B +:100200001318000018137C6301000000C032DEF8F0 +:10021000DE32C00010096F7C6F0910000E2E241F03 +:10022000070A1B0000000000008001F00FF81FDC2F +:100230003EF81FF00FF01FE017E02728C9E89104EF +:10024000C1080102004450882870CF241DEF3FE20E +:10025000011A123828484C888C0408023201338075 +:10026000014000008443441B24D817800F8A1FB824 +:100270003FF83FD020DE6FC26FA26EB812E41602C4 +:10028000300000000000000000000000000000003E +:10029000000000000000000000000000000000005E +:1002A0000000000000000004000000B41901030079 +:1002B000000000A709000000000000000000FE0090 +:1002C0000000FB17020C000000000000000000FE10 +:1002D000C8909717023000000000000000000001E5 +:1002E000130000000802000025410000C0006070FB +:1002F00000000000000000000000000000000000FE +:100300000000000000000000000000000000010BE1 +:1003100000000000004717FD000000E71901010080 +:10032000003717FD000000E819010300002717FD42 +:10033000000000E8190103000000000000000000B8 +:10034000000000000000FF000000FB190108000091 +:10035000000000000000000000000000000000009D +:10036000000000000000000000210000000000006C +:1003700000001B1B130008130E1B1B1B00000000BA +:1003800011270730000000000000000000000000FE +:100390000100000000000000051D2F00001D2600C8 +:1003A000001D3990391803299039180331903918F4 +:1003B0000339A049180428A049180430A869180571 +:1003C0002F31480D0A094D564909432C3038480D44 +:1003D000060128280120300118380118E00120E822 +:1003E0000128F00005B07058C04050806860784027 +:1003F0008890A85098683870B00005A0E038785010 +:10040000B06890888040D85848409878C04860408C +:1004100048406000088158B08180A081885081A840 +:1004200040C1B0C0C1A070C190B0C1604000000028 +:1004300000000000040170700168C001984001785C +:10044000B000000000800000000000000000000379 +:100450000000000000000013080B131F2444241F99 +:100460007F494949363E414141227F4141413E7FDA +:10047000494949417F484848403E414145477F08F6 +:1004800008087F00417F4100020101017E7F0814BE +:1004900022417F010101017F2018207F7F10080485 +:1004A0007F3E4141413E7F484848303E4145423DC4 +:1004B0007F484C4A31324949492640407F40407E7E +:1004C0000101017E7C0201027C7F020C027F631429 +:1004D00008146360100F1060434549516100000328 +:1004E000030000000000003E4549513E00217F010D +:1004F00000234549493142414959660C14247F047F +:10050000725151514E1E2949494640474850603664 +:10051000494949363149494A3C08142241000041C1 +:10052000221408141414141422147F1422181818F6 +:100530001818080808080820404D502000007900CD +:100540007900000000C04040404040011C3C786001 +:100550000F1412070211040308131BC2FC0121032C +:10056000280E14C30C0221EF203601C921102C0ED5 +:100570000C119D09C32A05CDCB05C3C61E215D20E4 +:1005800036002127203600233600C93601C36E11FC +:10059000210620C30D0B3603C3480F216720C30D6E +:1005A0000BE1CDBA14C10DC39414E1CDBA14C10D41 +:1005B000C3F115E12373237223C10DC31515232243 +:1005C0007E20E1235E2356EBC39015CD1317E12364 +:1005D00023C10DC3AC16CD1317E12323C10DC3D224 +:1005E000163E05C3D505AF321B20C93E01C3E71D2A +:1005F000215E203601C92EAA347EFE06D40E1E21AD +:10060000532036002A5420CD0A4F211127C9360025 +:100610002EA03601C92E0006AACDE4022EAB342E40 +:10062000B03601C3E1000000000000000000002E11 +:100630000AE52115000610225420E1C32A0EE52107 +:100640001000C3371E0630E5210500C3371EE57DC7 +:10065000FE92D2651EFE7ED26A1E2E8C34E12B2BBA +:100660003600C3F80C2E8BC35C1E2E8AC35C1E2280 +:100670008820C9227020C9227C20C9FE02210002E4 +:10068000C8FE03210002C8FE04210002C8210003A5 +:10069000C9FE022100FEC8FE032100FDC8FE0421A0 +:1006A00000FEC8FE052100FDC82100FDC9010E0D98 +:1006B00014121B211C1C1B0F0E080D13120000002E +:1006C000000000000000CD22172EA07EA7CAE10086 +:1006D00036002EAA3600E52EA25E2356EBCD0A4F39 +:1006E000E1C3141F00CDEB1DCD22172E8D34C32680 +:1006F00049CD22172E8D7EFE08D4FD1EC936002E50 +:100700007011131C0630C3040B000000FECBD2CFC7 +:100710000EC3981FE52EAE4E3600CDDA03E1C315A9 +:100720001E010310C3300CE5CD351F223620E12316 +:100730004E23C37513CD22172EAB7EA7210001C80F +:10074000FE01210001C8FE02210002C8FE032100B3 +:1007500002C8210003FE04C8FE05210003C82100D1 +:1007600003C9FE022100FEC8FE032100FDC8FE04ED +:100770002100FEC82100FDC9CD22172EAB7EC60187 +:1007800027E60FC61C21023EC3360500000000000C +:1007900000000000000000003A2E20F5C61A4F7C31 +:1007A000B9D2B01FF1C60B577CBADAB11FC3F01D26 +:1007B000F121C2203601C3E61F21C2207EA7C2C795 +:1007C0001FCDCB05C3920336002EB03AC32067CDB0 +:1007D0002C0A0E0611E01FCDB305C3C24EC39D0304 +:1007E0000000001A1A1A3A1E20FED0D4F41F32C399 +:1007F00020C3F01D3EC0C9000000000000FFFFC084 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_5.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_5.hex new file mode 100644 index 00000000..4176ee6a --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_5.hex @@ -0,0 +1,129 @@ +:10000000C33D4035C036103E013240203A1E20FE2E +:1000100090D227403EFD324820211D203EA8962345 +:1000200086324A20C338403E02324820211D203A01 +:100030001E2086D690324A203EFDC360423A4020C0 +:10004000A7C24A40214120C3034021422035C27C3F +:10005000403602237EA7C29140CDEA402144207E53 +:10006000A7C27340237EFE4DC27C4021442036014E +:10007000C37C40237EFE55C27C4036492143207E0E +:10008000A7C28A40214720CD1C05CDBA40CD0341EF +:10009000C92A452011FCFF192245207DFE25C28A70 +:1000A00040214020360021432036002336002336ED +:1000B0002521492036C02336D0C92A45204E234663 +:1000C000235E2356233A4420A7CAD4403E0132423D +:1000D00020C3DC403A4220FE02C2E6403A4320A759 +:1000E000C2E6402245202A4920C93A4920FE48DA82 +:1000F000FD403A4A20FEE0D2FD40FE2AD0214320B6 +:100100003601C9CD2C0AC5E51AD304DB03772313C6 +:100110000DC20841AFD304DB0377E101200009C120 +:1001200005C20641C9010555410105554101085A5D +:100130004101086241010A6A41010B7441010E7FCD +:100140004102108D410212AD410217CD410218F556 +:1001500041021825420000000000000000040400D5 +:1001600000000000000C0C000000000000081C1C37 +:10017000080000000000000C1E1E1E0E0000000003 +:1001800000004C1C3E3F3E1C0C2000000000000004 +:100190000000008D003C007E00FF00FF007E003E5E +:1001A000000C00C000010000000000000000000082 +:1001B000000000350479057C00FC01FE03FF01FE10 +:1001C00001FE04FC003A04000000000000000000F2 +:1001D0000000006208F808FC03FE07EC0FFF07FFB1 +:1001E0000FBE07BC0FFD07FD03F801F208A80204CB +:1001F00004000000000000000000001220C804E815 +:1002000003F403FC0FFC07780F7A27FF17FE0EF8A4 +:1002100017FC0FE80FFC05FC17B224280120000092 +:100220000000000000000000000000E101FB30FCC5 +:1002300007FC0FFE07FE2EED0EFC1FFE07FE0FFD56 +:100240000FF81FBC0FFC07F803F413811000000027 +:100250000000000000FFFFFFFFFFFFFFFFFFFFFFA9 +:10026000324720214A207EFED0D47542FE30DC7A0F +:1002700042C34A400036D0C900003630C9C9000028 +:10028000CDBD0ACD3246C396423E10CDD5051AC328 +:10029000CF4240CDD5052119281110440E15CD2A85 +:1002A000053E50CDD505CD694321902B0E07CD15C8 +:1002B000433E01CD22433E40CDD505CD8646211695 +:1002C0002E1115451AFEFFCAE842FE5BCAE242E65D +:1002D0003FD5CD3605D1CDA443133E05CDD505C3BD +:1002E000C44221142FC389423E01CD22433E50CD4A +:1002F000D5050E0721902B0610113345CD000A0DB0 +:10030000C2F742211031114345010210CD1B0C3EB2 +:1003100060CDD505C911B5440610CD000A0DC21532 +:1003200043C9F521103111C544010210CD1B0CF158 +:100330003DC8F521903311E5440610CD000AF13D8A +:10034000C8F511F5440610CD000AF13DC8F57CFE54 +:100350003DC2584326312D2D0E01CD1543F1FE1B14 +:10036000DA65433E1BF5C34A43116D4421132D0149 +:100370000408CD1B0C167021122E0600E536800EE7 +:1003800005093601E10E200915C27C43118D442177 +:10039000133C010408CD1B0C11AD44211232060898 +:1003A000CD000AC9C5E5D51AE680CAB34311054593 +:1003B000C3B643110D452190310608CD000AD1E1A5 +:1003C000C1C9CD340BCD32463E04CD2243CD694365 +:1003D000CDA0463E10CDD5050E092115301125447E +:1003E0000608CDA443CD000A3E05CDD5050DC2E0DB +:1003F000433E01CD22433E60CDD505211530112865 +:10040000450E09CD2A053E40CDD505C90F0B001874 +:100410002929291B0B140D00111B1B110412021496 +:10042000041B2929298052387E3852800000101080 +:100430007E101000009244289228449200384438DC +:100440001038443800FE1038543810FE0000000008 +:1004500000000000000018527E52180000001852E0 +:100460007E521800000018527E52180000F0FFFF64 +:100470000F080000100400002002000040020000ED +:1004800040010000800100008001000080010000A8 +:1004900080010000800200004002000040040000D3 +:1004A00020080000103000000CC0FFFF0380808394 +:1004B0004D320408F0307ADDF4F4DD7A30000000CB +:1004C0000000000000E003E603E703FF0F790F7868 +:1004D0000F6C1FEC1FEC1F6C1F780F790FFF0FE7DD +:1004E00003E603E0030E18BE6D3D3C3D6DBE180EE5 +:1004F0000000000000193A6DFAFA6D3A1900000088 +:100500000000000000797C6EE6E66E7C79707878F9 +:10051000F8F87878798F0B840092045B880D920448 +:1005200091131B028E088DFF05080607131B303040 +:10053000301BFF387CECFEB7E5F860340C0000009F +:100540000000001000B800FC05FC0FCC1F9F1FBF6F +:100550000FFD1FC83C9819F03BE07FC03FC41FFC53 +:100560000D3800CDBD0ACD32463E30CDD50521181F +:1005700025117B19010113CD1B0C211829118E198E +:10058000010113CD1B0C21152511A119010113CD5A +:100590001B0C210C27113918010110CD1B0C210F48 +:1005A00026114918010120CD1B0C211225116918B3 +:1005B000010128CD1B0CCD86462E18262C3E1ACDC7 +:1005C00036053E0ACDD5053E018467FE33DABD45CA +:1005D0000E037DFE18C2DE45111C46C30246FE1501 +:1005E000C2E945111F46C30246FE12C2F44511225C +:1005F00046C30246FE0FC2FF45112546C3024611FF +:100600002846CD2A050E07112B46CD2A057DD60397 +:100610006FFE09C2BB453E60C3D505C91B1F1C1B2D +:10062000211C1B211C1D1C1C1D211C1B0F0E080D39 +:1006300013122E07263B116946D51A3CCD3605D13B +:100640001325257DFE09CA56467CFE2AC239462E50 +:10065000092633C339467CFE2FC2394626292E0788 +:10066000117E460608CD000AC90C0D0712FF100DB9 +:100670000E100D011A0D1207FF122422241C3C42F9 +:1006800099A5A581423C21472B01472C11272E1A01 +:10069000D640C00AD644C07ED67FC0AF32ED20C956 +:1006A000262B2E471100027E19861986FE3FC26254 +:1006B00003C9ED20C9CD8042000000CD6345CDCBFC +:1006C00005CDDF02CDD402CDBD0ACDCA01CD781F44 +:1006D000CD6102CD790221BF213601CDF202CDA933 +:1006E000012127207EA7CAE146237EFE01D306C250 +:1006F000EA463A2E20FE70D306DA2F47C3F24600B0 +:10070000CDB70A3AC62032E320C9CDCB05CDBD0A0C +:100710003AE32032C620CD764B000000CD8508009C +:100720000000C357063ABF21A7C2AA0EC36000212A +:10073000292036002A2D203A2C20FEFE010014C468 +:10074000850109221D20CD6D0D2113203601CDEC30 +:10075000470000000000D3062114207EA7C2A14755 +:10076000CDD847215D207EA7C29247CD770CD30616 +:100770003A1D20FEB0DC7F023A1D20FEB0D4580D99 +:100780003A1620A7CC9D0DD306CD054CCD7B48C392 +:100790004E47CD2903CDDF02CDD402CDCB05C373A7 +:1007A00016CD67043AAE20A7C2924721AC092210A9 +:1007B00020C36047CD9805CD22172EB07EA7C8363E +:1007C000002EAB7EFE03CCCF47CD3B4AC39805CD70 +:1007D000C243CDB94DC39805CD7C03E676FE54C027 +:1007E0002EED26207EA7C82B2B3603C93A1620A74C +:1007F000C82100203601C9000000000000000000F0 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_6.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_6.hex new file mode 100644 index 00000000..08e0316e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/roms/lrescue_6.hex @@ -0,0 +1,129 @@ +:100000003A1D20FE48D0215C207EA7C03601210683 +:1000100025060DCD340A21063D060DC3340A3A5D8E +:1000200020A7C230480000003E01CDD505C38B0D8E +:10003000E1215D20C3EF08CD00483A1620A7C8CDC6 +:1000400022172EAB7EFE05D26648FE03D26F48FE15 +:1000500001D2D14B2E8D7EFE07D82EAA7EFE04D86B +:10006000213E203601C92E8D7EFE04D8C360482E65 +:100070008D7EFE05D8C36048000000CD37483A3E6B +:1000800020A7C8CD22172EAB7EFE06D2B648FE05AD +:10009000CABB48FE04CAC04806583A1D20B8D2ACB4 +:1000A00048213F2036012129203600C92140207EE9 +:1000B000A7C02B3600C90688C39A480678C39A4859 +:1000C0000668C39A48DB02E60321AC21F58677F186 +:1000D00021AC228677C900000000003A5C20A7C04E +:1000E0003A9C20E610CA0E48C330043A3F20A7C20B +:1000F0000040C93AEF20A7C83AC420C30349000012 +:10010000C3F348B032C420D303C93AC420A032C4D8 +:1001100020D303C90624C300490620C30A49CDE6FB +:100120001D0628C3004906F7CD0A49C3180D3AC574 +:1001300020B032C520D305C93AC520A032C520D38E +:1001400005C90604CD2E493E05CDD50506FBC338AD +:10015000493A1620A7C83A0020A7CA62490622C316 +:10016000004906FDC30A49CA744936000621CD007C +:1001700049C3201006FECD0A49C90601CD0049C376 +:10018000481006FEC30A493A1620A7C21F4C3A9CE3 +:1001900020E604C21F4C3A1D20FE30C3A34906EFDF +:1001A000C33849DA9E490610C32E493AA020A7C297 +:1001B000B74906FCC338493A9C20E608CACE49062E +:1001C00001CD2E49219B2034E601C0C3B24906026D +:1001D000CD2E49219B2034E601C8C3B249CD8249C6 +:1001E000C348103AEE20A7C0211C390628C3EB09EA +:1001F0000000000000CD22172EAB7EA7210500C80D +:10020000FE01211000C8FE02211500C8213000C9DE +:100210003AC6200FDA224A21122B112D4A0E0EC3A4 +:100220002A05CD174A2112373E1DC336050F0B0094 +:10023000181B0F0B00180411261E27210F2C110B61 +:100240001A0608CD000A115A4A0E0BCD2A05CD65B3 +:100250004A210F2ECD2805C3CB05281B1B1C1B0FC5 +:100260000E080D1312CD22172EAB7EA711804AC89F +:10027000FE0111824AC8FE0211844AC811864AC989 +:100280001B211D1C1D211F1CCDCB0521C620C90013 +:1002900000000000000000211028D306C90620CD70 +:1002A0003849C37D1D3AEE20A7C23C4CCD2217C36E +:1002B0006A0321C6207E0FDAE54A3622CD22172EA8 +:1002C000AC35C2284BCD584B210F393E1ECD3605DB +:1002D000CDB602CD884A3621CD22172EAC7EA7CAD4 +:1002E000B304C38B4BCD22172EAC35C20E4BCD5869 +:1002F0004BCDB602CDCB0521C6203622CD22172EFE +:10030000AC7EA7CAB30421C6203622C38B4BCD4294 +:100310004B21C6203622CD22172EAC7EA7C28B4B96 +:1003200021C6203621C38B4BCD424B21C62036211E +:10033000CD22172EAC7EA7C28B4B21C6203622C3FE +:10034000E1007E3D210127CA504B24243DC24A0BC7 +:100350000610CD340AC3CB05210F2811634B0E13B1 +:10036000C3B30506000C041B0E1504111B0F0B0074 +:10037000180411261D273AC6200FDA864B062021C5 +:10038000C52070C30A050600C37F4BCDBD0ACD76DC +:100390004BCD104AC3B44B0600CD0A4900000021E2 +:1003A000C22011651B0609CD040B21000022E520A7 +:1003B00022EE20C9CD3B4AC3E10021E5203AC62008 +:1003C0000FD823C90000000000007E3DC84FC34F76 +:1003D000022E8D7EFE06D8C3604800CDBA4B7EA7A4 +:1003E000C80630CD1309B8D8CD22172EAC34CD466F +:1003F00002CDBA4B36000610CD00493E20CDD505C2 +:1004000006EFC30A49CDDB4BC3DB48AF325920CDE1 +:10041000974BCDA901C3824CCD661D210000C92197 +:100420003F207EA7CA9E49237EA7CA9E49C3A649EC +:10043000CD8403C3E100CD5149C3004ECD22172E18 +:10044000A07EA7CAB24A3600C3674C00CDBD0ACD14 +:1004500022172EA234211B260E0411634CCD2A052F +:10046000C3154E0514040B2EAC7E3DCAB24ACDA472 +:1004700003C3E14CCDA40121C2207EA7C03600C336 +:10048000AD4D21DC20360021E3203600C3B304004B +:10049000000000000000000000000000000000005C +:1004A00000000000CD22172EB03601C9CD104ACD74 +:1004B0003B4AC3CB05CD22172EAE4E3600C3DA031E +:1004C000AF32E320C9000000000000CD22172EA2A9 +:1004D0007EA7CADB4C211920C38E0F211B2036FEBC +:1004E000C9CD764BC3B24A2256203E01325A20C9AA +:1004F0003AEF20A7C8C3874921C6203621C900008A +:1005000011C04D21C0210606CD040BF3CD114DFBCA +:10051000C92AC0217EA7C8234E5F07DA564DE5CD14 +:100520002B4DE10DC21E4D23C3144DC5D5CD694DD4 +:10053000D1C12AC221530608CD2E49D3062B7CA750 +:10054000C815C23D4D5306F7CD38492B7CA7C815B9 +:10055000C24B4DC3354DE52AC4212B7CA7C25A4D51 +:100560000DC2574DE123C3144DDB0121EC200FDAFE +:10057000754D3600C97EA7C036FF2B7EFE09C3A885 +:100580004D330228022202330228022202330226BD +:10059000021E02330226021E0222021B0216022241 +:1005A000021B021602190600D034C3AC0A11B34D67 +:1005B000C3034DC64DFF0DFF50116D4FC3034D00DA +:1005C000814DFF0DFF5019011B011E012201260163 +:1005D00028012D0133012D012801260122011E01D0 +:1005E0001B011903000000000000000000000000D3 +:1005F00000000000000000000000000000000000FB +:100600003A1620A7C0CD410AE610C821A421347EA5 +:10061000FE02D83600CD22172EA27EA7C8EB2139C4 +:100620004E373E99CE0096EB862777211B2BCD7453 +:1006300005211B2D3E1CC3360501C3D74EAFBEC2DC +:10064000574E342AA82122B82021AA4E22B62021B2 +:10065000B4203618C3834E2AB620EB2AB8200608E9 +:10066000CDC8092AB8207DFE40DAE14E000021B451 +:1006700020AFBECA7A4E35CA954E23BECA834E35C8 +:10068000CAA14E2AB620EB2AB8202B2B0022B82074 +:100690000608C3C80923361021B24E22B620C386ED +:1006A0004E21BA4E22B620C3864E00C031DFFCDF99 +:1006B00031C05D5D2A3E1C3CE40C1090987B3F7B72 +:1006C0008886CDE64E36FFCDA9017EA7D306C2CAE5 +:1006D0004ECD2217C39D0321B220AFBEC823C33E17 +:1006E0004EAF32B220C9CD370621B220C9CD221774 +:1006F0002EA27EA7CA2010CD2010C3F60F00000046 +:100700003A5A20A7210300C41A4F3AEF20A7C82263 +:10071000F22021F1203601C24D05AF325A202105C9 +:1007200000C92A1D2022A821C3D40221B3203601EA +:10073000CDA9012B36017ED306A7C2364FCD221795 +:1007400019041E0216041E0222031E01280226039B +:100750001E03190312060000000422011E012606D2 +:1007600000000000000000000000000000404FFFFB +:1007700011FF50CD22172EA27EA7CADD49C37A49A8 +:100780003A1620A7C82A2D203A2C20A7F2934F7C96 +:10079000C60467CD2C0AAF0160010977012000096A +:1007A00077012000097701200209770120000977ED +:1007B0000120000977C93A1620A7C82A1D20EB2A74 +:1007C0002D207DD60ABBD07CC60CBAD0C612BAD8B2 +:1007D0003E01321820C9CD22172EAB7EFE02D8FE74 +:1007E00006D2F34F16FC2174207221802072218CD6 +:1007F0002072C916FBC3E64F000000000000000095 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/spram.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/sprom.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/sprom.vhd new file mode 100644 index 00000000..a81ac959 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Lunar Rescue_MiST/rtl/sprom.vhd @@ -0,0 +1,82 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_aclr_a : STRING; + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/OzmaWars.qpf b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/OzmaWars.qpf new file mode 100644 index 00000000..7344eeb5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/OzmaWars.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 16:15:41 June 05, 2019 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "16:15:41 June 05, 2019" + +# Revisions + +PROJECT_REVISION = "OzmaWars" diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/OzmaWars.qsf b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/OzmaWars.qsf new file mode 100644 index 00000000..567324b3 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/OzmaWars.qsf @@ -0,0 +1,178 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 02:57:11 June 09, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# OzmaWars_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name TOP_LEVEL_ENTITY OzmaWars_mist +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== + set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# --------------------------- +# start ENTITY(OzmaWars_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top + set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top + set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(OzmaWars_mist) +# ------------------------- +set_global_assignment -name SYSTEMVERILOG_FILE rtl/OzmaWars_mist.sv +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/OzmaWars_memory.sv +set_global_assignment -name VHDL_FILE rtl/OzmaWars_overlay.vhd +set_global_assignment -name VHDL_FILE rtl/sprom.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name QIP_FILE ../../../../common/mist/mist.qip +set_global_assignment -name VHDL_FILE rtl/roms/mw01.vhd +set_global_assignment -name VHDL_FILE rtl/roms/mw02.vhd +set_global_assignment -name VHDL_FILE rtl/roms/mw03.vhd +set_global_assignment -name VHDL_FILE rtl/roms/mw04.vhd +set_global_assignment -name VHDL_FILE rtl/roms/mw05.vhd +set_global_assignment -name VHDL_FILE rtl/roms/mw06.vhd +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/OzmaWars.sdc b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/OzmaWars.sdc new file mode 100644 index 00000000..f91c127c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/OzmaWars.sdc @@ -0,0 +1,126 @@ +## Generated SDC file "vectrex_MiST.out.sdc" + +## Copyright (C) 1991-2013 Altera Corporation +## Your use of Altera Corporation's design tools, logic functions +## and other software and tools, and its AMPP partner logic +## functions, and any output files from any of the foregoing +## (including device programming or simulation files), and any +## associated documentation or information are expressly subject +## to the terms and conditions of the Altera Program License +## Subscription Agreement, Altera MegaCore Function License +## Agreement, or other applicable license agreement, including, +## without limitation, that your use is for the sole purpose of +## programming logic devices manufactured by Altera and sold by +## Altera or its authorized distributors. Please refer to the +## applicable agreement for further details. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition" + +## DATE "Sun Jun 24 12:53:00 2018" + +## +## DEVICE "EP3C25E144C8" +## + +# Clock constraints + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty + +# tsu/th constraints + +# tco constraints + +# tpd constraints + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + + + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] + +#************************************************************** +# Create Generated Clock +#************************************************************** + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + +#************************************************************** +# Set Input Delay +#************************************************************** + +set_input_delay -add_delay -clock_fall -clock [get_clocks {CLOCK_27}] 1.000 [get_ports {CLOCK_27}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {CONF_DATA0}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DI}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SCK}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}] + +#************************************************************** +# Set Output Delay +#************************************************************** + +set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_L}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_R}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {LED}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {VGA_*}] + +#************************************************************** +# Set Clock Groups +#************************************************************** + +set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}] + +#************************************************************** +# Set False Path +#************************************************************** + + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + +set_multicycle_path -to {VGA_*[*]} -setup 2 +set_multicycle_path -to {VGA_*[*]} -hold 1 + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/README OzmaWars.txt b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/README.txt similarity index 100% rename from Arcade_MiST/Midway-Taito 8080 Hardware/README OzmaWars.txt rename to Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/README.txt diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/clean.bat b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/OzmaWars_memory.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/OzmaWars_memory.sv new file mode 100644 index 00000000..795f9949 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/OzmaWars_memory.sv @@ -0,0 +1,80 @@ + +module OzmaWars_memory( +input Clock, +input RW_n, +input [15:0]Addr, +input [15:0]Ram_Addr, +output [7:0]Ram_out, +input [7:0]Ram_in, +output [7:0]Rom_out +); + +wire [7:0]rom_data_0; +wire [7:0]rom_data_1; +wire [7:0]rom_data_2; +wire [7:0]rom_data_3; +wire [7:0]rom_data_4; +wire [7:0]rom_data_5; + + +mw01 mw01 ( + .clk(Clock), + .addr(Addr[10:0]), + .data(rom_data_0) +); + +mw02 mw02 ( + .clk(Clock), + .addr(Addr[10:0]), + .data(rom_data_1) +); + +mw03 mw03 ( + .clk(Clock), + .addr(Addr[10:0]), + .data(rom_data_2) +); + +mw04 mw04 ( + .clk(Clock), + .addr(Addr[10:0]), + .data(rom_data_3) +); + +mw05 mw05 ( + .clk(Clock), + .addr(Addr[10:0]), + .data(rom_data_4) +); + +mw06 mw06 ( + .clk(Clock), + .addr(Addr[10:0]), + .data(rom_data_5) +); + +always @(Addr, rom_data_0, rom_data_1, rom_data_2, rom_data_3, rom_data_4, rom_data_5) begin + Rom_out = 8'b00000000; + case (Addr[15:11]) + 5'b00000 : Rom_out = rom_data_0; + 5'b00001 : Rom_out = rom_data_1; + 5'b00010 : Rom_out = rom_data_2; + 5'b00011 : Rom_out = rom_data_3; + 5'b01000 : Rom_out = rom_data_4; + 5'b01001 : Rom_out = rom_data_5; + default : Rom_out = 8'b00000000; + endcase +end + +spram #( + .addr_width_g(13), + .data_width_g(8)) +u_ram0( + .address(Ram_Addr[12:0]), + .clken(1'b1), + .clock(Clock), + .data(Ram_in), + .wren(~RW_n), + .q(Ram_out) + ); +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/OzmaWars_mist.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/OzmaWars_mist.sv new file mode 100644 index 00000000..bc82fcec --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/OzmaWars_mist.sv @@ -0,0 +1,210 @@ +module OzmaWars_mist( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Ozma Wars;;", + "O2,Rotate Controls,Off,On;", + "O34,Scanlines,Off,25%,50%,75%;", + "O5,Overlay, On, Off;", + "T6,Reset;", + "V,v1.20.",`BUILD_DATE +}; + +assign LED = 1; +assign AUDIO_R = AUDIO_L; + + +wire clk_core, clk_sys; +wire pll_locked; +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_core), + .c1(clk_sys) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0,joystick_1; +wire scandoublerD; +wire ypbpr; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; +wire [7:0] audio; +wire hsync,vsync; +wire hs, vs; +wire r,g,b; + +wire [15:0]RAB; +wire [15:0]AD; +wire [7:0]RDB; +wire [7:0]RWD; +wire [7:0]IB; +wire [5:0]SoundCtrl3; +wire [5:0]SoundCtrl5; +wire Rst_n_s; +wire RWE_n; +wire Video; +wire HSync; +wire VSync; + +invaderst invaderst( + .Rst_n(~(status[0] | status[6] | buttons[1])), + .Clk(clk_core), + .ENA(), + .Coin(btn_coin), + .Sel1Player(~btn_one_player), + .Sel2Player(~btn_two_players), + .Fire(~m_fire), + .MoveLeft(~m_left), + .MoveRight(~m_right), + .MoveUp(~m_up), + .MoveDown(~m_down), + .RDB(RDB), + .IB(IB), + .RWD(RWD), + .RAB(RAB), + .AD(AD), + .SoundCtrl3(SoundCtrl3), + .SoundCtrl5(SoundCtrl5), + .Rst_n_s(Rst_n_s), + .RWE_n(RWE_n), + .Video(Video), + .HSync(HSync), + .VSync(VSync) + ); + +OzmaWars_memory OzmaWars_memory ( + .Clock(clk_core), + .RW_n(RWE_n), + .Addr(AD), + .Ram_Addr(RAB), + .Ram_out(RDB), + .Ram_in(RWD), + .Rom_out(IB) + ); + +invaders_audio invaders_audio ( + .Clk(clk_core), + .S1(SoundCtrl3), + .S2(SoundCtrl5), + .Aud(audio) + ); + +OzmaWars_overlay OzmaWars_overlay ( + .Video(Video), + .Overlay(~status[5]), + .CLK(clk_core), + .Rst_n_s(Rst_n_s), + .HSync(HSync), + .VSync(VSync), + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs) + ); + +mist_video #(.COLOR_DEPTH(3)) mist_video( + .clk_sys(clk_sys), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r,r}), + .G({g,g,g}), + .B({b,b,b}), + .HSync(hs), + .VSync(vs), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .rotate({1'b0,status[2]}), + .scandoubler_disable(scandoublerD), + .scanlines(status[4:3]), + .ce_divider(0), + .ypbpr(ypbpr) + ); + +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac dac ( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +wire m_up = ~status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_up | joystick_0[3] | joystick_1[3]; +wire m_down = ~status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_down | joystick_0[2] | joystick_1[2]; +wire m_left = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_left | joystick_0[1] | joystick_1[1]; +wire m_right = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_right | joystick_0[0] | joystick_1[0]; +wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; + + +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_left = 0; +reg btn_right = 0; +reg btn_down = 0; +reg btn_up = 0; +reg btn_fire1 = 0; +reg btn_coin = 0; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h75: btn_up <= key_pressed; // up + 'h72: btn_down <= key_pressed; // down + 'h6B: btn_left <= key_pressed; // left + 'h74: btn_right <= key_pressed; // right + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h29: btn_fire1 <= key_pressed; // Space + endcase + end +end + +endmodule diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/OzmaWars_overlay.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/OzmaWars_overlay.vhd new file mode 100644 index 00000000..b0188292 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/OzmaWars_overlay.vhd @@ -0,0 +1,225 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +entity OzmaWars_overlay is + port( + Video : in std_logic; + Overlay : in std_logic; + CLK : in std_logic; + Rst_n_s : in std_logic; + HSync : in std_logic; + VSync : in std_logic; + CAB : in std_logic_vector(7 downto 0); + O_VIDEO_R : out std_logic; + O_VIDEO_G : out std_logic; + O_VIDEO_B : out std_logic; + O_HSYNC : out std_logic; + O_VSYNC : out std_logic + ); +end OzmaWars_overlay; + +architecture rtl of OzmaWars_overlay is + + signal HCnt : std_logic_vector(11 downto 0); + signal VCnt : std_logic_vector(11 downto 0); + signal HSync_t1 : std_logic; + + signal Overlay_A1 : boolean; + signal Overlay_A2 : boolean; + signal Overlay_A3 : boolean; + signal Overlay_A3_VCnt : boolean; + + signal Overlay_B1 : boolean; + signal Overlay_B2 : boolean; + signal Overlay_B2_VCnt : boolean; + + signal Overlay_G1 : boolean; + + signal Overlay_P1 : boolean; + + signal Overlay_R1 : boolean; + signal Overlay_R2 : boolean; + + signal Overlay_Y1 : boolean; + signal Overlay_Y2 : boolean; + signal Overlay_Y2_VCnt : boolean; + + signal VideoRGB : std_logic_vector(2 downto 0); + signal col_data : std_logic_vector(3 downto 0); + +begin + process (Rst_n_s, Clk) + variable cnt : unsigned(3 downto 0); + begin + if Rst_n_s = '0' then + cnt := "0000"; + elsif Clk'event and Clk = '1' then + if cnt = 9 then + cnt := "0000"; + else + cnt := cnt + 1; + end if; + end if; + end process; + + p_overlay : process(Rst_n_s, Clk) + variable HStart : boolean; + begin + if Rst_n_s = '0' then + HCnt <= (others => '0'); + VCnt <= (others => '0'); + HSync_t1 <= '0'; + + Overlay_A1 <= false; + Overlay_A2 <= false; + Overlay_A3 <= false; + Overlay_A3_VCnt <= false; + + Overlay_B1 <= false; + Overlay_B2 <= false; + Overlay_B2_VCnt <= false; + + Overlay_G1 <= false; + + Overlay_P1 <= false; + + Overlay_R1 <= false; + Overlay_R2 <= false; + + Overlay_Y1 <= false; + Overlay_Y2 <= false; + Overlay_Y2_VCnt <= false; + + + elsif Clk'event and Clk = '1' then + HSync_t1 <= HSync; + HStart := (HSync_t1 = '0') and (HSync = '1'); + + if HStart then + HCnt <= (others => '0'); + else + HCnt <= HCnt + "1"; + end if; + + if (VSync = '0') then + VCnt <= (others => '0'); + elsif HStart then + VCnt <= VCnt + "1"; + end if; + + if HStart then + if (Vcnt = 0) then + Overlay_A3_VCnt <= true; + elsif (Vcnt = 86) then + Overlay_B2_VCnt <= true; + Overlay_A3_VCnt <= false; + elsif (Vcnt = 168) then + Overlay_Y2_VCnt <= true; + Overlay_B2_VCnt <= false; + elsif (Vcnt = 232) then + Overlay_Y2_VCnt <= false; + end if; + end if; + + if (HCnt = 500) and Overlay_A3_VCnt then + Overlay_A3 <= true; + elsif (HCnt = 540) then + Overlay_A3 <= false; + end if; + + if (HCnt = 486) and Overlay_B2_VCnt then + Overlay_B2 <= true; + elsif (HCnt = 540) then + Overlay_B2 <= false; + end if; + + if (HCnt = 486) and Overlay_Y2_VCnt then + Overlay_Y2 <= true; + elsif (HCnt = 540) then + Overlay_Y2 <= false; + end if; + + if (HCnt = 64) then + Overlay_R2 <= true; + elsif (HCnt = 96) then + Overlay_A2 <= true; + Overlay_R2 <= false; + elsif (HCnt = 120) then + Overlay_A2 <= false; + Overlay_R1 <= true; + elsif (HCnt = 166) then + Overlay_R1 <= false; + Overlay_Y1 <= true; + elsif (HCnt = 228) then + Overlay_Y1 <= false; + Overlay_P1 <= true; + elsif (HCnt = 292) then + Overlay_P1 <= false; + Overlay_A1 <= true; + elsif (HCnt = 358) then + Overlay_G1 <= true; + Overlay_A1 <= false; + elsif (HCnt = 430) then + Overlay_G1 <= false; + Overlay_B1 <= true; + elsif (HCnt = 486) then + Overlay_B1 <= false; +-- if Overlay_A3_VCnt then +-- Overlay_A2 <= true; +-- if Overlay_B2_VCnt then +-- Overlay_B2 <= true; +-- if Overlay_Y2_VCnt then +-- Overlay_Y2 <= true; +-- elsif (HCnt = 500) then +-- Overlay_A3 <= false; +-- elsif (HCnt = 540) then +-- Overlay_B2 <= false; +-- Overlay_Y2 <= false; + end if; + end if; + end process; + + p_video_out_comb : process(Video, Overlay_G1, Overlay_B1, Overlay_B2, Overlay_A1, Overlay_A2, Overlay_A3, Overlay_P1, Overlay_Y1, Overlay_Y2, Overlay_R1, Overlay_R2) + begin + if (Video = '0') then + VideoRGB <= "000"; + else + if Overlay_A1 or Overlay_A2 or Overlay_A3 then--AQUA + VideoRGB <= "011"; + elsif Overlay_B1 or Overlay_B2 then--BLUE + VideoRGB <= "001"; + elsif Overlay_G1 then--GREEN + VideoRGB <= "010"; + elsif Overlay_P1 then--PINK + VideoRGB <= "101"; + elsif Overlay_R1 or Overlay_R2 then--RED + VideoRGB <= "100"; + elsif Overlay_Y1 or Overlay_Y2 then--YELLOW + VideoRGB <= "110"; + else + VideoRGB <= "111";--WHITE + end if; + end if; + end process; + +-- colPROM: entity work.clr +--port map( +-- clk => Clk, +-- addr => CAB, --should be Video Counters +-- data => col_data +--); + +-- O_VIDEO_R <= col_data(2); +-- O_VIDEO_G <= col_data(1); +-- O_VIDEO_B <= col_data(0); + + O_VIDEO_R <= VideoRGB(2) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_G <= VideoRGB(1) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_B <= VideoRGB(0) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_HSYNC <= HSync; + O_VSYNC <= VSync; + + +end; \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T8080se.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T8080se.vhd new file mode 100644 index 00000000..65b92d54 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T8080se.vhd @@ -0,0 +1,194 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80_ALU.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80_ALU.vhd new file mode 100644 index 00000000..e09def1e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80_ALU.vhd @@ -0,0 +1,361 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80_MCode.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80_Pack.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80_Reg.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/T80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/dac.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- Refer to Xilinx Application Note XAPP154. +-- +-- This DAC requires an external RC low-pass filter: +-- +-- dac_o 0---XXXXX---+---0 analog audio +-- 3k3 | +-- === 4n7 +-- | +-- GND +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/invaders.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/invaders.vhd new file mode 100644 index 00000000..e35bdc82 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/invaders.vhd @@ -0,0 +1,273 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaderst is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire : in std_logic; + MoveLeft : in std_logic; + MoveRight : in std_logic; + MoveUp : in std_logic; + MoveDown : in std_logic; + DIP : in std_logic_vector(8 downto 1); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0); + SoundCtrl5 : out std_logic_vector(5 downto 0); + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic + ); +end invaderst; + +architecture rtl of invaderst is + + component mw8080 + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); + end component; + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(6 downto 2); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; +begin + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; + + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; + if WD_Cnt = 255 then + Rst_n_s_i <= '0'; + end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then + WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then + if Sounds(0) = '1' and Old_S0 = '0' then + WD_Cnt <= WD_Cnt + 1; + end if; + if PortWr(6) = '1' then + WD_Cnt <= (others => '0'); + end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: mw8080 + port map( + Rst_n => Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + Video => Video, + HSync => HSync, + VSync => VSync); + + with AD_i(9 downto 8) select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + S when others; + + GDB0(0) <= '1';-- + GDB0(1) <= '1';-- + GDB0(2) <= '1';-- + GDB0(3) <= '1';-- + GDB0(4) <= '1';-- + GDB0(5) <= '1';-- + GDB0(6) <= '1';-- + GDB0(7) <= '1';-- + + GDB1(0) <= Coin; + GDB1(1) <= not Sel2Player; + GDB1(2) <= not Sel1Player; + GDB1(3) <= '1'; + GDB1(4) <= not Fire;--controller + GDB1(5) <= not MoveLeft;--controller + GDB1(6) <= not MoveRight;--controller + GDB1(7) <= '1'; + + GDB2(0) <= '0';--active high + GDB2(1) <= '0';--active high + GDB2(2) <= '0';--active high + GDB2(3) <= '0';--active high + GDB2(4) <= '0';--DIPLOCK --active high + GDB2(5) <= not Sel1Player;--active low + GDB2(6) <= not Coin;--active low + GDB2(7) <= not Sel2Player;--active low + + PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; + PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; + PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; + PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; + PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + OldSample := '0'; + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0); + end if; + if PortWr(4) = '1' and OldSample = '0' then + D5(15 downto 8) <= DB; + D5(7 downto 0) <= D5(15 downto 8); + end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0); + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/invaders_audio.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/mw8080.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/mw8080.vhd new file mode 100644 index 00000000..b9a88f96 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/mw8080.vhd @@ -0,0 +1,336 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n, Rd_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/pll.qip b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/pll.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/pll.vhd new file mode 100644 index 00000000..f8d0b139 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/pll.vhd @@ -0,0 +1,382 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + sub_wire2 <= sub_wire0(1); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + c1 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 20, + clk1_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire4, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "20.000000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "ps" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "20" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "20.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK1 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "20" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw01.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw01.vhd new file mode 100644 index 00000000..1e6a8db4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw01.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity mw01 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of mw01 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"F3",X"31",X"7C",X"02",X"C3",X"36",X"02",X"C7",X"F5",X"AF",X"32",X"05",X"20",X"C3",X"49",X"00", + X"F5",X"3E",X"80",X"C3",X"0A",X"00",X"C7",X"C7",X"F3",X"E5",X"D5",X"C5",X"F5",X"C3",X"2B",X"01", + X"F3",X"CD",X"0F",X"02",X"47",X"C3",X"D4",X"01",X"F3",X"CD",X"0F",X"02",X"47",X"C3",X"F3",X"01", + X"F3",X"CD",X"0F",X"02",X"2F",X"C3",X"FB",X"01",X"F3",X"CD",X"0F",X"02",X"79",X"C3",X"04",X"02", + X"AF",X"77",X"23",X"05",X"C2",X"41",X"00",X"C9",X"C7",X"AF",X"32",X"0B",X"20",X"22",X"26",X"20", + X"21",X"00",X"00",X"39",X"22",X"28",X"20",X"F1",X"2A",X"26",X"20",X"E5",X"2A",X"0C",X"20",X"F9", + X"2A",X"28",X"20",X"E5",X"D5",X"C5",X"F5",X"3A",X"06",X"20",X"F5",X"21",X"00",X"00",X"39",X"22", + X"0C",X"20",X"EB",X"2A",X"9E",X"02",X"EB",X"7A",X"2F",X"57",X"7B",X"2F",X"5F",X"19",X"D2",X"BA", + X"00",X"3A",X"0B",X"20",X"A7",X"C2",X"7B",X"01",X"CD",X"B6",X"02",X"21",X"07",X"20",X"7E",X"23", + X"A6",X"CA",X"05",X"01",X"47",X"23",X"4E",X"21",X"1E",X"20",X"16",X"80",X"7A",X"A0",X"CA",X"AC", + X"00",X"35",X"C2",X"AC",X"00",X"A1",X"C2",X"BA",X"00",X"7A",X"B1",X"4F",X"23",X"7A",X"2F",X"A0", + X"47",X"CA",X"BE",X"00",X"7A",X"1F",X"57",X"C3",X"9D",X"00",X"2A",X"A2",X"02",X"E9",X"21",X"09", + X"20",X"71",X"7E",X"2F",X"2B",X"A6",X"77",X"2A",X"0C",X"20",X"F9",X"0E",X"80",X"3A",X"09",X"20", + X"47",X"3A",X"0A",X"20",X"2F",X"A0",X"5F",X"3A",X"07",X"20",X"A3",X"CA",X"05",X"01",X"11",X"0E", + X"20",X"78",X"A1",X"C2",X"EE",X"00",X"79",X"1F",X"4F",X"13",X"13",X"C3",X"E1",X"00",X"2F",X"A0", + X"32",X"09",X"20",X"79",X"32",X"06",X"20",X"1A",X"6F",X"13",X"1A",X"67",X"F9",X"F1",X"C1",X"D1", + X"E1",X"D3",X"06",X"FB",X"C9",X"F3",X"2A",X"0C",X"20",X"F9",X"01",X"0A",X"00",X"09",X"22",X"0C", + X"20",X"F1",X"A7",X"CA",X"1E",X"01",X"47",X"3A",X"07",X"20",X"A0",X"CA",X"05",X"01",X"32",X"06", + X"20",X"F1",X"C1",X"D1",X"E1",X"F9",X"E1",X"D3",X"06",X"FB",X"C9",X"21",X"06",X"20",X"7E",X"47", + X"23",X"A6",X"CA",X"05",X"01",X"23",X"B6",X"77",X"21",X"1E",X"20",X"11",X"0E",X"20",X"78",X"17", + X"DA",X"49",X"01",X"23",X"13",X"13",X"C3",X"3F",X"01",X"44",X"4D",X"21",X"00",X"00",X"39",X"7D", + X"12",X"13",X"7C",X"12",X"11",X"08",X"00",X"19",X"F9",X"E3",X"7E",X"23",X"E3",X"02",X"C3",X"C7", + X"00",X"F3",X"A7",X"CA",X"70",X"01",X"C5",X"47",X"3A",X"07",X"20",X"A0",X"CA",X"72",X"01",X"C1", + X"FB",X"C9",X"78",X"C1",X"F5",X"32",X"0B",X"20",X"C3",X"4D",X"00",X"47",X"21",X"06",X"20",X"77", + X"23",X"B6",X"77",X"31",X"7C",X"02",X"78",X"33",X"33",X"33",X"33",X"17",X"D2",X"87",X"01",X"D1", + X"E1",X"F9",X"EB",X"FB",X"E9",X"F3",X"F5",X"A7",X"C4",X"9E",X"01",X"F1",X"FB",X"C9",X"C5",X"E5", + X"2F",X"47",X"0E",X"03",X"21",X"07",X"20",X"7E",X"A0",X"77",X"23",X"0D",X"C2",X"A7",X"01",X"36", + X"00",X"21",X"2A",X"20",X"78",X"2F",X"23",X"17",X"D2",X"B6",X"01",X"36",X"00",X"E1",X"C1",X"C9", + X"F3",X"3A",X"06",X"20",X"CD",X"9E",X"01",X"C3",X"C7",X"00",X"F1",X"C1",X"D1",X"E1",X"3A",X"00", + X"20",X"FB",X"A7",X"C9",X"CD",X"27",X"02",X"70",X"3E",X"D3",X"32",X"01",X"20",X"EB",X"3E",X"C9", + X"32",X"03",X"20",X"21",X"CC",X"4F",X"CD",X"2A",X"02",X"32",X"02",X"20",X"1A",X"CD",X"01",X"20", + X"C3",X"CA",X"01",X"CD",X"27",X"02",X"B0",X"77",X"C3",X"D8",X"01",X"47",X"CD",X"27",X"02",X"A0", + X"77",X"C3",X"D8",X"01",X"2F",X"4F",X"CD",X"27",X"02",X"B0",X"A1",X"77",X"C3",X"D8",X"01",X"32", + X"00",X"20",X"E3",X"33",X"33",X"EB",X"E3",X"7E",X"23",X"E3",X"3B",X"3B",X"E5",X"C5",X"32",X"04", + X"20",X"3A",X"00",X"20",X"F5",X"D5",X"C9",X"21",X"2A",X"20",X"3A",X"04",X"20",X"85",X"6F",X"7C", + X"CE",X"00",X"67",X"7E",X"A7",X"C9",X"D1",X"E1",X"F9",X"EB",X"CD",X"3E",X"02",X"E9",X"F3",X"F5", + X"C5",X"E5",X"AF",X"06",X"2D",X"21",X"06",X"20",X"CD",X"41",X"00",X"21",X"00",X"24",X"22",X"0C", + X"20",X"E1",X"C1",X"F1",X"D3",X"06",X"FB",X"C9",X"F3",X"F5",X"C5",X"E5",X"21",X"00",X"00",X"06", + X"00",X"7E",X"80",X"47",X"23",X"7C",X"FE",X"20",X"C2",X"61",X"02",X"78",X"C6",X"1B",X"C2",X"78", + X"02",X"E1",X"C1",X"F1",X"D3",X"06",X"FB",X"C9",X"2A",X"A0",X"02",X"E9",X"EE",X"02",X"8D",X"21", + X"8E",X"07",X"AD",X"21",X"A3",X"0A",X"C3",X"21",X"30",X"0D",X"DF",X"21",X"B1",X"11",X"F7",X"21", + X"5B",X"13",X"0D",X"22",X"C3",X"13",X"23",X"22",X"A4",X"02",X"24",X"22",X"A7",X"02",X"25",X"22", + X"AE",X"02",X"B2",X"02",X"C3",X"AA",X"02",X"C3",X"AA",X"02",X"F3",X"C3",X"AA",X"02",X"F3",X"C3", + X"AE",X"02",X"F3",X"C3",X"B2",X"02",X"2A",X"59",X"20",X"2B",X"22",X"59",X"20",X"DB",X"01",X"0F", + X"DA",X"C8",X"02",X"AF",X"32",X"47",X"20",X"C9",X"3A",X"46",X"20",X"FE",X"09",X"D0",X"3A",X"47", + X"20",X"A7",X"C0",X"3E",X"01",X"32",X"47",X"20",X"DB",X"02",X"07",X"3A",X"46",X"20",X"D2",X"E3", + X"02",X"C6",X"01",X"C6",X"01",X"27",X"E6",X"0F",X"32",X"46",X"20",X"D3",X"06",X"C9",X"CD",X"A4", + X"04",X"CD",X"16",X"07",X"21",X"26",X"22",X"11",X"B6",X"23",X"CD",X"24",X"07",X"21",X"39",X"20", + X"11",X"6E",X"21",X"CD",X"24",X"07",X"CD",X"16",X"07",X"3E",X"01",X"32",X"58",X"20",X"CD",X"A4", + X"04",X"CD",X"6F",X"03",X"3E",X"04",X"CD",X"61",X"01",X"CD",X"0A",X"06",X"3A",X"46",X"20",X"A7", + X"C2",X"78",X"03",X"3A",X"58",X"20",X"0F",X"DA",X"1C",X"03",X"CD",X"6F",X"03",X"CD",X"EC",X"06", + X"CD",X"0A",X"06",X"3E",X"01",X"32",X"30",X"20",X"3A",X"30",X"20",X"A7",X"C2",X"38",X"03",X"3E", + X"20",X"CD",X"61",X"01",X"3A",X"46",X"20",X"A7",X"C2",X"78",X"03",X"CD",X"0A",X"06",X"3A",X"2E", + X"20",X"A7",X"CA",X"5F",X"03",X"3E",X"80",X"CD",X"95",X"01",X"3E",X"80",X"CD",X"61",X"01",X"3A", + X"58",X"20",X"0F",X"D2",X"44",X"03",X"CD",X"3E",X"02",X"CD",X"16",X"07",X"C3",X"11",X"03",X"CD", + X"B2",X"05",X"CD",X"1E",X"05",X"C3",X"DC",X"05",X"CD",X"3E",X"02",X"CD",X"16",X"07",X"AF",X"32", + X"58",X"20",X"32",X"48",X"20",X"CD",X"A4",X"04",X"3E",X"04",X"CD",X"61",X"01",X"CD",X"DC",X"05", + X"CD",X"0A",X"06",X"DB",X"01",X"E6",X"06",X"CA",X"90",X"03",X"EE",X"04",X"CA",X"AE",X"04",X"EE", + X"06",X"C2",X"90",X"03",X"3A",X"46",X"20",X"3D",X"CA",X"90",X"03",X"3D",X"32",X"46",X"20",X"3E", + X"81",X"32",X"48",X"20",X"CD",X"A4",X"05",X"CD",X"1E",X"05",X"AF",X"32",X"40",X"20",X"CD",X"75", + X"07",X"CD",X"EC",X"06",X"3E",X"20",X"CD",X"61",X"01",X"3E",X"08",X"32",X"40",X"20",X"CD",X"0A", + X"06",X"3A",X"2E",X"20",X"A7",X"CA",X"E9",X"03",X"3E",X"80",X"CD",X"95",X"01",X"3E",X"80",X"CD", + X"61",X"01",X"3A",X"2E",X"20",X"A7",X"C2",X"E2",X"03",X"3A",X"2A",X"20",X"0F",X"D2",X"CE",X"03", + X"0F",X"DA",X"48",X"04",X"CD",X"EE",X"1F",X"CD",X"3E",X"02",X"3A",X"48",X"20",X"3C",X"E6",X"81", + X"32",X"48",X"20",X"3A",X"57",X"20",X"A7",X"3E",X"01",X"32",X"57",X"20",X"CA",X"B7",X"03",X"CD", + X"1E",X"05",X"3A",X"3C",X"20",X"A7",X"FA",X"F7",X"03",X"3A",X"29",X"22",X"47",X"3A",X"31",X"22", + X"B0",X"F4",X"75",X"07",X"3E",X"08",X"CD",X"61",X"01",X"CD",X"DC",X"05",X"3E",X"40",X"CD",X"61", + X"01",X"3E",X"01",X"32",X"2D",X"20",X"3E",X"20",X"CD",X"61",X"01",X"3E",X"80",X"CD",X"61",X"01", + X"3E",X"10",X"CD",X"61",X"01",X"C3",X"CE",X"03",X"3A",X"2A",X"20",X"A7",X"F5",X"CD",X"3E",X"02", + X"AF",X"E7",X"09",X"E7",X"0A",X"E7",X"0B",X"3E",X"1F",X"F7",X"0C",X"CD",X"4A",X"07",X"CD",X"0A", + X"06",X"F1",X"F2",X"6B",X"04",X"21",X"DA",X"4F",X"CD",X"F4",X"14",X"21",X"E2",X"1C",X"3A",X"48", + X"20",X"0F",X"DA",X"78",X"04",X"21",X"F9",X"1C",X"CD",X"F4",X"14",X"CD",X"01",X"07",X"3A",X"48", + X"20",X"A7",X"F2",X"93",X"04",X"3A",X"29",X"22",X"A7",X"F2",X"FA",X"03",X"3A",X"31",X"22",X"A7", + X"F2",X"FA",X"03",X"AF",X"32",X"48",X"20",X"CD",X"F6",X"04",X"3A",X"46",X"20",X"A7",X"CA",X"06", + X"03",X"C3",X"78",X"03",X"AF",X"E7",X"09",X"E7",X"0A",X"E7",X"0B",X"E7",X"0C",X"C9",X"3E",X"01", + X"32",X"48",X"20",X"21",X"46",X"20",X"35",X"CD",X"A4",X"05",X"CD",X"1E",X"05",X"AF",X"32",X"40", + X"20",X"CD",X"75",X"07",X"CD",X"EC",X"06",X"3E",X"20",X"CD",X"61",X"01",X"3E",X"08",X"32",X"40", + X"20",X"CD",X"0A",X"06",X"3A",X"2E",X"20",X"A7",X"CA",X"EC",X"04",X"3E",X"80",X"CD",X"95",X"01", + X"3E",X"80",X"CD",X"61",X"01",X"3A",X"2E",X"20",X"A7",X"C2",X"E5",X"04",X"3A",X"2A",X"20",X"0F", + X"D2",X"D1",X"04",X"C3",X"48",X"04",X"2A",X"26",X"22",X"EB",X"2A",X"2E",X"22",X"7C",X"BA",X"DA", + X"0B",X"05",X"C2",X"0A",X"05",X"7D",X"BB",X"DA",X"0B",X"05",X"EB",X"2A",X"43",X"20",X"7A",X"BC", + X"D8",X"C2",X"17",X"05",X"7B",X"BD",X"D8",X"EB",X"22",X"43",X"20",X"C3",X"0A",X"06",X"3A",X"48", + X"20",X"0F",X"21",X"39",X"20",X"11",X"26",X"22",X"06",X"08",X"DA",X"30",X"05",X"11",X"2E",X"22", + X"CD",X"34",X"16",X"21",X"68",X"20",X"11",X"36",X"22",X"06",X"D8",X"3A",X"48",X"20",X"0F",X"DA", + X"45",X"05",X"11",X"F6",X"22",X"CD",X"34",X"16",X"CD",X"16",X"07",X"3A",X"48",X"20",X"A7",X"C8", + X"3E",X"20",X"E7",X"0A",X"3A",X"48",X"20",X"0F",X"3E",X"20",X"D2",X"5E",X"05",X"AF",X"E7",X"0C", + X"06",X"10",X"CD",X"D3",X"07",X"7E",X"FE",X"38",X"C2",X"70",X"05",X"3E",X"01",X"EF",X"0A",X"C9", + X"7E",X"FE",X"33",X"C2",X"7B",X"05",X"3E",X"01",X"C3",X"DA",X"07",X"7E",X"FE",X"70",X"C2",X"86", + X"05",X"3E",X"10",X"EF",X"0C",X"C9",X"7E",X"FE",X"50",X"C2",X"95",X"05",X"3E",X"01",X"EF",X"0A", + X"3E",X"1F",X"C3",X"DA",X"07",X"7E",X"FE",X"3F",X"CA",X"90",X"05",X"23",X"23",X"23",X"23",X"05", + X"C2",X"65",X"05",X"C9",X"3E",X"04",X"CD",X"95",X"01",X"21",X"26",X"22",X"11",X"B6",X"23",X"CD", + X"24",X"07",X"DB",X"02",X"E6",X"03",X"87",X"21",X"D4",X"05",X"CD",X"2D",X"02",X"5F",X"23",X"56", + X"EB",X"22",X"28",X"22",X"22",X"30",X"22",X"3E",X"01",X"32",X"2D",X"22",X"32",X"35",X"22",X"AF", + X"32",X"57",X"20",X"C9",X"DC",X"05",X"D0",X"07",X"C4",X"09",X"AC",X"0D",X"21",X"34",X"1D",X"CD", + X"F4",X"14",X"21",X"5D",X"1D",X"CD",X"F4",X"14",X"21",X"68",X"1D",X"CD",X"F4",X"14",X"2A",X"43", + X"20",X"11",X"1D",X"30",X"CD",X"BE",X"06",X"2A",X"26",X"22",X"11",X"1D",X"27",X"CD",X"BE",X"06", + X"2A",X"2E",X"22",X"11",X"1D",X"39",X"CD",X"BE",X"06",X"C9",X"3A",X"46",X"20",X"21",X"01",X"3D", + X"CD",X"D9",X"06",X"CD",X"7B",X"06",X"60",X"69",X"11",X"01",X"2C",X"CD",X"BE",X"06",X"3A",X"59", + X"20",X"A7",X"CA",X"70",X"06",X"F3",X"2A",X"41",X"20",X"7C",X"B5",X"CA",X"59",X"06",X"EB",X"21", + X"00",X"00",X"22",X"41",X"20",X"2A",X"39",X"20",X"FB",X"7D",X"83",X"27",X"6F",X"7C",X"8A",X"27", + X"67",X"22",X"39",X"20",X"7B",X"21",X"1C",X"33",X"CD",X"D0",X"06",X"CD",X"C9",X"06",X"3E",X"40", + X"32",X"59",X"20",X"21",X"53",X"1D",X"CD",X"F4",X"14",X"FB",X"3A",X"48",X"20",X"A7",X"C8",X"2A", + X"39",X"20",X"0F",X"11",X"1D",X"27",X"DA",X"6C",X"06",X"11",X"1D",X"39",X"CD",X"BE",X"06",X"C9", + X"2A",X"53",X"1D",X"06",X"48",X"CD",X"E1",X"06",X"C3",X"59",X"06",X"2A",X"3B",X"20",X"11",X"A2", + X"06",X"01",X"00",X"00",X"7C",X"A7",X"F8",X"29",X"29",X"29",X"DA",X"95",X"06",X"7C",X"B5",X"C8", + X"13",X"13",X"C3",X"89",X"06",X"1A",X"81",X"27",X"4F",X"13",X"1A",X"88",X"27",X"47",X"13",X"C3", + X"89",X"06",X"92",X"81",X"96",X"40",X"48",X"20",X"24",X"10",X"12",X"05",X"56",X"02",X"28",X"01", + X"64",X"00",X"32",X"00",X"16",X"00",X"08",X"00",X"04",X"00",X"02",X"00",X"01",X"00",X"EB",X"D5", + X"7A",X"CD",X"D0",X"06",X"D1",X"7B",X"CD",X"D0",X"06",X"06",X"00",X"0E",X"08",X"C3",X"3D",X"16", + X"F5",X"0F",X"0F",X"0F",X"0F",X"CD",X"D9",X"06",X"F1",X"E6",X"0F",X"47",X"0E",X"08",X"C3",X"3D", + X"16",X"AF",X"11",X"20",X"00",X"77",X"19",X"05",X"C2",X"E5",X"06",X"C9",X"3E",X"80",X"CD",X"61", + X"01",X"3E",X"40",X"CD",X"61",X"01",X"3E",X"10",X"CD",X"61",X"01",X"3E",X"08",X"CD",X"61",X"01", + X"C9",X"21",X"F4",X"01",X"22",X"59",X"20",X"CD",X"DF",X"07",X"A7",X"F2",X"07",X"07",X"CD",X"E7", + X"07",X"06",X"68",X"C3",X"E1",X"06",X"21",X"00",X"24",X"06",X"00",X"70",X"23",X"7C",X"FE",X"40", + X"DA",X"19",X"07",X"C9",X"06",X"00",X"70",X"23",X"7C",X"BA",X"C2",X"26",X"07",X"7D",X"BB",X"C2", + X"26",X"07",X"C9",X"21",X"62",X"09",X"06",X"1A",X"36",X"00",X"23",X"05",X"C2",X"38",X"07",X"01", + X"06",X"00",X"09",X"7C",X"FE",X"40",X"DA",X"36",X"07",X"C9",X"3A",X"48",X"20",X"0F",X"11",X"39", + X"20",X"21",X"26",X"22",X"06",X"08",X"DA",X"5C",X"07",X"21",X"2E",X"22",X"CD",X"34",X"16",X"21", + X"36",X"22",X"11",X"68",X"20",X"06",X"C0",X"3A",X"48",X"20",X"0F",X"DA",X"71",X"07",X"21",X"F6", + X"22",X"CD",X"34",X"16",X"C9",X"CD",X"DC",X"05",X"CD",X"0A",X"06",X"3A",X"48",X"20",X"0F",X"21", + X"10",X"1D",X"DA",X"88",X"07",X"21",X"22",X"1D",X"CD",X"F4",X"14",X"C3",X"01",X"07",X"3A",X"2E", + X"20",X"E6",X"01",X"C2",X"89",X"09",X"21",X"18",X"8A",X"22",X"49",X"20",X"AF",X"32",X"4F",X"20", + X"21",X"8F",X"1B",X"22",X"4D",X"20",X"21",X"02",X"0F",X"22",X"4B",X"20",X"CD",X"1C",X"0A",X"DF", + X"01",X"2A",X"49",X"20",X"7C",X"C6",X"F8",X"67",X"3A",X"05",X"20",X"AC",X"47",X"3A",X"48",X"20", + X"FE",X"80",X"78",X"07",X"CA",X"CD",X"07",X"D2",X"AF",X"07",X"C3",X"D0",X"07",X"DA",X"AF",X"07", + X"C3",X"EF",X"07",X"CD",X"4F",X"0D",X"21",X"E8",X"20",X"C9",X"E7",X"0B",X"F7",X"0A",X"C9",X"3E", + X"00",X"D3",X"03",X"3A",X"5A",X"20",X"C9",X"3E",X"20",X"EF",X"0A",X"2A",X"10",X"1D",X"C9",X"21", + X"3D",X"20",X"34",X"CD",X"50",X"0A",X"3A",X"3C",X"20",X"A7",X"FA",X"84",X"09",X"3A",X"51",X"20"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw02.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw02.vhd new file mode 100644 index 00000000..ef4b42fa --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw02.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity mw02 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of mw02 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"3D",X"32",X"51",X"20",X"F2",X"18",X"08",X"E6",X"0F",X"32",X"51",X"20",X"F3",X"2A",X"3B",X"20", + X"2B",X"22",X"3B",X"20",X"FB",X"C3",X"18",X"08",X"CD",X"79",X"0A",X"E6",X"F0",X"CA",X"4E",X"08", + X"21",X"51",X"20",X"35",X"EE",X"10",X"CA",X"2E",X"08",X"EE",X"30",X"CA",X"3E",X"08",X"2A",X"49", + X"20",X"7C",X"FE",X"28",X"DA",X"4E",X"08",X"25",X"22",X"49",X"20",X"C3",X"4E",X"08",X"2A",X"49", + X"20",X"7C",X"FE",X"E0",X"D2",X"4E",X"08",X"24",X"22",X"49",X"20",X"C3",X"4E",X"08",X"AF",X"32", + X"4F",X"20",X"CD",X"1C",X"0A",X"DF",X"01",X"3A",X"52",X"20",X"A7",X"CA",X"AF",X"07",X"01",X"00", + X"10",X"21",X"E8",X"20",X"7E",X"A7",X"CA",X"6C",X"08",X"F2",X"78",X"08",X"23",X"23",X"23",X"23", + X"0C",X"05",X"C2",X"64",X"08",X"C3",X"AF",X"07",X"E5",X"C5",X"57",X"79",X"21",X"68",X"20",X"87", + X"87",X"87",X"CD",X"2D",X"02",X"7E",X"FE",X"28",X"D2",X"A1",X"08",X"23",X"5E",X"3A",X"4A",X"20", + X"C6",X"02",X"47",X"C6",X"0A",X"BB",X"DA",X"A1",X"08",X"23",X"23",X"7B",X"86",X"B8",X"D2",X"A6", + X"08",X"C1",X"E1",X"C3",X"6C",X"08",X"7A",X"FE",X"40",X"CA",X"98",X"09",X"E6",X"F0",X"87",X"B1", + X"3C",X"32",X"2C",X"20",X"3E",X"3F",X"32",X"0A",X"20",X"7A",X"FE",X"40",X"C1",X"E1",X"36",X"00", + X"11",X"24",X"FA",X"FA",X"D1",X"08",X"FE",X"70",X"11",X"E0",X"FC",X"DA",X"D1",X"08",X"11",X"30", + X"F8",X"2A",X"3B",X"20",X"19",X"7C",X"A7",X"FA",X"4A",X"09",X"3E",X"04",X"EF",X"0A",X"3E",X"20", + X"EF",X"0B",X"DF",X"03",X"AF",X"32",X"66",X"20",X"D5",X"CD",X"50",X"0A",X"2A",X"49",X"20",X"3A", + X"51",X"20",X"3D",X"32",X"51",X"20",X"0F",X"DA",X"FF",X"08",X"25",X"25",X"C3",X"01",X"09",X"24", + X"24",X"22",X"49",X"20",X"CD",X"1C",X"0A",X"D1",X"2A",X"3B",X"20",X"2B",X"2B",X"2B",X"2B",X"2B", + X"2B",X"00",X"00",X"22",X"3B",X"20",X"13",X"13",X"13",X"13",X"13",X"13",X"00",X"00",X"7A",X"A7", + X"FA",X"E2",X"08",X"06",X"01",X"3E",X"04",X"F7",X"0A",X"3E",X"20",X"F7",X"0B",X"3E",X"01",X"32", + X"30",X"20",X"AF",X"32",X"0A",X"20",X"78",X"E6",X"02",X"C2",X"43",X"09",X"3A",X"48",X"20",X"A7", + X"F2",X"AF",X"07",X"78",X"32",X"2A",X"20",X"CD",X"C0",X"01",X"22",X"3B",X"20",X"3E",X"04",X"EF", + X"0A",X"3E",X"20",X"EF",X"0B",X"2A",X"49",X"20",X"11",X"FE",X"FD",X"19",X"22",X"49",X"20",X"21", + X"05",X"17",X"22",X"4B",X"20",X"21",X"54",X"1C",X"22",X"4D",X"20",X"CD",X"1C",X"0A",X"3E",X"64", + X"32",X"51",X"20",X"21",X"51",X"20",X"35",X"CA",X"7F",X"09",X"DF",X"01",X"C3",X"73",X"09",X"06", + X"03",X"C3",X"25",X"09",X"06",X"83",X"C3",X"25",X"09",X"3E",X"7F",X"32",X"0A",X"20",X"AF",X"32", + X"2E",X"20",X"11",X"18",X"FC",X"C3",X"D1",X"08",X"C1",X"E1",X"CD",X"FC",X"09",X"DF",X"01",X"CD", + X"50",X"0A",X"21",X"18",X"8A",X"22",X"49",X"20",X"CD",X"1C",X"0A",X"DF",X"01",X"3E",X"02",X"32", + X"2D",X"20",X"3E",X"10",X"EF",X"0A",X"11",X"DC",X"05",X"DB",X"02",X"E6",X"08",X"CA",X"C3",X"09", + X"11",X"E8",X"03",X"2A",X"3B",X"20",X"23",X"23",X"23",X"23",X"23",X"23",X"22",X"3B",X"20",X"E5", + X"D5",X"CD",X"1C",X"0A",X"D1",X"E1",X"DF",X"02",X"1B",X"1B",X"1B",X"1B",X"1B",X"1B",X"7A",X"A7", + X"F2",X"C3",X"09",X"3E",X"10",X"F7",X"0A",X"3E",X"80",X"32",X"2D",X"20",X"3C",X"32",X"30",X"20", + X"DF",X"01",X"3A",X"2D",X"20",X"A7",X"C2",X"F0",X"09",X"C3",X"AF",X"07",X"21",X"8F",X"19",X"11", + X"AD",X"1B",X"3A",X"FC",X"1F",X"86",X"23",X"47",X"7D",X"AB",X"C2",X"12",X"0A",X"7C",X"AA",X"CA", + X"16",X"0A",X"78",X"C3",X"05",X"0A",X"78",X"A7",X"C8",X"C3",X"30",X"0A",X"2A",X"49",X"20",X"CD", + X"70",X"15",X"EB",X"2A",X"4B",X"20",X"E5",X"2A",X"4D",X"20",X"C1",X"EB",X"AF",X"32",X"52",X"20", + X"E5",X"C5",X"1A",X"A6",X"CA",X"3A",X"0A",X"32",X"52",X"20",X"1A",X"B6",X"77",X"13",X"23",X"0D", + X"C2",X"32",X"0A",X"C1",X"05",X"E1",X"C8",X"D5",X"11",X"20",X"00",X"19",X"D1",X"C3",X"30",X"0A", + X"2A",X"49",X"20",X"CD",X"70",X"15",X"EB",X"2A",X"4B",X"20",X"E5",X"2A",X"4D",X"20",X"C1",X"EB", + X"E5",X"C5",X"00",X"1A",X"AE",X"77",X"23",X"13",X"0D",X"C2",X"62",X"0A",X"C1",X"E1",X"05",X"C8", + X"D5",X"11",X"20",X"00",X"19",X"D1",X"C3",X"60",X"0A",X"3A",X"48",X"20",X"A7",X"CA",X"9A",X"0A", + X"F2",X"91",X"0A",X"0F",X"DA",X"91",X"0A",X"DB",X"00",X"07",X"07",X"47",X"DB",X"02",X"C3",X"96", + X"0A",X"DB",X"00",X"47",X"DB",X"01",X"0F",X"E6",X"38",X"C9",X"3A",X"5B",X"20",X"C6",X"10",X"07", + X"E6",X"38",X"C9",X"AF",X"32",X"5C",X"20",X"32",X"64",X"20",X"3E",X"64",X"32",X"66",X"20",X"3E", + X"20",X"32",X"65",X"20",X"3E",X"01",X"32",X"5F",X"20",X"3A",X"2C",X"20",X"A7",X"C2",X"8D",X"0C", + X"3A",X"E8",X"20",X"FE",X"40",X"CA",X"9F",X"0C",X"3E",X"0F",X"F7",X"0C",X"3A",X"58",X"20",X"A7", + X"CA",X"FA",X"0A",X"21",X"66",X"20",X"35",X"C2",X"DF",X"0A",X"36",X"64",X"C3",X"14",X"0B",X"CD", + X"DC",X"0C",X"DF",X"01",X"C3",X"B9",X"0A",X"CD",X"79",X"0A",X"E6",X"08",X"C2",X"3E",X"0B",X"3A", + X"5C",X"20",X"E6",X"01",X"32",X"5C",X"20",X"C3",X"3E",X"0B",X"CD",X"79",X"0A",X"E6",X"08",X"C2", + X"0D",X"0B",X"3A",X"5C",X"20",X"E6",X"01",X"32",X"5C",X"20",X"C3",X"DF",X"0A",X"3A",X"5C",X"20", + X"A7",X"C2",X"DF",X"0A",X"3A",X"0A",X"20",X"E6",X"FF",X"C2",X"DF",X"0A",X"3E",X"03",X"32",X"5C", + X"20",X"3E",X"02",X"EF",X"0A",X"3E",X"08",X"32",X"67",X"20",X"F3",X"2A",X"3B",X"20",X"2B",X"2B", + X"22",X"3B",X"20",X"FB",X"2A",X"49",X"20",X"11",X"10",X"07",X"19",X"C3",X"66",X"0B",X"CD",X"DC", + X"0C",X"DF",X"01",X"11",X"05",X"0D",X"06",X"01",X"2A",X"5D",X"20",X"CD",X"DD",X"15",X"21",X"67", + X"20",X"35",X"C2",X"59",X"0B",X"3E",X"02",X"F7",X"0A",X"2A",X"5D",X"20",X"2C",X"2C",X"2C",X"2C", + X"7D",X"FE",X"D8",X"D2",X"D7",X"0B",X"22",X"5D",X"20",X"11",X"05",X"0D",X"06",X"01",X"CD",X"A0", + X"15",X"DF",X"01",X"79",X"A7",X"CA",X"E7",X"0A",X"01",X"00",X"10",X"21",X"E8",X"20",X"7E",X"A7", + X"CA",X"86",X"0B",X"F2",X"94",X"0B",X"23",X"23",X"23",X"23",X"0C",X"05",X"C2",X"7E",X"0B",X"DF", + X"01",X"C3",X"E7",X"0A",X"FE",X"40",X"CA",X"E7",X"0A",X"E5",X"C5",X"57",X"79",X"21",X"68",X"20", + X"87",X"87",X"87",X"CD",X"2D",X"02",X"D5",X"EB",X"2A",X"5D",X"20",X"EB",X"1C",X"1C",X"1C",X"7B", + X"4E",X"B9",X"DA",X"D1",X"0B",X"23",X"7A",X"46",X"B8",X"DA",X"D1",X"0B",X"23",X"23",X"23",X"7E", + X"87",X"87",X"87",X"81",X"BB",X"DA",X"D1",X"0B",X"23",X"7E",X"E6",X"1F",X"80",X"BA",X"D2",X"E2", + X"0B",X"D1",X"C1",X"E1",X"C3",X"86",X"0B",X"3A",X"5C",X"20",X"E6",X"FE",X"32",X"5C",X"20",X"C3", + X"E2",X"0A",X"D1",X"C1",X"E1",X"7A",X"FE",X"40",X"06",X"00",X"D2",X"F8",X"0B",X"3A",X"3D",X"20", + X"E6",X"07",X"47",X"3A",X"3F",X"20",X"80",X"47",X"7A",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"57", + X"59",X"21",X"08",X"0D",X"CD",X"2D",X"02",X"80",X"4F",X"06",X"00",X"2A",X"41",X"20",X"09",X"22", + X"41",X"20",X"3A",X"64",X"20",X"A7",X"CA",X"26",X"0C",X"D5",X"2A",X"63",X"20",X"44",X"4D",X"2A", + X"5F",X"20",X"CD",X"7F",X"15",X"D1",X"7B",X"21",X"E8",X"20",X"87",X"87",X"CD",X"2D",X"02",X"36", + X"00",X"7A",X"FE",X"04",X"D2",X"81",X"0C",X"3E",X"08",X"EF",X"0A",X"7B",X"87",X"87",X"87",X"21", + X"68",X"20",X"CD",X"2D",X"02",X"D6",X"02",X"4F",X"23",X"7E",X"D6",X"02",X"47",X"C5",X"7A",X"87", + X"87",X"21",X"10",X"0D",X"CD",X"2D",X"02",X"5F",X"23",X"56",X"23",X"4E",X"23",X"46",X"21",X"64", + X"20",X"70",X"2B",X"71",X"2B",X"72",X"2B",X"73",X"E1",X"22",X"5F",X"20",X"3A",X"5C",X"20",X"E6", + X"FE",X"32",X"5C",X"20",X"DF",X"01",X"CD",X"25",X"15",X"3E",X"32",X"32",X"65",X"20",X"C3",X"E2", + X"0A",X"FE",X"05",X"C2",X"3B",X"0C",X"3E",X"17",X"E7",X"0B",X"C3",X"3B",X"0C",X"3D",X"57",X"E6", + X"1F",X"4F",X"7A",X"1F",X"57",X"AF",X"32",X"2C",X"20",X"32",X"66",X"20",X"C3",X"E5",X"0B",X"21", + X"65",X"20",X"35",X"F2",X"D0",X"0C",X"36",X"20",X"3A",X"64",X"20",X"3C",X"FE",X"04",X"C2",X"B3", + X"0C",X"3E",X"00",X"32",X"64",X"20",X"3E",X"0F",X"F7",X"0C",X"3A",X"2D",X"20",X"E6",X"02",X"C2", + X"D0",X"0C",X"21",X"D8",X"0C",X"3A",X"64",X"20",X"3D",X"E6",X"03",X"CD",X"2D",X"02",X"EF",X"0C", + X"CD",X"DC",X"0C",X"DF",X"01",X"C3",X"B9",X"0A",X"01",X"04",X"02",X"08",X"3A",X"64",X"20",X"A7", + X"C8",X"21",X"65",X"20",X"35",X"C0",X"2B",X"46",X"36",X"00",X"2B",X"4E",X"2B",X"2B",X"2B",X"7E", + X"2B",X"6E",X"67",X"CD",X"7F",X"15",X"3E",X"08",X"F7",X"0A",X"3A",X"35",X"20",X"FE",X"17",X"C0", + X"3E",X"1F",X"E7",X"0B",X"C9",X"0F",X"00",X"00",X"10",X"20",X"30",X"40",X"05",X"06",X"00",X"80", + X"19",X"1C",X"02",X"13",X"19",X"1C",X"02",X"13",X"19",X"1C",X"02",X"13",X"19",X"1C",X"02",X"13", + X"3F",X"1C",X"01",X"0C",X"3F",X"1C",X"01",X"0C",X"4A",X"1C",X"02",X"07",X"02",X"4F",X"05",X"28", + X"21",X"2D",X"20",X"7E",X"A7",X"36",X"00",X"C2",X"5C",X"0E",X"3A",X"48",X"20",X"A7",X"C4",X"37", + X"0F",X"21",X"E8",X"20",X"06",X"40",X"CD",X"40",X"00",X"CD",X"4F",X"0D",X"C3",X"66",X"0D",X"3E", + X"DF",X"F7",X"0A",X"F7",X"0B",X"F7",X"0C",X"3A",X"40",X"20",X"E6",X"07",X"C8",X"FE",X"06",X"F0", + X"3E",X"15",X"C3",X"DA",X"0F",X"0A",X"DF",X"01",X"3A",X"40",X"20",X"87",X"87",X"21",X"7F",X"0D", + X"CD",X"2D",X"02",X"5F",X"23",X"56",X"23",X"7E",X"23",X"66",X"6F",X"E9",X"06",X"06",X"08",X"49", + X"0D",X"49",X"0D",X"03",X"0F",X"58",X"0E",X"19",X"0F",X"58",X"0E",X"20",X"0F",X"58",X"0E",X"0C", + X"0F",X"58",X"0E",X"30",X"0F",X"58",X"0E",X"FA",X"0E",X"58",X"0E",X"FD",X"0E",X"58",X"0E",X"00", + X"0F",X"6C",X"0E",X"CF",X"0E",X"58",X"0E",X"D8",X"0E",X"58",X"0E",X"DF",X"0E",X"58",X"0E",X"EA", + X"0E",X"58",X"0E",X"F3",X"0E",X"58",X"0E",X"FA",X"0E",X"58",X"0E",X"FD",X"0E",X"58",X"0E",X"00", + X"0F",X"6C",X"0E",X"03",X"0F",X"58",X"0E",X"0C",X"0F",X"58",X"0E",X"10",X"0F",X"58",X"0E",X"19", + X"0F",X"58",X"0E",X"20",X"0F",X"58",X"0E",X"FA",X"0E",X"58",X"0E",X"FD",X"0E",X"58",X"0E",X"00", + X"0F",X"6C",X"0E",X"29",X"0F",X"58",X"0E",X"20",X"0F",X"58",X"0E",X"EA",X"0E",X"58",X"0E",X"03", + X"0F",X"58",X"0E",X"0C",X"0F",X"58",X"0E",X"FA",X"0E",X"58",X"0E",X"FD",X"0E",X"58",X"0E",X"00", + X"0F",X"6C",X"0E",X"7E",X"3C",X"C8",X"3D",X"23",X"32",X"2A",X"21",X"7E",X"23",X"E5",X"CD",X"43", + X"0F",X"E1",X"C3",X"03",X"0E",X"AF",X"32",X"29",X"21",X"3D",X"32",X"2A",X"21",X"3E",X"06",X"C3", + X"26",X"0E",X"0D",X"CD",X"2D",X"02",X"32",X"28",X"21",X"CD",X"ED",X"0F",X"3A",X"2A",X"21",X"FE", + X"10",X"F0",X"21",X"28",X"21",X"35",X"C2",X"29",X"0E",X"DF",X"01",X"C3",X"1D",X"0E",X"DF",X"01", + X"3A",X"29",X"21",X"A7",X"C0",X"3A",X"40",X"20",X"3C",X"32",X"40",X"20",X"FE",X"21",X"DA",X"56", + X"0E",X"3E",X"01",X"32",X"40",X"20",X"AF",X"C9",X"EB",X"CD",X"03",X"0E",X"CD",X"15",X"0E",X"CD", + X"3E",X"0E",X"C2",X"5C",X"0E",X"AF",X"32",X"2D",X"20",X"C3",X"49",X"0D",X"EB",X"3E",X"80",X"32", + X"2B",X"21",X"CD",X"03",X"0E",X"CD",X"15",X"0E",X"3A",X"2D",X"20",X"E6",X"02",X"C2",X"90",X"0E", + X"21",X"2B",X"21",X"35",X"CA",X"BD",X"0E",X"CD",X"3E",X"0E",X"C2",X"75",X"0E",X"C3",X"49",X"0D", + X"DF",X"01",X"CD",X"15",X"0E",X"21",X"26",X"32",X"06",X"08",X"3E",X"AA",X"CD",X"41",X"00",X"DF", + X"01",X"CD",X"15",X"0E",X"21",X"26",X"32",X"06",X"08",X"3E",X"55",X"CD",X"41",X"00",X"3A",X"2D", + X"20",X"A7",X"F2",X"90",X"0E",X"21",X"26",X"32",X"06",X"08",X"CD",X"40",X"00",X"21",X"E9",X"20", + X"06",X"08",X"36",X"00",X"23",X"23",X"23",X"23",X"05",X"C2",X"C2",X"0E",X"C3",X"5C",X"0E",X"00", + X"00",X"01",X"01",X"02",X"02",X"03",X"03",X"FF",X"00",X"04",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"05",X"01",X"06",X"02",X"07",X"03",X"08",X"04",X"09",X"FF",X"00",X"0B",X"01",X"0C",X"FF",X"FF", + X"FF",X"FF",X"FF",X"00",X"0D",X"01",X"0E",X"02",X"0F",X"FF",X"00",X"0A",X"FF",X"00",X"13",X"FF", + X"00",X"12",X"FF",X"00",X"10",X"01",X"11",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"18",X"FF",X"FF", + X"00",X"16",X"01",X"17",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"19",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"14",X"01",X"15",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"1A",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"1B",X"FF",X"FF",X"FF",X"FF",X"FF",X"21",X"DB",X"17",X"11",X"8F",X"19",X"3A",X"FD",X"1F", + X"C3",X"05",X"0A",X"87",X"21",X"00",X"40",X"CD",X"2D",X"02",X"5F",X"23",X"56",X"3A",X"2A",X"21", + X"21",X"68",X"20",X"87",X"87",X"87",X"CD",X"2D",X"02",X"06",X"06",X"3A",X"40",X"20",X"EE",X"07", + X"4F",X"E6",X"07",X"C2",X"77",X"0F",X"79",X"D6",X"08",X"F2",X"6E",X"0F",X"3E",X"18",X"4F",X"05", + X"1A",X"91",X"91",X"00",X"77",X"13",X"23",X"CD",X"34",X"16",X"21",X"E8",X"20",X"3A",X"2A",X"21", + X"87",X"87",X"CD",X"2D",X"02",X"1A",X"13",X"77",X"47",X"78",X"FE",X"38",X"C2",X"96",X"0F",X"3E", + X"01",X"EF",X"0A",X"C3",X"E3",X"0F",X"78",X"FE",X"33",X"C2",X"A3",X"0F",X"3E",X"01",X"E7",X"0B", + X"C3",X"12",X"4D",X"78",X"FE",X"70",X"C2",X"BC",X"0F",X"3E",X"10",X"EF",X"0C",X"D5",X"E5",X"21", + X"AD",X"1B",X"11",X"E0",X"1F",X"3E",X"A3",X"C3",X"EB",X"4F",X"19",X"4D",X"78",X"FE",X"50",X"C2", + X"CD",X"0F",X"3E",X"01",X"EF",X"0A",X"3E",X"1F",X"E7",X"0B",X"C3",X"E3",X"0F",X"78",X"FE",X"3F", + X"C2",X"E5",X"0F",X"3E",X"1F",X"E7",X"0B",X"C3",X"12",X"4D",X"E7",X"0B",X"3E",X"01",X"EF",X"0A", + X"C9",X"4F",X"4F",X"DF",X"01",X"23",X"36",X"00",X"23",X"73",X"23",X"72",X"C9",X"3A",X"2A",X"21", + X"3C",X"32",X"2A",X"21",X"FE",X"10",X"F0",X"21",X"E8",X"20",X"87",X"87",X"F3",X"CD",X"2D",X"02"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw03.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw03.vhd new file mode 100644 index 00000000..cee80385 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw03.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity mw03 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of mw03 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"FB",X"CA",X"ED",X"0F",X"47",X"3A",X"29",X"21",X"3C",X"32",X"29",X"21",X"23",X"7E",X"A7",X"CA", + X"7D",X"10",X"35",X"21",X"68",X"20",X"3A",X"2A",X"21",X"87",X"87",X"87",X"CD",X"2D",X"02",X"FE", + X"20",X"DA",X"E2",X"10",X"5E",X"23",X"56",X"78",X"78",X"FE",X"50",X"DA",X"48",X"10",X"DB",X"02", + X"E6",X"04",X"CA",X"36",X"10",X"1D",X"78",X"FE",X"66",X"C2",X"48",X"10",X"3A",X"4A",X"20",X"C6", + X"04",X"92",X"14",X"D2",X"48",X"10",X"15",X"15",X"C5",X"4B",X"42",X"23",X"5E",X"23",X"56",X"1A", + X"2B",X"77",X"23",X"13",X"1A",X"77",X"13",X"D5",X"23",X"5E",X"23",X"56",X"D5",X"E5",X"23",X"7E", + X"23",X"66",X"81",X"6F",X"7C",X"80",X"67",X"EB",X"E1",X"2B",X"2B",X"2B",X"2B",X"72",X"2B",X"73", + X"EB",X"C1",X"D1",X"F1",X"A7",X"F8",X"C3",X"25",X"15",X"13",X"C3",X"81",X"10",X"23",X"5E",X"23", + X"56",X"1A",X"A7",X"CA",X"79",X"10",X"FE",X"CD",X"CA",X"63",X"11",X"FE",X"EB",X"CA",X"9A",X"11", + X"FE",X"01",X"CA",X"2E",X"11",X"FE",X"C3",X"CA",X"23",X"11",X"FE",X"AF",X"CA",X"F0",X"10",X"21", + X"E8",X"20",X"3A",X"2A",X"21",X"87",X"87",X"CD",X"2D",X"02",X"7E",X"FE",X"70",X"01",X"D4",X"FE", + X"CA",X"BC",X"10",X"01",X"F6",X"FF",X"7E",X"FE",X"40",X"D2",X"C7",X"10",X"EB",X"F3",X"2A",X"3B", + X"20",X"09",X"22",X"3B",X"20",X"FB",X"EB",X"36",X"00",X"21",X"68",X"20",X"3A",X"2A",X"21",X"87", + X"87",X"87",X"CD",X"2D",X"02",X"5E",X"23",X"56",X"23",X"23",X"23",X"4E",X"23",X"46",X"EB",X"C3", + X"7F",X"15",X"3A",X"2A",X"21",X"21",X"E8",X"20",X"87",X"87",X"CD",X"2D",X"02",X"C3",X"AA",X"10", + X"3A",X"2A",X"21",X"21",X"E8",X"20",X"87",X"87",X"CD",X"2D",X"02",X"F6",X"80",X"77",X"13",X"1A", + X"4F",X"13",X"1A",X"47",X"13",X"23",X"1A",X"77",X"13",X"23",X"73",X"23",X"72",X"21",X"68",X"20", + X"3A",X"2A",X"21",X"87",X"87",X"87",X"CD",X"2D",X"02",X"11",X"06",X"00",X"19",X"71",X"23",X"70", + X"C3",X"AA",X"10",X"13",X"1A",X"4F",X"13",X"1A",X"47",X"C5",X"D1",X"C3",X"81",X"10",X"21",X"E8", + X"20",X"3A",X"2A",X"21",X"87",X"87",X"CD",X"2D",X"02",X"E6",X"7F",X"77",X"23",X"13",X"1A",X"4F", + X"13",X"1A",X"47",X"13",X"1A",X"13",X"77",X"23",X"73",X"23",X"72",X"21",X"68",X"20",X"3A",X"2A", + X"21",X"87",X"87",X"87",X"CD",X"2D",X"02",X"11",X"06",X"00",X"19",X"71",X"23",X"70",X"06",X"01", + X"C3",X"13",X"10",X"3A",X"2A",X"21",X"F5",X"06",X"10",X"0E",X"00",X"21",X"E8",X"20",X"7E",X"A7", + X"CA",X"83",X"11",X"23",X"23",X"23",X"23",X"0C",X"05",X"C2",X"6E",X"11",X"F1",X"13",X"13",X"13", + X"C3",X"81",X"10",X"79",X"32",X"2A",X"21",X"EB",X"23",X"5E",X"23",X"56",X"23",X"E5",X"CD",X"4D", + X"0F",X"E1",X"F1",X"EB",X"32",X"2A",X"21",X"C3",X"81",X"10",X"21",X"68",X"20",X"3A",X"2A",X"21", + X"87",X"87",X"87",X"CD",X"2D",X"02",X"23",X"23",X"13",X"06",X"04",X"CD",X"77",X"0F",X"C3",X"81", + X"10",X"21",X"2D",X"21",X"06",X"08",X"CD",X"40",X"00",X"3E",X"0F",X"32",X"45",X"21",X"AF",X"32", + X"2C",X"21",X"3A",X"E8",X"20",X"FE",X"40",X"CA",X"10",X"12",X"3A",X"2D",X"21",X"A7",X"F2",X"EC", + X"11",X"2A",X"C7",X"1C",X"06",X"70",X"CD",X"E1",X"06",X"AF",X"32",X"2D",X"21",X"32",X"2E",X"21", + X"DF",X"01",X"2A",X"D8",X"1C",X"06",X"28",X"CD",X"E1",X"06",X"DF",X"01",X"21",X"2D",X"21",X"3A", + X"2C",X"21",X"CD",X"2D",X"02",X"C2",X"C1",X"12",X"11",X"45",X"21",X"1A",X"21",X"E8",X"20",X"87", + X"87",X"CD",X"2D",X"02",X"C2",X"71",X"12",X"EB",X"35",X"EB",X"F2",X"FB",X"11",X"3E",X"0F",X"12", + X"DF",X"01",X"3A",X"E8",X"20",X"FE",X"40",X"C2",X"54",X"12",X"3A",X"2D",X"21",X"A7",X"FA",X"3F", + X"12",X"3E",X"80",X"32",X"2D",X"21",X"21",X"C7",X"1C",X"CD",X"F4",X"14",X"21",X"3E",X"20",X"34", + X"7E",X"E6",X"0F",X"47",X"0E",X"08",X"21",X"1A",X"39",X"CD",X"3D",X"16",X"C3",X"54",X"12",X"3A", + X"EC",X"20",X"FE",X"40",X"C2",X"54",X"12",X"3A",X"2E",X"21",X"A7",X"FA",X"54",X"12",X"21",X"D8", + X"1C",X"CD",X"F4",X"14",X"21",X"2C",X"21",X"34",X"3A",X"40",X"20",X"06",X"04",X"0E",X"04",X"D6", + X"08",X"DA",X"69",X"12",X"04",X"0D",X"C2",X"5F",X"12",X"78",X"BE",X"D2",X"C2",X"11",X"C3",X"BE", + X"11",X"FE",X"40",X"D2",X"07",X"12",X"21",X"3D",X"20",X"35",X"7E",X"E6",X"35",X"C2",X"07",X"12", + X"1A",X"21",X"68",X"20",X"87",X"87",X"87",X"CD",X"2D",X"02",X"D6",X"08",X"5F",X"23",X"56",X"23", + X"23",X"23",X"23",X"7E",X"1F",X"A7",X"82",X"57",X"FE",X"20",X"DA",X"10",X"12",X"3A",X"2C",X"21", + X"21",X"2D",X"21",X"CD",X"2D",X"02",X"36",X"01",X"3A",X"2C",X"21",X"21",X"35",X"21",X"87",X"CD", + X"2D",X"02",X"73",X"23",X"72",X"EB",X"11",X"58",X"13",X"06",X"03",X"CD",X"A0",X"15",X"C3",X"10", + X"12",X"3A",X"2C",X"21",X"21",X"35",X"21",X"87",X"CD",X"2D",X"02",X"5E",X"23",X"56",X"DB",X"02", + X"E6",X"04",X"3E",X"FA",X"C2",X"D9",X"12",X"3E",X"FB",X"83",X"2B",X"77",X"E5",X"CD",X"4F",X"13", + X"E1",X"7E",X"FE",X"18",X"DA",X"31",X"13",X"23",X"66",X"6F",X"11",X"58",X"13",X"06",X"03",X"CD", + X"A0",X"15",X"DF",X"01",X"79",X"A7",X"CA",X"10",X"12",X"3A",X"2C",X"21",X"21",X"35",X"21",X"87", + X"CD",X"2D",X"02",X"5F",X"FE",X"20",X"DA",X"10",X"12",X"23",X"56",X"FE",X"28",X"D2",X"31",X"13", + X"3A",X"4A",X"20",X"BA",X"D2",X"31",X"13",X"C6",X"0F",X"BA",X"DA",X"31",X"13",X"CD",X"37",X"13", + X"3E",X"01",X"32",X"2E",X"20",X"DF",X"01",X"3A",X"2E",X"20",X"A7",X"C2",X"25",X"13",X"C3",X"10", + X"12",X"CD",X"37",X"13",X"C3",X"10",X"12",X"3A",X"2C",X"21",X"21",X"2D",X"21",X"CD",X"2D",X"02", + X"36",X"00",X"3A",X"2C",X"21",X"21",X"35",X"21",X"87",X"CD",X"2D",X"02",X"5F",X"23",X"56",X"21", + X"58",X"13",X"06",X"03",X"EB",X"C3",X"DD",X"15",X"0F",X"00",X"0F",X"11",X"14",X"1F",X"21",X"46", + X"21",X"06",X"28",X"CD",X"34",X"16",X"DF",X"01",X"06",X"14",X"21",X"46",X"21",X"C5",X"E5",X"7E", + X"23",X"66",X"6F",X"CD",X"0C",X"16",X"E1",X"C1",X"DF",X"01",X"23",X"23",X"05",X"C2",X"6D",X"13", + X"06",X"14",X"21",X"46",X"21",X"3A",X"3F",X"20",X"C6",X"01",X"4F",X"E5",X"7E",X"23",X"66",X"6F", + X"C5",X"CD",X"2C",X"16",X"C1",X"E1",X"E5",X"5E",X"23",X"56",X"1D",X"7B",X"FE",X"28",X"D2",X"A3", + X"13",X"1E",X"D8",X"2B",X"73",X"EB",X"C5",X"CD",X"0C",X"16",X"C1",X"E1",X"23",X"23",X"05",X"C2", + X"B7",X"13",X"06",X"14",X"21",X"46",X"21",X"0D",X"C2",X"8B",X"13",X"DF",X"01",X"C3",X"85",X"13", + X"01",X"00",X"00",X"3A",X"58",X"20",X"A7",X"CA",X"18",X"14",X"0F",X"D2",X"D7",X"13",X"21",X"A5", + X"1D",X"CD",X"F4",X"14",X"C3",X"E4",X"13",X"DF",X"01",X"3A",X"30",X"20",X"A7",X"CA",X"D7",X"13", + X"AF",X"32",X"30",X"20",X"3A",X"58",X"20",X"3D",X"87",X"21",X"F4",X"13",X"CD",X"2D",X"02",X"5F", + X"23",X"56",X"EB",X"E9",X"4E",X"14",X"94",X"14",X"78",X"14",X"EC",X"14",X"7E",X"14",X"B6",X"14", + X"78",X"14",X"D9",X"14",X"3A",X"58",X"20",X"3C",X"32",X"58",X"20",X"FE",X"09",X"DC",X"C0",X"01", + X"3E",X"01",X"32",X"58",X"20",X"CD",X"C0",X"01",X"21",X"A5",X"1D",X"CD",X"F4",X"14",X"21",X"73", + X"1D",X"CD",X"F4",X"14",X"3A",X"46",X"20",X"3D",X"CA",X"31",X"14",X"21",X"90",X"1D",X"CD",X"F4", + X"14",X"CD",X"37",X"14",X"C3",X"1E",X"14",X"21",X"03",X"24",X"3A",X"FB",X"1F",X"01",X"20",X"00", + X"16",X"D0",X"86",X"5F",X"09",X"15",X"C2",X"42",X"14",X"A7",X"C8",X"C3",X"48",X"15",X"21",X"BF", + X"1D",X"CD",X"F4",X"14",X"21",X"1A",X"24",X"3A",X"FA",X"1F",X"CD",X"3D",X"14",X"21",X"F9",X"1D", + X"CD",X"F4",X"14",X"21",X"F4",X"01",X"DF",X"01",X"2B",X"7C",X"B5",X"C2",X"66",X"14",X"3A",X"58", + X"20",X"3C",X"32",X"58",X"20",X"C3",X"C3",X"13",X"21",X"C7",X"1E",X"C3",X"60",X"14",X"21",X"BF", + X"1D",X"CD",X"F4",X"14",X"21",X"38",X"1E",X"DB",X"02",X"E6",X"08",X"CA",X"60",X"14",X"21",X"60", + X"1E",X"C3",X"60",X"14",X"3E",X"01",X"32",X"40",X"20",X"DF",X"02",X"78",X"E6",X"3F",X"47",X"03", + X"0A",X"32",X"5B",X"20",X"3A",X"30",X"20",X"A7",X"C2",X"04",X"14",X"2A",X"3B",X"20",X"7C",X"A7", + X"FA",X"04",X"14",X"C3",X"99",X"14",X"3E",X"08",X"32",X"40",X"20",X"21",X"90",X"01",X"22",X"3B", + X"20",X"01",X"00",X"10",X"3E",X"30",X"32",X"5B",X"20",X"DF",X"02",X"AF",X"32",X"66",X"20",X"3A", + X"30",X"20",X"A7",X"CA",X"C4",X"14",X"C3",X"04",X"14",X"3E",X"0B",X"32",X"40",X"20",X"3E",X"01", + X"32",X"3F",X"20",X"21",X"F4",X"01",X"22",X"3B",X"20",X"C3",X"99",X"14",X"3E",X"0D",X"32",X"40", + X"20",X"C3",X"99",X"14",X"5E",X"23",X"56",X"23",X"4E",X"23",X"46",X"23",X"E5",X"7E",X"C5",X"EB", + X"0E",X"08",X"47",X"CD",X"3D",X"16",X"EB",X"C1",X"E1",X"0D",X"CA",X"1D",X"15",X"78",X"A7",X"CA", + X"FB",X"14",X"C5",X"DF",X"01",X"05",X"C2",X"13",X"15",X"C1",X"C3",X"FB",X"14",X"23",X"7E",X"A7", + X"C8",X"23",X"C3",X"F4",X"14",X"C5",X"CD",X"6C",X"15",X"78",X"C1",X"F5",X"7C",X"FE",X"24",X"DA", + X"62",X"15",X"F1",X"E5",X"36",X"00",X"C5",X"47",X"C5",X"1A",X"13",X"D5",X"EB",X"6F",X"26",X"00", + X"05",X"FA",X"48",X"15",X"29",X"C3",X"40",X"15",X"EB",X"7E",X"B3",X"77",X"23",X"72",X"D1",X"C1", + X"0D",X"C2",X"38",X"15",X"78",X"C1",X"E1",X"05",X"C8",X"D5",X"11",X"20",X"00",X"19",X"D1",X"C3", + X"2B",X"15",X"79",X"3D",X"13",X"C2",X"63",X"15",X"F1",X"C3",X"57",X"15",X"7D",X"E6",X"07",X"47", + X"37",X"0E",X"03",X"7C",X"1F",X"67",X"7D",X"1F",X"6F",X"A7",X"0D",X"C2",X"73",X"15",X"C9",X"C5", + X"CD",X"70",X"15",X"C1",X"11",X"20",X"00",X"AF",X"7C",X"FE",X"24",X"DA",X"9A",X"15",X"AF",X"E5", + X"C5",X"77",X"0D",X"23",X"77",X"C2",X"91",X"15",X"C1",X"E1",X"05",X"C8",X"19",X"C3",X"88",X"15", + X"0E",X"00",X"C5",X"CD",X"6C",X"15",X"78",X"C1",X"E5",X"C5",X"47",X"C5",X"1A",X"13",X"D5",X"EB", + X"6F",X"26",X"00",X"05",X"FA",X"BB",X"15",X"29",X"C3",X"B3",X"15",X"EB",X"7E",X"A3",X"B1",X"4F", + X"7E",X"B3",X"77",X"23",X"7E",X"A2",X"B1",X"4F",X"7E",X"B2",X"77",X"69",X"D1",X"C1",X"78",X"C1", + X"4D",X"E1",X"05",X"C8",X"D5",X"11",X"20",X"00",X"19",X"D1",X"C3",X"A8",X"15",X"C5",X"CD",X"6C", + X"15",X"78",X"C1",X"C5",X"47",X"C5",X"1A",X"13",X"D5",X"EB",X"6F",X"26",X"00",X"05",X"FA",X"F5", + X"15",X"29",X"C3",X"ED",X"15",X"EB",X"7B",X"2F",X"A6",X"77",X"23",X"7A",X"2F",X"A6",X"77",X"11", + X"1F",X"00",X"19",X"D1",X"C1",X"78",X"C1",X"05",X"C2",X"E3",X"15",X"C9",X"CD",X"6C",X"15",X"48", + X"06",X"01",X"11",X"C0",X"13",X"1A",X"13",X"EB",X"6F",X"26",X"00",X"0D",X"FA",X"23",X"16",X"29", + X"C3",X"1B",X"16",X"EB",X"7E",X"B3",X"77",X"23",X"7E",X"B2",X"77",X"C9",X"11",X"C0",X"13",X"06", + X"01",X"C3",X"DD",X"15",X"1A",X"77",X"13",X"23",X"05",X"C2",X"34",X"16",X"C9",X"C5",X"E5",X"21", + X"5B",X"16",X"58",X"16",X"00",X"EB",X"29",X"29",X"29",X"19",X"EB",X"E1",X"1A",X"77",X"13",X"C5", + X"01",X"20",X"00",X"09",X"C1",X"0D",X"C2",X"4C",X"16",X"C1",X"C9",X"00",X"3E",X"45",X"49",X"51", + X"3E",X"00",X"00",X"00",X"00",X"21",X"7F",X"01",X"00",X"00",X"00",X"00",X"23",X"45",X"49",X"49", + X"31",X"00",X"00",X"00",X"42",X"41",X"49",X"59",X"66",X"00",X"00",X"00",X"0C",X"14",X"24",X"7F", + X"04",X"00",X"00",X"00",X"72",X"51",X"51",X"51",X"4E",X"00",X"00",X"00",X"1E",X"29",X"49",X"49", + X"46",X"00",X"00",X"00",X"40",X"47",X"48",X"50",X"60",X"00",X"00",X"00",X"36",X"49",X"49",X"49", + X"36",X"00",X"00",X"00",X"31",X"49",X"49",X"4A",X"3C",X"00",X"00",X"00",X"1F",X"24",X"44",X"24", + X"1F",X"00",X"00",X"00",X"7F",X"49",X"49",X"49",X"36",X"00",X"00",X"00",X"3E",X"41",X"41",X"41", + X"22",X"00",X"00",X"00",X"7F",X"41",X"41",X"41",X"3E",X"00",X"00",X"00",X"7F",X"49",X"49",X"49", + X"41",X"00",X"00",X"00",X"7F",X"48",X"48",X"48",X"40",X"00",X"00",X"00",X"3E",X"41",X"41",X"45", + X"47",X"00",X"00",X"00",X"7F",X"08",X"08",X"08",X"7F",X"00",X"00",X"00",X"00",X"41",X"7F",X"41", + X"00",X"00",X"00",X"00",X"02",X"01",X"01",X"01",X"7E",X"00",X"00",X"00",X"7F",X"08",X"14",X"22", + X"41",X"00",X"00",X"00",X"7F",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"7F",X"20",X"18",X"20", + X"7F",X"00",X"00",X"00",X"7F",X"10",X"08",X"04",X"7F",X"00",X"00",X"00",X"3E",X"41",X"41",X"41", + X"3E",X"00",X"00",X"00",X"7F",X"48",X"48",X"48",X"30",X"00",X"00",X"00",X"3E",X"41",X"45",X"42", + X"3D",X"00",X"00",X"00",X"7F",X"48",X"4C",X"4A",X"31",X"00",X"00",X"00",X"32",X"49",X"49",X"49", + X"26",X"00",X"00",X"00",X"40",X"40",X"7F",X"40",X"40",X"00",X"00",X"00",X"7E",X"01",X"01",X"01", + X"7E",X"00",X"00",X"00",X"7C",X"02",X"01",X"02",X"7C",X"00",X"00",X"00",X"7F",X"02",X"0C",X"02", + X"7F",X"00",X"00",X"00",X"63",X"14",X"08",X"14",X"63",X"00",X"00",X"00",X"60",X"10",X"0F",X"10", + X"60",X"00",X"00",X"00",X"43",X"45",X"49",X"51",X"61",X"00",X"00",X"00",X"08",X"14",X"22",X"41", + X"00",X"00",X"00",X"00",X"00",X"41",X"22",X"14",X"08",X"00",X"00",X"00",X"14",X"14",X"14",X"14", + X"14",X"00",X"00",X"00",X"22",X"14",X"7F",X"14",X"22",X"00",X"00",X"00",X"30",X"40",X"45",X"48", + X"30",X"00",X"00",X"00",X"36",X"49",X"49",X"35",X"02",X"05",X"00",X"00",X"08",X"08",X"3E",X"08", + X"08",X"00",X"00",X"00",X"08",X"08",X"08",X"08",X"08",X"00",X"00",X"00",X"04",X"08",X"08",X"08", + X"10",X"00",X"00",X"00",X"00",X"00",X"7B",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"20",X"40",X"00",X"00",X"00",X"FB",X"17",X"00",X"00",X"B0", + X"01",X"B8",X"03",X"5C",X"07",X"EE",X"0E",X"13",X"19",X"4F",X"1E",X"E8",X"02",X"4F",X"1E",X"13", + X"19",X"EE",X"0E",X"5C",X"07",X"B8",X"03",X"B0",X"01",X"00",X"00",X"DB",X"17",X"00",X"00",X"B0"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw04.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw04.vhd new file mode 100644 index 00000000..3b6861b8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw04.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity mw04 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of mw04 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"01",X"B8",X"03",X"5C",X"07",X"EE",X"0E",X"F3",X"19",X"FF",X"1F",X"F8",X"03",X"FF",X"1F",X"F3", + X"19",X"EE",X"0E",X"5C",X"07",X"B8",X"03",X"B0",X"01",X"00",X"00",X"3B",X"18",X"00",X"00",X"80", + X"07",X"80",X"0F",X"C0",X"1D",X"E0",X"3B",X"F8",X"67",X"5E",X"7C",X"C7",X"08",X"5E",X"7C",X"F8", + X"67",X"E0",X"3B",X"C0",X"1D",X"80",X"0F",X"80",X"07",X"00",X"00",X"1B",X"18",X"00",X"00",X"80", + X"07",X"80",X"0F",X"C0",X"1D",X"E0",X"3B",X"F8",X"7F",X"5E",X"7C",X"FF",X"08",X"5E",X"7C",X"F8", + X"7F",X"E0",X"3B",X"C0",X"1D",X"80",X"0F",X"80",X"07",X"00",X"00",X"7B",X"18",X"00",X"00",X"F0", + X"0F",X"80",X"1F",X"80",X"34",X"E0",X"6F",X"38",X"79",X"9E",X"30",X"BF",X"1F",X"9E",X"30",X"38", + X"79",X"E0",X"6F",X"80",X"34",X"80",X"1F",X"F0",X"0F",X"00",X"00",X"5B",X"18",X"00",X"00",X"F0", + X"0F",X"80",X"1F",X"80",X"34",X"E0",X"6F",X"38",X"7F",X"9E",X"36",X"B1",X"1F",X"9E",X"36",X"38", + X"7F",X"E0",X"6F",X"80",X"34",X"80",X"1F",X"F0",X"0F",X"00",X"00",X"BB",X"18",X"00",X"00",X"F0", + X"0F",X"C8",X"13",X"40",X"02",X"E0",X"07",X"70",X"5F",X"BF",X"7B",X"58",X"70",X"BF",X"7B",X"70", + X"5F",X"E0",X"07",X"40",X"02",X"C8",X"13",X"F0",X"0F",X"00",X"00",X"9B",X"18",X"00",X"00",X"F0", + X"0F",X"C8",X"13",X"40",X"02",X"E0",X"07",X"70",X"5F",X"BF",X"7B",X"5E",X"7C",X"BF",X"7B",X"70", + X"5F",X"E0",X"07",X"40",X"02",X"C8",X"13",X"F0",X"0F",X"00",X"00",X"FB",X"18",X"00",X"00",X"F0", + X"01",X"F8",X"03",X"0C",X"06",X"06",X"0C",X"E3",X"18",X"BF",X"1F",X"1F",X"1F",X"BF",X"1F",X"E3", + X"18",X"06",X"0C",X"0C",X"06",X"F8",X"03",X"F0",X"01",X"00",X"00",X"1B",X"19",X"00",X"00",X"F0", + X"01",X"F8",X"03",X"0C",X"07",X"06",X"0F",X"E3",X"1F",X"B3",X"19",X"13",X"19",X"B3",X"19",X"FF", + X"18",X"1E",X"0C",X"1C",X"06",X"F8",X"03",X"F0",X"01",X"00",X"00",X"3B",X"19",X"00",X"00",X"F0", + X"01",X"F8",X"03",X"EC",X"06",X"E6",X"0C",X"E3",X"18",X"B3",X"19",X"13",X"19",X"B3",X"19",X"E3", + X"18",X"E6",X"0C",X"EC",X"06",X"F8",X"03",X"F0",X"01",X"00",X"00",X"DB",X"18",X"00",X"00",X"F0", + X"01",X"F8",X"03",X"1C",X"06",X"1E",X"0C",X"FF",X"18",X"B3",X"19",X"13",X"19",X"B3",X"19",X"E3", + X"1F",X"06",X"0F",X"0C",X"07",X"F8",X"03",X"F0",X"01",X"00",X"00",X"68",X"19",X"00",X"1C",X"2A", + X"75",X"6B",X"75",X"3D",X"2F",X"1E",X"0C",X"00",X"75",X"19",X"00",X"0C",X"1E",X"2F",X"3B",X"65", + X"7B",X"7D",X"32",X"1C",X"00",X"82",X"19",X"00",X"18",X"3C",X"7E",X"5A",X"5F",X"6B",X"57",X"2A", + X"1C",X"00",X"5B",X"19",X"00",X"1C",X"26",X"5B",X"6F",X"5D",X"72",X"7E",X"3C",X"18",X"00",X"59", + X"1A",X"03",X"00",X"00",X"00",X"00",X"0F",X"00",X"00",X"00",X"00",X"1F",X"00",X"00",X"00",X"00", + X"3E",X"00",X"00",X"00",X"00",X"7C",X"00",X"00",X"00",X"00",X"F8",X"00",X"00",X"00",X"00",X"F0", + X"01",X"00",X"00",X"00",X"E0",X"03",X"00",X"00",X"00",X"C0",X"0F",X"00",X"00",X"00",X"80",X"1F", + X"00",X"00",X"00",X"00",X"2F",X"00",X"00",X"10",X"00",X"7E",X"00",X"00",X"00",X"00",X"7E",X"00", + X"00",X"00",X"00",X"FC",X"00",X"00",X"00",X"00",X"E8",X"03",X"00",X"00",X"00",X"D0",X"0B",X"00", + X"00",X"00",X"F0",X"15",X"00",X"00",X"00",X"A0",X"2B",X"00",X"00",X"00",X"40",X"55",X"00",X"00", + X"00",X"80",X"EA",X"00",X"00",X"00",X"00",X"DD",X"03",X"00",X"00",X"00",X"36",X"05",X"00",X"00", + X"00",X"AA",X"08",X"00",X"00",X"00",X"1C",X"1B",X"00",X"00",X"00",X"58",X"36",X"00",X"00",X"00", + X"A0",X"59",X"00",X"00",X"00",X"40",X"67",X"00",X"00",X"00",X"C0",X"CC",X"01",X"00",X"00",X"80", + X"45",X"01",X"00",X"00",X"00",X"AB",X"03",X"00",X"00",X"00",X"50",X"06",X"00",X"00",X"00",X"A4", + X"0C",X"00",X"00",X"00",X"8C",X"05",X"00",X"00",X"00",X"18",X"09",X"00",X"00",X"00",X"30",X"11", + X"00",X"00",X"00",X"40",X"02",X"00",X"00",X"00",X"80",X"04",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"8F",X"19",X"03",X"00",X"00",X"00",X"00", + X"0F",X"00",X"00",X"00",X"00",X"1F",X"00",X"00",X"00",X"00",X"3E",X"00",X"00",X"00",X"00",X"7C", + X"00",X"00",X"00",X"00",X"F8",X"00",X"00",X"00",X"00",X"F0",X"01",X"00",X"00",X"00",X"E0",X"07", + X"00",X"00",X"00",X"C0",X"0F",X"00",X"00",X"00",X"80",X"1F",X"00",X"00",X"00",X"00",X"2F",X"00", + X"00",X"00",X"00",X"6E",X"00",X"00",X"00",X"00",X"DA",X"00",X"00",X"00",X"00",X"EC",X"01",X"00", + X"00",X"00",X"A8",X"03",X"00",X"00",X"00",X"5C",X"0B",X"00",X"00",X"00",X"E0",X"16",X"00",X"00", + X"00",X"A0",X"2D",X"00",X"00",X"00",X"C0",X"71",X"00",X"00",X"00",X"80",X"E5",X"00",X"00",X"00", + X"00",X"CB",X"01",X"00",X"00",X"00",X"36",X"05",X"00",X"00",X"00",X"68",X"02",X"00",X"00",X"00", + X"94",X"0C",X"00",X"00",X"00",X"48",X"39",X"00",X"00",X"00",X"90",X"52",X"00",X"00",X"00",X"20", + X"A5",X"00",X"00",X"00",X"C0",X"48",X"01",X"00",X"00",X"80",X"05",X"02",X"00",X"00",X"00",X"2B", + X"05",X"00",X"00",X"00",X"54",X"0A",X"00",X"00",X"00",X"A8",X"14",X"00",X"00",X"00",X"94",X"01", + X"00",X"00",X"00",X"08",X"01",X"00",X"00",X"00",X"10",X"02",X"00",X"00",X"00",X"20",X"04",X"00", + X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"23",X"1B",X"00",X"00",X"20",X"00",X"30",X"00",X"30",X"00",X"30",X"00",X"34", + X"00",X"3C",X"00",X"2C",X"00",X"7C",X"00",X"7C",X"00",X"3C",X"00",X"3C",X"00",X"3C",X"00",X"3C", + X"00",X"3C",X"00",X"BC",X"00",X"7C",X"00",X"7C",X"00",X"7C",X"01",X"FE",X"00",X"7E",X"00",X"FE", + X"00",X"FE",X"01",X"7E",X"03",X"FE",X"0F",X"7E",X"0F",X"FC",X"01",X"FC",X"03",X"FC",X"00",X"7C", + X"01",X"7C",X"02",X"7C",X"04",X"3C",X"00",X"38",X"00",X"3C",X"00",X"7A",X"00",X"B8",X"00",X"38", + X"00",X"10",X"00",X"00",X"00",X"75",X"1B",X"40",X"A0",X"00",X"60",X"FF",X"F0",X"FF",X"60",X"00", + X"A0",X"40",X"82",X"1B",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"6C",X"00",X"FE",X"03",X"6C",X"00",X"38",X"00",X"F7",X"01",X"7F",X"1F",X"1E",X"FE",X"7F", + X"1F",X"F7",X"01",X"38",X"00",X"6C",X"00",X"FE",X"03",X"6C",X"00",X"00",X"00",X"B9",X"1B",X"00", + X"00",X"1C",X"0E",X"3B",X"3B",X"0E",X"1C",X"00",X"00",X"AD",X"1B",X"00",X"00",X"1C",X"0E",X"3F", + X"3F",X"0E",X"1C",X"00",X"00",X"E3",X"1B",X"3E",X"7C",X"63",X"C6",X"DD",X"BB",X"DD",X"BB",X"63", + X"C6",X"3E",X"7C",X"00",X"00",X"00",X"00",X"3E",X"7C",X"63",X"C6",X"DD",X"BB",X"DD",X"BB",X"63", + X"C6",X"3E",X"7C",X"C5",X"1B",X"3E",X"7C",X"6B",X"B6",X"D5",X"AB",X"D5",X"AB",X"6B",X"D6",X"BE", + X"7D",X"C0",X"03",X"C0",X"03",X"BE",X"7D",X"6B",X"D6",X"D5",X"AB",X"D5",X"AB",X"6B",X"D6",X"3E", + X"7C",X"0D",X"1C",X"00",X"00",X"3C",X"05",X"FF",X"1F",X"3C",X"05",X"00",X"00",X"01",X"1C",X"00", + X"00",X"3C",X"05",X"F7",X"1F",X"3C",X"05",X"00",X"00",X"80",X"00",X"80",X"02",X"50",X"48",X"54", + X"21",X"2A",X"04",X"40",X"0B",X"A8",X"24",X"D2",X"0D",X"E0",X"0A",X"F8",X"C7",X"F0",X"24",X"61", + X"04",X"D8",X"1A",X"54",X"25",X"00",X"02",X"88",X"15",X"A4",X"22",X"00",X"00",X"80",X"00",X"54", + X"2A",X"BB",X"56",X"30",X"E8",X"30",X"56",X"B3",X"2A",X"94",X"80",X"B4",X"28",X"1D",X"80",X"43", + X"52",X"24",X"80",X"5C",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"10",X"20",X"00",X"40",X"20", + X"39",X"12",X"2A",X"80",X"C8",X"46",X"09",X"04",X"10",X"95",X"8F",X"A7",X"02",X"00",X"88",X"F1", + X"5E",X"04",X"00",X"55",X"34",X"29",X"22",X"90",X"B2",X"D2",X"76",X"11",X"24",X"F5",X"6F",X"4B", + X"08",X"40",X"FF",X"FF",X"BB",X"02",X"C0",X"FF",X"FF",X"7F",X"02",X"BB",X"FF",X"FF",X"FF",X"DD", + X"C0",X"FF",X"FF",X"7F",X"00",X"20",X"DF",X"FF",X"1F",X"03",X"00",X"F5",X"EF",X"C9",X"20",X"92", + X"EC",X"52",X"76",X"49",X"48",X"CA",X"7C",X"77",X"10",X"04",X"A5",X"97",X"0D",X"00",X"10",X"52", + X"6A",X"55",X"09",X"08",X"28",X"D5",X"22",X"13",X"00",X"94",X"38",X"05",X"00",X"00",X"04",X"10", + X"08",X"00",X"00",X"20",X"10",X"00",X"00",X"1A",X"2C",X"0C",X"03",X"0D",X"18",X"0C",X"14",X"12", + X"17",X"10",X"2E",X"1D",X"12",X"16",X"0E",X"00",X"18",X"28",X"05",X"03",X"1B",X"0E",X"0A",X"0D", + X"22",X"00",X"10",X"29",X"12",X"00",X"10",X"0A",X"16",X"0E",X"2E",X"18",X"1F",X"0E",X"1B",X"2E", + X"19",X"15",X"0A",X"22",X"0E",X"1B",X"2E",X"01",X"00",X"10",X"29",X"12",X"00",X"10",X"0A",X"16", + X"0E",X"2E",X"18",X"1F",X"0E",X"1B",X"2E",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"2E",X"02",X"00", + X"10",X"2B",X"0D",X"00",X"1D",X"1B",X"22",X"2E",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"24",X"01", + X"25",X"00",X"10",X"2B",X"0D",X"00",X"1D",X"1B",X"22",X"2E",X"19",X"15",X"0A",X"22",X"0E",X"1B", + X"24",X"02",X"25",X"00",X"1E",X"25",X"1A",X"00",X"1C",X"0C",X"18",X"1B",X"0E",X"24",X"01",X"25", + X"2E",X"11",X"12",X"2B",X"1C",X"0C",X"18",X"1B",X"0E",X"2E",X"1C",X"0C",X"18",X"1B",X"0E",X"24", + X"02",X"25",X"00",X"1C",X"2D",X"05",X"00",X"19",X"18",X"12",X"17",X"1D",X"00",X"01",X"36",X"06", + X"00",X"0C",X"1B",X"0E",X"0D",X"12",X"1D",X"00",X"01",X"25",X"06",X"00",X"0E",X"17",X"0E",X"1B", + X"10",X"22",X"00",X"14",X"30",X"04",X"0F",X"19",X"1E",X"1C",X"11",X"01",X"12",X"2A",X"0F",X"0F", + X"01",X"2E",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"2E",X"0B",X"1E",X"1D",X"1D",X"18",X"17",X"00", + X"10",X"2A",X"10",X"0F",X"02",X"2E",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"1C",X"2E",X"0B",X"1E", + X"1D",X"1D",X"18",X"17",X"00",X"03",X"27",X"15",X"00",X"27",X"2E",X"1C",X"11",X"12",X"17",X"2E", + X"17",X"12",X"11",X"18",X"17",X"2E",X"14",X"12",X"14",X"0A",X"14",X"1E",X"2E",X"27",X"00",X"1A", + X"2C",X"0A",X"1F",X"18",X"23",X"16",X"0A",X"2E",X"2E",X"20",X"0A",X"1B",X"1C",X"01",X"18",X"2F", + X"05",X"1F",X"15",X"0E",X"1D",X"2F",X"1C",X"01",X"16",X"2B",X"0C",X"1F",X"1D",X"1B",X"0A",X"1F", + X"0E",X"15",X"29",X"0F",X"12",X"10",X"11",X"1D",X"01",X"14",X"2B",X"0B",X"1F",X"1C",X"19",X"0A", + X"0C",X"0E",X"2E",X"20",X"18",X"1B",X"15",X"0D",X"00",X"10",X"2E",X"07",X"00",X"27",X"1C",X"0C", + X"18",X"1B",X"0E",X"27",X"01",X"0E",X"2B",X"0E",X"00",X"1E",X"0F",X"18",X"2E",X"2E",X"2E",X"2E", + X"01",X"00",X"00",X"2C",X"05",X"00",X"00",X"01",X"0C",X"2B",X"0C",X"00",X"16",X"0E",X"1D",X"0E", + X"18",X"2E",X"2E",X"05",X"00",X"2C",X"07",X"00",X"01",X"0A",X"2B",X"0A",X"00",X"0C",X"18",X"16", + X"0E",X"1D",X"2E",X"2E",X"08",X"00",X"00",X"00",X"12",X"2A",X"0F",X"00",X"27",X"0C",X"11",X"0A", + X"1B",X"10",X"0E",X"2E",X"0E",X"17",X"0E",X"1B",X"10",X"22",X"27",X"01",X"10",X"2B",X"0F",X"00", + X"0D",X"18",X"0C",X"14",X"12",X"17",X"10",X"2E",X"2E",X"2A",X"01",X"05",X"00",X"00",X"00",X"01", + X"0E",X"29",X"13",X"00",X"27",X"0C",X"1B",X"0A",X"1C",X"11",X"2E",X"15",X"18",X"1C",X"1D",X"2E", + X"0E",X"17",X"0E",X"1B",X"10",X"22",X"27",X"01",X"0C",X"2B",X"0F",X"00",X"1E",X"0F",X"18",X"2E", + X"2E",X"2E",X"2E",X"2E",X"2E",X"2B",X"01",X"05",X"00",X"00",X"00",X"01",X"0A",X"2B",X"0E",X"00", + X"16",X"0E",X"1D",X"0E",X"18",X"2E",X"2E",X"2E",X"2E",X"2B",X"08",X"00",X"00",X"00",X"01",X"08", + X"2B",X"0F",X"00",X"0C",X"18",X"16",X"0E",X"1D",X"2E",X"2E",X"2E",X"2E",X"2B",X"02",X"00",X"00", + X"00",X"00",X"01",X"06",X"2B",X"0F",X"00",X"16",X"12",X"1C",X"1C",X"12",X"15",X"0E",X"2E",X"2E", + X"2B",X"01",X"00",X"00",X"00",X"00",X"00",X"14",X"2D",X"0B",X"00",X"12",X"17",X"1C",X"0E",X"1B", + X"1D",X"2E",X"0C",X"18",X"12",X"17",X"01",X"12",X"2B",X"0E",X"00",X"01",X"2E",X"18",X"1B",X"2E", + X"02",X"2E",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"1C",X"01",X"10",X"2B",X"0F",X"00",X"01",X"2E", + X"19",X"15",X"0A",X"22",X"0E",X"1B",X"2E",X"01",X"2E",X"0C",X"18",X"12",X"17",X"01",X"0E",X"2A", + X"11",X"00",X"02",X"2E",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"1C",X"2E",X"02",X"2E",X"0C",X"18", + X"12",X"17",X"1C",X"00",X"DE",X"88",X"D0",X"B8",X"C2",X"26",X"B6",X"CC",X"B0",X"60",X"A8",X"44", + X"A6",X"9C",X"9A",X"FC",X"8B",X"C8",X"7C",X"90",X"76",X"24",X"7C",X"90",X"68",X"C0",X"60",X"60", + X"4C",X"DC",X"48",X"84",X"3E",X"30",X"34",X"F8",X"2C",X"48",X"18",X"30",X"07",X"07",X"07",X"07", + X"45",X"1F",X"0A",X"15",X"0A",X"40",X"1F",X"15",X"0A",X"15",X"51",X"1F",X"00",X"0A",X"07",X"0A", + X"00",X"58",X"1F",X"00",X"05",X"0E",X"05",X"00",X"5F",X"1F",X"00",X"0A",X"0D",X"0A",X"00",X"4A", + X"1F",X"00",X"05",X"0B",X"05",X"00",X"66",X"1F",X"FF",X"0F",X"6A",X"1F",X"00",X"00",X"80",X"07", + X"E0",X"1B",X"F8",X"77",X"47",X"5C",X"FC",X"77",X"F0",X"3B",X"E0",X"1D",X"C0",X"0F",X"80",X"07", + X"00",X"00",X"A6",X"1F",X"00",X"00",X"00",X"00",X"D8",X"00",X"DC",X"01",X"FE",X"03",X"73",X"06", + X"FD",X"05",X"FF",X"07",X"FF",X"07",X"FF",X"07",X"FD",X"05",X"73",X"06",X"FE",X"03",X"DC",X"01", + X"D8",X"00",X"00",X"00",X"00",X"00",X"CA",X"1F",X"00",X"00",X"00",X"00",X"F8",X"00",X"DC",X"01", + X"DE",X"03",X"53",X"06",X"DD",X"05",X"DF",X"07",X"DF",X"07",X"DF",X"07",X"FD",X"05",X"73",X"06", + X"FE",X"03",X"FC",X"01",X"F8",X"00",X"00",X"00",X"00",X"00",X"82",X"1F",X"00",X"00",X"00",X"00", + X"F8",X"00",X"FC",X"01",X"FE",X"03",X"73",X"06",X"FD",X"05",X"DF",X"07",X"DF",X"07",X"DF",X"07", + X"DD",X"05",X"53",X"06",X"DE",X"03",X"DC",X"01",X"F8",X"00",X"00",X"00",X"00",X"00",X"3A",X"2A", + X"21",X"FE",X"10",X"E2",X"EE",X"1F",X"C3",X"4A",X"07",X"FF",X"85",X"78",X"E9",X"01",X"6C",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw05.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw05.vhd new file mode 100644 index 00000000..02127e5a --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw05.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity mw05 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of mw05 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"40",X"40",X"6D",X"40",X"B0",X"40",X"EB",X"40",X"1C",X"41",X"A4",X"41",X"DF",X"41",X"12",X"42", + X"45",X"42",X"78",X"42",X"21",X"46",X"A4",X"42",X"85",X"43",X"62",X"44",X"CA",X"44",X"F6",X"44", + X"22",X"45",X"A3",X"45",X"E4",X"45",X"2D",X"46",X"34",X"49",X"99",X"49",X"FD",X"49",X"27",X"4B", + X"4F",X"4C",X"49",X"4D",X"41",X"4E",X"69",X"4E",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"D0",X"70",X"DB",X"17",X"02",X"0F",X"20",X"01",X"FE",X"00",X"28",X"CD",X"53",X"40",X"01",X"FD", + X"01",X"30",X"76",X"D0",X"70",X"1B",X"18",X"02",X"0F",X"02",X"01",X"FE",X"00",X"20",X"01",X"FE", + X"01",X"00",X"F8",X"00",X"01",X"FE",X"01",X"18",X"01",X"FF",X"FF",X"20",X"76",X"D0",X"30",X"DB", + X"17",X"02",X"0F",X"20",X"01",X"FE",X"00",X"10",X"CD",X"90",X"40",X"01",X"FE",X"01",X"08",X"01", + X"FE",X"FF",X"08",X"01",X"FD",X"01",X"10",X"AF",X"FE",X"FF",X"06",X"01",X"FE",X"01",X"10",X"76", + X"D0",X"30",X"1B",X"18",X"02",X"0F",X"02",X"01",X"FE",X"01",X"18",X"01",X"FE",X"FF",X"10",X"01", + X"FE",X"00",X"10",X"AF",X"FE",X"FF",X"08",X"01",X"FE",X"FF",X"08",X"01",X"FE",X"01",X"10",X"76", + X"D0",X"A0",X"DB",X"17",X"02",X"0F",X"20",X"01",X"FE",X"00",X"18",X"CD",X"C7",X"40",X"01",X"FD", + X"00",X"08",X"01",X"FD",X"FF",X"18",X"76",X"D0",X"A0",X"1B",X"18",X"02",X"0F",X"02",X"01",X"FE", + X"00",X"18",X"01",X"FE",X"01",X"08",X"01",X"FE",X"FF",X"08",X"01",X"FE",X"00",X"10",X"AF",X"FE", + X"FF",X"08",X"01",X"FE",X"01",X"10",X"01",X"FE",X"FF",X"10",X"76",X"D0",X"D0",X"DB",X"17",X"02", + X"0F",X"20",X"01",X"FE",X"00",X"10",X"CD",X"0E",X"41",X"01",X"FE",X"00",X"10",X"AF",X"FF",X"FF", + X"10",X"01",X"FE",X"FF",X"08",X"01",X"FE",X"01",X"10",X"01",X"FD",X"00",X"18",X"76",X"D0",X"D0", + X"1B",X"18",X"02",X"0F",X"02",X"01",X"FE",X"00",X"20",X"C3",X"5E",X"40",X"D0",X"88",X"5B",X"18", + X"02",X"0F",X"10",X"CD",X"3C",X"41",X"CD",X"51",X"41",X"01",X"FE",X"FF",X"0A",X"AF",X"FE",X"FF", + X"02",X"01",X"FE",X"01",X"0A",X"AF",X"FE",X"01",X"02",X"C3",X"29",X"41",X"D0",X"76",X"5B",X"18", + X"02",X"0F",X"10",X"AF",X"00",X"00",X"12",X"CD",X"66",X"41",X"01",X"FF",X"FF",X"10",X"C3",X"29", + X"41",X"D0",X"9A",X"5B",X"18",X"02",X"0F",X"10",X"AF",X"00",X"00",X"12",X"CD",X"77",X"41",X"01", + X"FF",X"01",X"10",X"C3",X"29",X"41",X"D0",X"5C",X"5B",X"18",X"02",X"0F",X"10",X"AF",X"00",X"00", + X"12",X"CD",X"88",X"41",X"C3",X"4A",X"41",X"D0",X"B4",X"5B",X"18",X"02",X"0F",X"10",X"AF",X"00", + X"00",X"12",X"CD",X"96",X"41",X"C3",X"5F",X"41",X"D0",X"40",X"5B",X"18",X"02",X"0F",X"10",X"AF", + X"00",X"00",X"12",X"C3",X"4A",X"41",X"D0",X"CE",X"5B",X"18",X"02",X"0F",X"10",X"AF",X"00",X"00", + X"12",X"C3",X"5F",X"41",X"D0",X"30",X"5B",X"19",X"01",X"0B",X"50",X"CD",X"B9",X"41",X"01",X"FE", + X"01",X"14",X"01",X"FE",X"FF",X"14",X"C3",X"AE",X"41",X"D0",X"40",X"75",X"19",X"01",X"0B",X"50", + X"AF",X"00",X"00",X"10",X"CD",X"CA",X"41",X"C3",X"AE",X"41",X"D0",X"40",X"68",X"19",X"01",X"0B", + X"50",X"AF",X"00",X"00",X"10",X"01",X"FE",X"00",X"28",X"CD",X"40",X"40",X"C3",X"AE",X"41",X"D0", + X"50",X"82",X"19",X"01",X"0B",X"50",X"CD",X"EC",X"41",X"C3",X"AE",X"41",X"D0",X"60",X"75",X"19", + X"01",X"0B",X"50",X"AF",X"00",X"00",X"18",X"CD",X"FD",X"41",X"C3",X"AE",X"41",X"D0",X"50",X"68", + X"19",X"01",X"0B",X"50",X"AF",X"00",X"00",X"10",X"01",X"FE",X"00",X"28",X"CD",X"6D",X"40",X"C3", + X"AE",X"41",X"D0",X"70",X"5B",X"19",X"01",X"0B",X"50",X"CD",X"1F",X"42",X"C3",X"AE",X"41",X"D0", + X"80",X"68",X"19",X"01",X"0B",X"50",X"AF",X"00",X"00",X"10",X"CD",X"30",X"42",X"C3",X"AE",X"41", + X"D0",X"70",X"75",X"19",X"01",X"0B",X"50",X"AF",X"00",X"00",X"10",X"01",X"FE",X"00",X"28",X"CD", + X"B0",X"40",X"C3",X"AE",X"41",X"D0",X"90",X"82",X"19",X"01",X"0B",X"50",X"CD",X"52",X"42",X"C3", + X"AE",X"41",X"D0",X"A0",X"68",X"19",X"01",X"0B",X"50",X"AF",X"00",X"00",X"10",X"CD",X"63",X"42", + X"C3",X"AE",X"41",X"D0",X"90",X"75",X"19",X"01",X"0B",X"50",X"AF",X"00",X"00",X"10",X"01",X"FE", + X"00",X"20",X"CD",X"EB",X"40",X"C3",X"AE",X"41",X"D0",X"B0",X"5B",X"19",X"01",X"0B",X"50",X"CD", + X"85",X"42",X"C3",X"AE",X"41",X"D0",X"C0",X"5B",X"19",X"01",X"0B",X"50",X"AF",X"00",X"00",X"10", + X"CD",X"96",X"42",X"C3",X"AE",X"41",X"D0",X"B0",X"5B",X"19",X"01",X"0B",X"50",X"AF",X"00",X"00", + X"18",X"C3",X"AE",X"41",X"D0",X"80",X"9B",X"18",X"02",X"0F",X"30",X"CD",X"E9",X"42",X"01",X"FF", + X"FF",X"10",X"01",X"FF",X"01",X"10",X"CD",X"1F",X"43",X"01",X"FF",X"00",X"10",X"CD",X"2B",X"43", + X"01",X"FF",X"00",X"10",X"AF",X"FF",X"FF",X"10",X"01",X"FF",X"FF",X"10",X"CD",X"35",X"43",X"01", + X"FF",X"FF",X"10",X"CD",X"3F",X"43",X"01",X"FF",X"FF",X"10",X"CD",X"49",X"43",X"01",X"FF",X"00", + X"10",X"CD",X"53",X"43",X"01",X"FF",X"00",X"30",X"76",X"D0",X"60",X"9B",X"18",X"02",X"0F",X"30", + X"AF",X"00",X"00",X"60",X"01",X"FF",X"FF",X"10",X"01",X"FF",X"01",X"10",X"CD",X"5D",X"43",X"01", + X"FF",X"00",X"10",X"CD",X"67",X"43",X"01",X"FF",X"00",X"20",X"AF",X"FF",X"01",X"10",X"01",X"FF", + X"01",X"10",X"CD",X"71",X"43",X"01",X"FF",X"00",X"10",X"CD",X"7B",X"43",X"C3",X"E4",X"42",X"A0", + X"80",X"01",X"1C",X"02",X"05",X"66",X"01",X"FD",X"00",X"30",X"76",X"90",X"8A",X"01",X"1C",X"02", + X"05",X"66",X"C3",X"26",X"43",X"60",X"60",X"01",X"1C",X"02",X"05",X"66",X"C3",X"26",X"43",X"50", + X"58",X"01",X"1C",X"02",X"05",X"66",X"C3",X"26",X"43",X"40",X"40",X"01",X"1C",X"02",X"05",X"66", + X"C3",X"26",X"43",X"30",X"4A",X"01",X"1C",X"02",X"05",X"66",X"C3",X"26",X"43",X"A0",X"60",X"01", + X"1C",X"02",X"05",X"66",X"C3",X"26",X"43",X"90",X"6A",X"01",X"1C",X"02",X"05",X"66",X"C3",X"26", + X"43",X"50",X"80",X"01",X"1C",X"02",X"05",X"66",X"C3",X"26",X"43",X"38",X"70",X"01",X"1C",X"02", + X"05",X"66",X"C3",X"26",X"43",X"D0",X"A0",X"9B",X"18",X"02",X"0F",X"30",X"CD",X"C8",X"43",X"01", + X"FF",X"00",X"10",X"CD",X"FE",X"43",X"01",X"FF",X"00",X"10",X"CD",X"08",X"44",X"01",X"FF",X"00", + X"10",X"AF",X"FF",X"00",X"10",X"01",X"FF",X"01",X"10",X"CD",X"12",X"44",X"01",X"FF",X"01",X"10", + X"CD",X"1C",X"44",X"01",X"FF",X"01",X"08",X"AF",X"FF",X"01",X"10",X"01",X"FF",X"01",X"08",X"CD", + X"26",X"44",X"CD",X"30",X"44",X"C3",X"E4",X"42",X"D0",X"C0",X"9B",X"18",X"02",X"0F",X"30",X"AF", + X"00",X"00",X"50",X"01",X"FF",X"00",X"10",X"CD",X"3A",X"44",X"01",X"FF",X"00",X"10",X"CD",X"44", + X"44",X"01",X"FF",X"FF",X"10",X"AF",X"FF",X"00",X"10",X"01",X"FF",X"01",X"10",X"01",X"FF",X"FF", + X"10",X"CD",X"4E",X"44",X"01",X"FF",X"FF",X"10",X"CD",X"58",X"44",X"C3",X"E4",X"42",X"A0",X"A0", + X"01",X"1C",X"02",X"05",X"66",X"C3",X"26",X"43",X"A0",X"AA",X"01",X"1C",X"02",X"05",X"66",X"C3", + X"26",X"43",X"60",X"C0",X"01",X"1C",X"02",X"05",X"66",X"C3",X"26",X"43",X"60",X"CA",X"01",X"1C", + X"02",X"05",X"66",X"C3",X"26",X"43",X"40",X"E0",X"01",X"1C",X"02",X"05",X"66",X"C3",X"26",X"43", + X"40",X"EA",X"01",X"1C",X"02",X"05",X"66",X"C3",X"26",X"43",X"A0",X"C0",X"01",X"1C",X"02",X"05", + X"66",X"C3",X"26",X"43",X"A0",X"CA",X"01",X"1C",X"02",X"05",X"66",X"C3",X"26",X"43",X"50",X"A0", + X"01",X"1C",X"02",X"05",X"66",X"C3",X"26",X"43",X"50",X"AA",X"01",X"1C",X"02",X"05",X"66",X"C3", + X"26",X"43",X"D0",X"40",X"1B",X"18",X"02",X"0F",X"02",X"CD",X"AB",X"44",X"01",X"FE",X"00",X"12", + X"01",X"FE",X"01",X"04",X"EB",X"6A",X"1F",X"02",X"0B",X"10",X"01",X"FE",X"01",X"04",X"01",X"FE", + X"01",X"04",X"EB",X"7E",X"4E",X"02",X"07",X"20",X"01",X"FE",X"01",X"04",X"AF",X"00",X"04",X"01", + X"EB",X"8E",X"4E",X"02",X"07",X"30",X"01",X"FE",X"02",X"03",X"01",X"FE",X"01",X"03",X"01",X"FE", + X"00",X"08",X"01",X"FE",X"FF",X"08",X"01",X"FE",X"FE",X"30",X"76",X"D0",X"44",X"1B",X"18",X"02", + X"0F",X"02",X"AF",X"00",X"00",X"20",X"CD",X"BC",X"44",X"C3",X"6C",X"44",X"D0",X"38",X"1B",X"18", + X"02",X"0F",X"02",X"AF",X"00",X"00",X"20",X"C3",X"6C",X"44",X"D0",X"80",X"1B",X"18",X"02",X"0F", + X"02",X"CD",X"D7",X"44",X"C3",X"6C",X"44",X"D0",X"84",X"1B",X"18",X"02",X"0F",X"02",X"AF",X"00", + X"00",X"20",X"CD",X"E8",X"44",X"C3",X"6C",X"44",X"D0",X"78",X"1B",X"18",X"02",X"0F",X"02",X"AF", + X"00",X"00",X"20",X"C3",X"6C",X"44",X"D0",X"C0",X"1B",X"18",X"02",X"0F",X"02",X"CD",X"03",X"45", + X"C3",X"6C",X"44",X"D0",X"C4",X"1B",X"18",X"02",X"0F",X"02",X"AF",X"00",X"00",X"20",X"CD",X"14", + X"45",X"C3",X"6C",X"44",X"D0",X"B8",X"1B",X"18",X"02",X"0F",X"02",X"AF",X"00",X"00",X"20",X"C3", + X"6C",X"44",X"D0",X"30",X"9E",X"4E",X"02",X"05",X"20",X"CD",X"79",X"45",X"CD",X"87",X"45",X"CD", + X"95",X"45",X"01",X"FF",X"01",X"10",X"EB",X"AA",X"4E",X"02",X"07",X"20",X"01",X"FF",X"01",X"08", + X"EB",X"BA",X"4E",X"02",X"09",X"20",X"01",X"FE",X"01",X"08",X"EB",X"CE",X"4E",X"02",X"0B",X"20", + X"01",X"FE",X"01",X"04",X"EB",X"E6",X"4E",X"02",X"0D",X"20",X"01",X"FE",X"01",X"02",X"EB",X"DB", + X"17",X"02",X"0F",X"20",X"01",X"FE",X"00",X"08",X"AF",X"FE",X"FF",X"08",X"01",X"FD",X"FF",X"08", + X"01",X"FE",X"01",X"10",X"01",X"FD",X"01",X"16",X"76",X"D0",X"50",X"9E",X"4E",X"02",X"05",X"20", + X"01",X"00",X"00",X"08",X"C3",X"32",X"45",X"D0",X"70",X"9E",X"4E",X"02",X"05",X"20",X"01",X"00", + X"00",X"10",X"C3",X"32",X"45",X"D0",X"90",X"9E",X"4E",X"02",X"05",X"20",X"01",X"00",X"00",X"18", + X"C3",X"32",X"45",X"D0",X"30",X"9E",X"4E",X"02",X"05",X"20",X"CD",X"BA",X"45",X"CD",X"C8",X"45", + X"CD",X"D6",X"45",X"AF",X"00",X"00",X"20",X"C3",X"32",X"45",X"D0",X"50",X"9E",X"4E",X"02",X"05", + X"20",X"AF",X"00",X"00",X"28",X"C3",X"32",X"45",X"D0",X"70",X"9E",X"4E",X"02",X"05",X"20",X"AF", + X"00",X"00",X"30",X"C3",X"32",X"45",X"D0",X"90",X"9E",X"4E",X"02",X"05",X"20",X"AF",X"00",X"00", + X"38",X"C3",X"32",X"45",X"C0",X"BD",X"23",X"1B",X"02",X"28",X"40",X"01",X"FF",X"FF",X"41",X"CD", + X"F7",X"45",X"01",X"00",X"00",X"FF",X"76",X"77",X"8C",X"75",X"1B",X"01",X"0B",X"40",X"CD",X"06", + X"46",X"01",X"00",X"00",X"FF",X"76",X"23",X"90",X"82",X"1B",X"0B",X"01",X"40",X"CD",X"15",X"46", + X"01",X"00",X"00",X"FF",X"76",X"23",X"92",X"82",X"1B",X"0B",X"01",X"40",X"01",X"00",X"00",X"FF", + X"76",X"C0",X"F0",X"8F",X"19",X"05",X"28",X"70",X"01",X"FD",X"FD",X"40",X"76",X"80",X"B0",X"82", + X"1F",X"02",X"11",X"38",X"01",X"00",X"00",X"01",X"CD",X"82",X"47",X"CD",X"8E",X"47",X"CD",X"98", + X"47",X"CD",X"A4",X"47",X"CD",X"AE",X"47",X"AF",X"00",X"FE",X"04",X"CD",X"B8",X"47",X"01",X"00", + X"FE",X"04",X"CD",X"C2",X"47",X"01",X"00",X"FE",X"04",X"CD",X"CC",X"47",X"AF",X"00",X"FE",X"04", + X"CD",X"D6",X"47",X"01",X"00",X"FE",X"04",X"CD",X"E0",X"47",X"01",X"00",X"FE",X"04",X"CD",X"EA", + X"47",X"AF",X"00",X"FF",X"08",X"CD",X"F4",X"47",X"01",X"00",X"FE",X"04",X"CD",X"FE",X"47",X"01", + X"00",X"FE",X"04",X"CD",X"08",X"48",X"01",X"00",X"FF",X"08",X"CD",X"12",X"48",X"CD",X"1C",X"48", + X"AF",X"00",X"FE",X"04",X"CD",X"26",X"48",X"01",X"00",X"FE",X"04",X"CD",X"30",X"48",X"01",X"00", + X"FE",X"04",X"CD",X"3A",X"48",X"01",X"00",X"FE",X"04",X"CD",X"44",X"48",X"01",X"00",X"FE",X"04", + X"CD",X"4E",X"48",X"01",X"00",X"FE",X"04",X"CD",X"58",X"48",X"01",X"00",X"FE",X"04",X"CD",X"62", + X"48",X"01",X"00",X"02",X"04",X"CD",X"6C",X"48",X"AF",X"00",X"02",X"04",X"CD",X"76",X"48",X"01", + X"00",X"02",X"04",X"CD",X"80",X"48",X"AF",X"00",X"02",X"04",X"CD",X"30",X"48",X"01",X"00",X"02", + X"04",X"CD",X"8A",X"48",X"01",X"00",X"01",X"08",X"CD",X"94",X"48",X"AF",X"00",X"01",X"08",X"CD", + X"1C",X"48",X"01",X"00",X"02",X"04",X"CD",X"9E",X"48",X"01",X"00",X"02",X"04",X"CD",X"F4",X"47", + X"AF",X"00",X"02",X"04",X"CD",X"A8",X"48",X"01",X"00",X"02",X"04",X"CD",X"B2",X"48",X"01",X"00", + X"02",X"04",X"CD",X"D6",X"47",X"01",X"00",X"02",X"04",X"CD",X"BC",X"48",X"01",X"00",X"02",X"04", + X"CD",X"C6",X"48",X"AF",X"00",X"02",X"04",X"CD",X"D0",X"48",X"01",X"00",X"02",X"04",X"CD",X"8E", + X"47",X"01",X"00",X"02",X"04",X"CD",X"DA",X"48",X"01",X"00",X"02",X"04",X"CD",X"AE",X"47",X"AF", + X"00",X"02",X"04",X"CD",X"E4",X"48",X"01",X"00",X"02",X"04",X"CD",X"EE",X"48",X"01",X"00",X"02", + X"04",X"CD",X"F8",X"48",X"01",X"00",X"01",X"08",X"CD",X"02",X"49",X"01",X"00",X"02",X"08",X"CD", + X"0C",X"49",X"01",X"00",X"FE",X"08",X"CD",X"16",X"49",X"01",X"00",X"FE",X"04",X"CD",X"20",X"49", + X"01",X"00",X"FE",X"04",X"CD",X"2A",X"49",X"AF",X"00",X"FE",X"0C",X"01",X"00",X"FE",X"04",X"C3", + X"34",X"46",X"70",X"AC",X"66",X"1F",X"02",X"01",X"64",X"01",X"FC",X"00",X"18",X"76",X"70",X"B2", + X"66",X"1F",X"02",X"01",X"64",X"C3",X"89",X"47",X"70",X"B6",X"01",X"1C",X"02",X"05",X"66",X"01", + X"FD",X"00",X"20",X"76",X"70",X"BE",X"66",X"1F",X"02",X"01",X"64",X"C3",X"89",X"47",X"70",X"C4", + X"66",X"1F",X"02",X"01",X"64",X"C3",X"89",X"47",X"70",X"AA",X"01",X"1C",X"02",X"05",X"66",X"C3", + X"9F",X"47",X"70",X"A2",X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"9A",X"01",X"1C", + X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"94",X"66",X"1F",X"02",X"01",X"64",X"C3",X"89",X"47", + X"70",X"8A",X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"82",X"01",X"1C",X"02",X"05", + X"66",X"C3",X"9F",X"47",X"70",X"7C",X"66",X"1F",X"02",X"01",X"64",X"C3",X"89",X"47",X"70",X"72"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw06.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw06.vhd new file mode 100644 index 00000000..dc5691b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/roms/mw06.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity mw06 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of mw06 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"6A",X"01",X"1C",X"02",X"05",X"66",X"C3", + X"9F",X"47",X"70",X"60",X"66",X"1F",X"02",X"01",X"64",X"C3",X"89",X"47",X"70",X"6C",X"66",X"1F", + X"02",X"01",X"64",X"C3",X"89",X"47",X"70",X"5A",X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47", + X"70",X"54",X"66",X"1F",X"02",X"01",X"64",X"C3",X"89",X"47",X"70",X"4A",X"01",X"1C",X"02",X"05", + X"66",X"C3",X"9F",X"47",X"70",X"42",X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"3A", + X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"32",X"01",X"1C",X"02",X"05",X"66",X"C3", + X"9F",X"47",X"70",X"2C",X"66",X"1F",X"02",X"01",X"64",X"C3",X"89",X"47",X"70",X"3B",X"01",X"1C", + X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"43",X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47", + X"70",X"4B",X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"5B",X"01",X"1C",X"02",X"05", + X"66",X"C3",X"9F",X"47",X"70",X"63",X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"73", + X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"83",X"01",X"1C",X"02",X"05",X"66",X"C3", + X"9F",X"47",X"70",X"8B",X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"9B",X"01",X"1C", + X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"A3",X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47", + X"70",X"AB",X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"BB",X"01",X"1C",X"02",X"05", + X"66",X"C3",X"9F",X"47",X"70",X"CB",X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"D3", + X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"DB",X"01",X"1C",X"02",X"05",X"66",X"C3", + X"9F",X"47",X"70",X"E3",X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"E8",X"66",X"1F", + X"02",X"01",X"64",X"C3",X"89",X"47",X"70",X"CA",X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47", + X"70",X"C2",X"01",X"1C",X"02",X"05",X"66",X"C3",X"9F",X"47",X"70",X"BA",X"01",X"1C",X"02",X"05", + X"66",X"C3",X"9F",X"47",X"D0",X"60",X"1B",X"18",X"02",X"0F",X"02",X"CD",X"62",X"44",X"01",X"FE", + X"00",X"10",X"AF",X"00",X"04",X"01",X"EB",X"6A",X"1F",X"02",X"0B",X"10",X"01",X"FE",X"01",X"08", + X"AF",X"00",X"04",X"01",X"EB",X"7E",X"4E",X"02",X"07",X"20",X"01",X"FE",X"01",X"04",X"AF",X"00", + X"04",X"01",X"EB",X"8E",X"4E",X"02",X"07",X"30",X"01",X"FE",X"02",X"04",X"01",X"FE",X"01",X"03", + X"CD",X"83",X"49",X"01",X"FE",X"00",X"08",X"01",X"FE",X"FF",X"04",X"CD",X"8F",X"49",X"01",X"FE", + X"FE",X"20",X"76",X"7A",X"78",X"4A",X"1F",X"01",X"05",X"66",X"01",X"FD",X"00",X"20",X"76",X"62", + X"74",X"4A",X"1F",X"01",X"05",X"66",X"C3",X"8A",X"49",X"D0",X"A0",X"1B",X"18",X"02",X"0F",X"02", + X"CD",X"CA",X"44",X"CD",X"F6",X"44",X"01",X"FE",X"00",X"10",X"AF",X"00",X"04",X"01",X"EB",X"6A", + X"1F",X"02",X"0B",X"10",X"01",X"FE",X"01",X"08",X"AF",X"00",X"04",X"01",X"EB",X"7E",X"4E",X"02", + X"07",X"20",X"01",X"FE",X"01",X"04",X"AF",X"00",X"04",X"01",X"EB",X"8E",X"4E",X"02",X"07",X"30", + X"01",X"FE",X"02",X"03",X"CD",X"E9",X"49",X"01",X"FE",X"01",X"04",X"01",X"FE",X"00",X"04",X"CD", + X"F3",X"49",X"01",X"FE",X"00",X"04",X"C3",X"A2",X"44",X"82",X"73",X"4A",X"1F",X"01",X"05",X"66", + X"C3",X"8A",X"49",X"72",X"67",X"4A",X"1F",X"01",X"05",X"66",X"C3",X"8A",X"49",X"D0",X"78",X"DB", + X"18",X"02",X"0F",X"33",X"CD",X"61",X"4A",X"01",X"FF",X"00",X"10",X"CD",X"3F",X"4A",X"01",X"FF", + X"00",X"10",X"01",X"FF",X"01",X"11",X"01",X"FE",X"FF",X"08",X"01",X"FD",X"FF",X"05",X"AF",X"F0", + X"FF",X"02",X"01",X"00",X"00",X"04",X"CD",X"4B",X"4A",X"CD",X"57",X"4A",X"01",X"00",X"00",X"12", + X"CD",X"4B",X"4A",X"CD",X"57",X"4A",X"01",X"FE",X"00",X"10",X"01",X"FD",X"FF",X"10",X"76",X"B8", + X"7F",X"4A",X"1F",X"01",X"05",X"66",X"01",X"FD",X"00",X"40",X"76",X"50",X"7A",X"66",X"1F",X"02", + X"01",X"64",X"01",X"FC",X"00",X"10",X"76",X"50",X"84",X"66",X"1F",X"02",X"01",X"64",X"C3",X"52", + X"4A",X"D0",X"48",X"1B",X"19",X"02",X"0F",X"33",X"AF",X"00",X"00",X"10",X"CD",X"DF",X"4A",X"01", + X"FF",X"00",X"10",X"CD",X"AB",X"4A",X"01",X"FF",X"00",X"11",X"01",X"FE",X"00",X"08",X"01",X"FD", + X"00",X"05",X"AF",X"F0",X"00",X"02",X"01",X"00",X"00",X"06",X"CD",X"B5",X"4A",X"CD",X"C1",X"4A", + X"01",X"00",X"00",X"06",X"CD",X"B5",X"4A",X"CD",X"C1",X"4A",X"01",X"FE",X"00",X"08",X"CD",X"CB", + X"4A",X"CD",X"D5",X"4A",X"01",X"00",X"00",X"10",X"C3",X"9E",X"4A",X"B8",X"4F",X"4A",X"1F",X"01", + X"05",X"66",X"C3",X"46",X"4A",X"60",X"48",X"40",X"1F",X"01",X"03",X"64",X"01",X"FE",X"00",X"30", + X"76",X"60",X"54",X"40",X"1F",X"01",X"03",X"64",X"C3",X"BC",X"4A",X"50",X"48",X"40",X"1F",X"01", + X"03",X"64",X"C3",X"BC",X"4A",X"50",X"54",X"40",X"1F",X"01",X"03",X"64",X"C3",X"BC",X"4A",X"D0", + X"78",X"DB",X"18",X"02",X"0F",X"33",X"AF",X"00",X"00",X"10",X"01",X"FF",X"00",X"11",X"01",X"FE", + X"00",X"08",X"01",X"FD",X"00",X"05",X"AF",X"F0",X"00",X"02",X"01",X"00",X"00",X"10",X"01",X"FE", + X"00",X"09",X"01",X"FD",X"00",X"06",X"CD",X"13",X"4B",X"CD",X"1D",X"4B",X"01",X"00",X"00",X"10", + X"C3",X"06",X"4B",X"40",X"79",X"66",X"1F",X"02",X"01",X"64",X"C3",X"52",X"4A",X"40",X"83",X"66", + X"1F",X"02",X"01",X"64",X"C3",X"52",X"4A",X"D0",X"A8",X"FB",X"18",X"02",X"0F",X"33",X"CD",X"87", + X"4B",X"01",X"FF",X"00",X"18",X"CD",X"69",X"4B",X"01",X"FF",X"00",X"08",X"01",X"FF",X"01",X"11", + X"01",X"FE",X"FF",X"08",X"01",X"FD",X"FF",X"05",X"AF",X"F0",X"FF",X"02",X"01",X"00",X"00",X"02", + X"CD",X"73",X"4B",X"CD",X"7D",X"4B",X"01",X"00",X"00",X"0E",X"CD",X"73",X"4B",X"CD",X"7D",X"4B", + X"01",X"FE",X"00",X"10",X"01",X"FD",X"01",X"10",X"76",X"B0",X"AF",X"4A",X"1F",X"01",X"05",X"66", + X"C3",X"46",X"4A",X"50",X"AA",X"66",X"1F",X"02",X"01",X"64",X"C3",X"52",X"4A",X"50",X"B4",X"66", + X"1F",X"02",X"01",X"64",X"C3",X"52",X"4A",X"D0",X"D8",X"DB",X"18",X"02",X"0F",X"33",X"AF",X"00", + X"00",X"10",X"CD",X"03",X"4C",X"01",X"FF",X"00",X"18",X"CD",X"D1",X"4B",X"01",X"FF",X"00",X"09", + X"01",X"FE",X"00",X"08",X"01",X"FD",X"00",X"05",X"AF",X"F0",X"00",X"02",X"01",X"00",X"00",X"04", + X"CD",X"DB",X"4B",X"CD",X"E5",X"4B",X"01",X"00",X"00",X"08",X"CD",X"DB",X"4B",X"CD",X"E5",X"4B", + X"01",X"FE",X"00",X"08",X"CD",X"EF",X"4B",X"CD",X"F9",X"4B",X"01",X"00",X"00",X"10",X"C3",X"C4", + X"4B",X"B0",X"DF",X"4A",X"1F",X"01",X"05",X"66",X"C3",X"46",X"4A",X"60",X"D8",X"40",X"1F",X"01", + X"03",X"64",X"C3",X"BC",X"4A",X"60",X"E4",X"40",X"1F",X"01",X"03",X"64",X"C3",X"BC",X"4A",X"50", + X"D8",X"40",X"1F",X"01",X"03",X"64",X"C3",X"BC",X"4A",X"50",X"E4",X"40",X"1F",X"01",X"03",X"64", + X"C3",X"BC",X"4A",X"D0",X"A8",X"FB",X"18",X"02",X"0F",X"33",X"AF",X"00",X"00",X"10",X"01",X"FF", + X"00",X"11",X"01",X"FE",X"00",X"08",X"01",X"FD",X"00",X"05",X"AF",X"F0",X"00",X"02",X"01",X"00", + X"00",X"10",X"01",X"FE",X"00",X"09",X"01",X"FD",X"00",X"06",X"01",X"00",X"00",X"04",X"CD",X"3B", + X"4C",X"CD",X"45",X"4C",X"01",X"00",X"00",X"10",X"C3",X"2A",X"4C",X"40",X"A9",X"66",X"1F",X"02", + X"01",X"64",X"C3",X"52",X"4A",X"40",X"B3",X"66",X"1F",X"03",X"01",X"64",X"C3",X"52",X"4A",X"C0", + X"8C",X"C5",X"1B",X"02",X"0E",X"3F",X"00",X"00",X"00",X"CD",X"6C",X"4C",X"CD",X"88",X"4C",X"CD", + X"9A",X"4C",X"CD",X"B0",X"4C",X"01",X"00",X"00",X"20",X"C3",X"56",X"4C",X"AA",X"8A",X"AD",X"1B", + X"01",X"0A",X"08",X"01",X"FE",X"00",X"08",X"01",X"FE",X"00",X"18",X"01",X"FE",X"01",X"10",X"01", + X"FD",X"FE",X"10",X"01",X"FC",X"02",X"10",X"76",X"AA",X"92",X"AD",X"1B",X"01",X"0A",X"08",X"01", + X"FE",X"00",X"08",X"01",X"FE",X"00",X"18",X"C3",X"7B",X"4C",X"B4",X"8A",X"AD",X"1B",X"01",X"0A", + X"08",X"01",X"FE",X"00",X"08",X"01",X"FE",X"FE",X"0C",X"01",X"FE",X"01",X"04",X"C3",X"7B",X"4C", + X"B4",X"92",X"AD",X"1B",X"01",X"0A",X"08",X"01",X"FE",X"00",X"08",X"CD",X"D2",X"4C",X"CD",X"E4", + X"4C",X"CD",X"F6",X"4C",X"CD",X"04",X"4D",X"01",X"FE",X"02",X"14",X"01",X"FE",X"00",X"04",X"C3", + X"7B",X"4C",X"AE",X"8A",X"AD",X"1B",X"01",X"0A",X"08",X"01",X"FE",X"FE",X"11",X"01",X"FE",X"01", + X"0E",X"C3",X"7B",X"4C",X"AE",X"92",X"AD",X"1B",X"01",X"0A",X"08",X"01",X"FE",X"02",X"18",X"01", + X"FE",X"01",X"08",X"C3",X"7B",X"4C",X"B8",X"8A",X"AD",X"1B",X"01",X"0A",X"08",X"01",X"FE",X"FE", + X"24",X"C3",X"7B",X"4C",X"B8",X"92",X"AD",X"1B",X"01",X"0A",X"08",X"01",X"FE",X"02",X"24",X"C3", + X"7B",X"4C",X"3E",X"01",X"F7",X"0A",X"C3",X"E3",X"0F",X"E1",X"C3",X"E3",X"0F",X"76",X"1E",X"4D", + X"00",X"00",X"1E",X"0C",X"3F",X"0C",X"1E",X"00",X"00",X"29",X"4D",X"00",X"00",X"00",X"00",X"F0", + X"00",X"60",X"00",X"F8",X"01",X"7E",X"00",X"FC",X"00",X"3F",X"00",X"FC",X"00",X"7E",X"00",X"F8", + X"01",X"60",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"D0",X"48",X"29",X"4D",X"02",X"0F",X"12", + X"CD",X"9C",X"4D",X"CD",X"D3",X"4D",X"CD",X"0A",X"4E",X"01",X"FE",X"FE",X"10",X"01",X"FE",X"02", + X"10",X"CD",X"76",X"4D",X"CD",X"80",X"4D",X"CD",X"8E",X"4D",X"76",X"01",X"FE",X"FE",X"10",X"01", + X"FE",X"02",X"10",X"C3",X"6B",X"4D",X"90",X"4B",X"1E",X"4D",X"01",X"09",X"22",X"C3",X"6B",X"4D", + X"93",X"48",X"1E",X"4D",X"01",X"09",X"22",X"01",X"FF",X"FE",X"10",X"C3",X"6B",X"4D",X"93",X"4E", + X"1E",X"4D",X"01",X"09",X"22",X"01",X"FF",X"02",X"08",X"C3",X"6B",X"4D",X"D0",X"78",X"29",X"4D", + X"02",X"0F",X"12",X"01",X"FE",X"FE",X"10",X"01",X"FE",X"02",X"10",X"CD",X"B5",X"4D",X"CD",X"BF", + X"4D",X"CD",X"C9",X"4D",X"76",X"90",X"7B",X"1E",X"4D",X"01",X"09",X"22",X"C3",X"6B",X"4D",X"93", + X"78",X"1E",X"4D",X"01",X"09",X"22",X"C3",X"87",X"4D",X"93",X"7E",X"1E",X"4D",X"01",X"09",X"22", + X"C3",X"95",X"4D",X"D0",X"B8",X"29",X"4D",X"02",X"0F",X"12",X"01",X"FE",X"FE",X"10",X"01",X"FE", + X"02",X"10",X"CD",X"EC",X"4D",X"CD",X"F6",X"4D",X"CD",X"00",X"4E",X"76",X"90",X"BB",X"1E",X"4D", + X"01",X"09",X"22",X"C3",X"6B",X"4D",X"93",X"B8",X"1E",X"4D",X"01",X"09",X"22",X"C3",X"87",X"4D", + X"93",X"BE",X"1E",X"4D",X"01",X"09",X"22",X"C3",X"95",X"4D",X"D0",X"E8",X"29",X"4D",X"02",X"0F", + X"12",X"01",X"FE",X"FE",X"10",X"01",X"FF",X"02",X"10",X"CD",X"23",X"4E",X"CD",X"2D",X"4E",X"CD", + X"37",X"4E",X"76",X"90",X"EB",X"1E",X"4D",X"01",X"09",X"22",X"C3",X"6B",X"4D",X"93",X"E8",X"1E", + X"4D",X"01",X"09",X"22",X"C3",X"87",X"4D",X"93",X"EE",X"1E",X"4D",X"01",X"09",X"22",X"C3",X"95", + X"4D",X"D0",X"88",X"DB",X"18",X"02",X"0F",X"33",X"CD",X"49",X"4D",X"AF",X"00",X"00",X"20",X"CD", + X"49",X"4D",X"01",X"00",X"00",X"04",X"AF",X"00",X"04",X"02",X"01",X"00",X"00",X"04",X"AF",X"00", + X"FC",X"02",X"01",X"00",X"00",X"04",X"C3",X"4F",X"4E",X"D0",X"10",X"AD",X"1B",X"01",X"0A",X"08", + X"CD",X"49",X"4D",X"AF",X"00",X"00",X"10",X"CD",X"FD",X"49",X"CD",X"27",X"4B",X"76",X"7E",X"4E", + X"00",X"00",X"E0",X"1F",X"78",X"7C",X"FF",X"7F",X"FC",X"3F",X"F0",X"1F",X"00",X"00",X"8E",X"4E", + X"00",X"00",X"00",X"00",X"C0",X"0F",X"FE",X"7F",X"E0",X"0F",X"00",X"00",X"00",X"00",X"9E",X"4E", + X"00",X"00",X"40",X"00",X"E0",X"00",X"40",X"00",X"00",X"00",X"AA",X"4E",X"00",X"00",X"E0",X"00", + X"F0",X"01",X"B0",X"01",X"F0",X"01",X"E0",X"00",X"00",X"00",X"BA",X"4E",X"00",X"00",X"E0",X"00", + X"50",X"01",X"E8",X"02",X"B8",X"03",X"E8",X"02",X"50",X"01",X"E0",X"00",X"00",X"00",X"CE",X"4E", + X"00",X"00",X"B0",X"01",X"F8",X"03",X"EC",X"06",X"B4",X"05",X"58",X"03",X"B4",X"05",X"EC",X"06", + X"F8",X"03",X"B0",X"01",X"00",X"00",X"E6",X"4E",X"00",X"00",X"B0",X"01",X"F8",X"03",X"5C",X"07", + X"AE",X"0E",X"56",X"0D",X"F8",X"03",X"56",X"0D",X"AE",X"0E",X"5C",X"07",X"F8",X"03",X"B0",X"01", + X"00",X"00",X"C0",X"04",X"00",X"00",X"00",X"10",X"C6",X"00",X"00",X"00",X"6C",X"29",X"10",X"01", + X"00",X"16",X"04",X"06",X"11",X"00",X"6E",X"C9",X"00",X"00",X"00",X"34",X"C2",X"05",X"90",X"00", + X"DF",X"08",X"02",X"00",X"00",X"CC",X"25",X"08",X"02",X"10",X"BA",X"43",X"92",X"80",X"00",X"A1", + X"4C",X"08",X"21",X"02",X"2F",X"2B",X"31",X"04",X"10",X"D0",X"6A",X"04",X"81",X"20",X"0A",X"95", + X"02",X"10",X"02",X"A0",X"A8",X"45",X"01",X"04",X"10",X"51",X"00",X"92",X"00",X"01",X"44",X"06", + X"20",X"01",X"36",X"92",X"44",X"42",X"00",X"C2",X"A0",X"91",X"04",X"00",X"00",X"10",X"03",X"01", + X"02",X"28",X"08",X"0C",X"20",X"00",X"80",X"92",X"02",X"41",X"08",X"04",X"00",X"25",X"90",X"00", + X"50",X"05",X"4A",X"24",X"00",X"00",X"20",X"D4",X"48",X"00",X"8A",X"42",X"80",X"81",X"42",X"02", + X"10",X"00",X"21",X"04",X"40",X"01",X"20",X"02",X"08",X"04",X"48",X"44",X"00",X"00",X"20",X"10", + X"88",X"00",X"00",X"00",X"04",X"10",X"10",X"01",X"10",X"01",X"21",X"00",X"20",X"28",X"08",X"00", + X"40",X"44",X"80",X"00",X"04",X"02",X"00",X"00",X"14",X"00",X"04",X"00",X"20",X"20",X"01",X"09", + X"00",X"00",X"02",X"02",X"00",X"08",X"00",X"01",X"20",X"00",X"00",X"40",X"80",X"00",X"00",X"20", + X"00",X"10",X"80",X"00",X"40",X"00",X"20",X"00",X"00",X"80",X"FF",X"FF",X"07",X"07",X"07",X"07", + X"07",X"07",X"07",X"07",X"07",X"02",X"03",X"04",X"05",X"06",X"12",X"2D",X"0A",X"00",X"0E",X"17", + X"0E",X"1B",X"10",X"22",X"2E",X"18",X"1E",X"1D",X"00",X"3E",X"09",X"CD",X"05",X"0A",X"E1",X"D1", + X"C3",X"12",X"4D",X"3E",X"E1",X"C3",X"EB",X"4F",X"F7",X"0A",X"F7",X"0C",X"AF",X"E7",X"0B",X"C9"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/spram.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/sprom.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/sprom.vhd new file mode 100644 index 00000000..a81ac959 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Ozma Wars_MiST/rtl/sprom.vhd @@ -0,0 +1,82 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_aclr_a : STRING; + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/README.txt b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/README.txt new file mode 100644 index 00000000..6c0eccf4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/README.txt @@ -0,0 +1,26 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Shuffleboard port to MiST by Gehstock +-- 05 June 2019 +-- +--------------------------------------------------------------------------------- +-- +-- Midway 8080 Hardware +-- Audio based on work by Paul Walsh. +-- Audio and scan converter by MikeJ. +--------------------------------------------------------------------------------- +-- +-- +-- Keyboard inputs : +-- +-- F1 : Start +-- SPACE : Fire +-- RIGHT/LEFT : Movement +-- +-- Joystick support. +-- +-- +--------------------------------------------------------------------------------- +ToDo: Color Prom + Controls + DIP + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/Shuffleboard.qpf b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/Shuffleboard.qpf new file mode 100644 index 00000000..d253de0b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/Shuffleboard.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2013 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.0 Build 162 10/23/2013 SJ Web Edition +# Date created = 21:27:39 November 20, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "21:27:39 November 20, 2017" + +# Revisions + +PROJECT_REVISION = "Shuffleboard" diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/Shuffleboard.qsf b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/Shuffleboard.qsf new file mode 100644 index 00000000..03efe657 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/Shuffleboard.qsf @@ -0,0 +1,173 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 13:57:20 June 05, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# LunarRescue_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Shuffleboard_mist.sv +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Shuffleboard_memory.sv +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_global_assignment -name VHDL_FILE rtl/sprom.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_video.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name QIP_FILE ../../../../common/mist/mist.qip + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Shuffleboard_mist +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== + set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# ------------------------------ +# start ENTITY(LunarRescue_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top + set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top + set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(LunarRescue_mist) +# ---------------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/Shuffleboard.sdc b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/Shuffleboard.sdc new file mode 100644 index 00000000..f91c127c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/Shuffleboard.sdc @@ -0,0 +1,126 @@ +## Generated SDC file "vectrex_MiST.out.sdc" + +## Copyright (C) 1991-2013 Altera Corporation +## Your use of Altera Corporation's design tools, logic functions +## and other software and tools, and its AMPP partner logic +## functions, and any output files from any of the foregoing +## (including device programming or simulation files), and any +## associated documentation or information are expressly subject +## to the terms and conditions of the Altera Program License +## Subscription Agreement, Altera MegaCore Function License +## Agreement, or other applicable license agreement, including, +## without limitation, that your use is for the sole purpose of +## programming logic devices manufactured by Altera and sold by +## Altera or its authorized distributors. Please refer to the +## applicable agreement for further details. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition" + +## DATE "Sun Jun 24 12:53:00 2018" + +## +## DEVICE "EP3C25E144C8" +## + +# Clock constraints + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty + +# tsu/th constraints + +# tco constraints + +# tpd constraints + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + + + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] + +#************************************************************** +# Create Generated Clock +#************************************************************** + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + +#************************************************************** +# Set Input Delay +#************************************************************** + +set_input_delay -add_delay -clock_fall -clock [get_clocks {CLOCK_27}] 1.000 [get_ports {CLOCK_27}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {CONF_DATA0}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DI}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SCK}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}] + +#************************************************************** +# Set Output Delay +#************************************************************** + +set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_L}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_R}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {LED}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {VGA_*}] + +#************************************************************** +# Set Clock Groups +#************************************************************** + +set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}] + +#************************************************************** +# Set False Path +#************************************************************** + + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + +set_multicycle_path -to {VGA_*[*]} -setup 2 +set_multicycle_path -to {VGA_*[*]} -hold 1 + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/Snapshot/Shuffleboard.rbf b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/Snapshot/Shuffleboard.rbf new file mode 100644 index 0000000000000000000000000000000000000000..4b320709609677405d899cb7c5e54e8c78d73e09 GIT binary patch literal 246209 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 +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac dac ( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +wire m_up = ~status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_up | joystick_0[3] | joystick_1[3]; +wire m_down = ~status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_down | joystick_0[2] | joystick_1[2]; +wire m_left = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_left | joystick_0[1] | joystick_1[1]; +wire m_right = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_right | joystick_0[0] | joystick_1[0]; +wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; +wire m_bomb = btn_fire2 | joystick_0[5] | joystick_1[5]; +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_left = 0; +reg btn_right = 0; +reg btn_down = 0; +reg btn_up = 0; +reg btn_fire1 = 0; +reg btn_fire2 = 0; +reg btn_fire3 = 0; +reg btn_coin = 0; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h75: btn_up <= key_pressed; // up + 'h72: btn_down <= key_pressed; // down + 'h6B: btn_left <= key_pressed; // left + 'h74: btn_right <= key_pressed; // right + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h14: btn_fire3 <= key_pressed; // ctrl + 'h11: btn_fire2 <= key_pressed; // alt + 'h29: btn_fire1 <= key_pressed; // Space + endcase + end +end + +endmodule diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T8080se.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T8080se.vhd new file mode 100644 index 00000000..65b92d54 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T8080se.vhd @@ -0,0 +1,194 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80_ALU.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80_ALU.vhd new file mode 100644 index 00000000..e09def1e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80_ALU.vhd @@ -0,0 +1,361 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80_MCode.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80_Pack.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80_Reg.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/T80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/dac.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- Refer to Xilinx Application Note XAPP154. +-- +-- This DAC requires an external RC low-pass filter: +-- +-- dac_o 0---XXXXX---+---0 analog audio +-- 3k3 | +-- === 4n7 +-- | +-- GND +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/invaders.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/invaders.vhd new file mode 100644 index 00000000..f089f1f2 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/invaders.vhd @@ -0,0 +1,243 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaderst is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire : in std_logic; + MoveLeft : in std_logic; + MoveRight : in std_logic; + DIP : in std_logic_vector(8 downto 1); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0); + SoundCtrl5 : out std_logic_vector(5 downto 0); + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic + ); +end invaderst; + +architecture rtl of invaderst is + + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(6 downto 2); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; +begin + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; + + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; + if WD_Cnt = 255 then + Rst_n_s_i <= '0'; + end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then + WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then + if Sounds(0) = '1' and Old_S0 = '0' then + WD_Cnt <= WD_Cnt + 1; + end if; + if PortWr(6) = '1' then + WD_Cnt <= (others => '0'); + end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: entity work.mw8080 + port map( + Rst_n => Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + Video => Video, + HSync => HSync, + VSync => VSync); + + with AD_i(9 downto 8) select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + S when others; + + GDB0(0) <= DIP(8); -- Unused ? + GDB0(1) <= DIP(7); + GDB0(2) <= DIP(6); -- Unused ? + GDB0(3) <= '1'; -- Unused ? + GDB0(4) <= not Fire; + GDB0(5) <= not MoveLeft; + GDB0(6) <= not MoveRight; + GDB0(7) <= DIP(5); -- Unused ? + + GDB1(0) <= not Coin;-- Active High ! + GDB1(1) <= not Sel2Player; + GDB1(2) <= not Sel1Player; + GDB1(3) <= '1';-- Unused ? + GDB1(4) <= not Fire; + GDB1(5) <= not MoveLeft; + GDB1(6) <= not MoveRight; + GDB1(7) <= '1';-- Unused ? + + GDB2(0) <= DIP(4); -- LSB Lives 3-6 + GDB2(1) <= DIP(3); -- MSB Lives 3-6 + GDB2(2) <= '0';-- Tilt ? + GDB2(3) <= '0';--DIP(2); -- Bonus life at 1000 or 1500 + GDB2(4) <= not Fire; + GDB2(5) <= not MoveLeft; + GDB2(6) <= not MoveRight; + GDB2(7) <= '1';--DIP(1); -- Coin info + + PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; + PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; + PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; + PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; + PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + OldSample := '0'; + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0); + end if; + if PortWr(4) = '1' and OldSample = '0' then + D5(15 downto 8) <= DB; + D5(7 downto 0) <= D5(15 downto 8); + end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0); + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/invaders_audio.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/mw8080.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/mw8080.vhd new file mode 100644 index 00000000..1d9ad578 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/mw8080.vhd @@ -0,0 +1,335 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n, Rd_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/pll.qip b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/pll.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/pll.vhd new file mode 100644 index 00000000..d65b9f9b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/pll.vhd @@ -0,0 +1,350 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire4_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire4_bv(0 DOWNTO 0) <= "0"; + sub_wire4 <= To_stdlogicvector(sub_wire4_bv); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + sub_wire2 <= inclk0; + sub_wire3 <= sub_wire4(0 DOWNTO 0) & sub_wire2; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_UNUSED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire3, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.e.bin b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.e.bin new file mode 100644 index 0000000000000000000000000000000000000000..f94474737f88a568a5f18f479af7e2ae5a816d00 GIT binary patch literal 2048 zcmZ8heQX=$8GoHS+qILrw)1r#KKt&yLaPMh^psq>TXIAdYoY;7VH1@$m6pE{60}vj zDosCbhHaF87@amWs6-hOkV>5t_@i>#N~OI++0OK(m7{scK#PdnP%KrcMLO`jGtX;B zfF@bz_xZig^Lu{JbI)^grMtbeS{xf0JX%X}S_a!G&Irjj|DlEC1-~%>u+C`%*w&ly z|C+EO%Laq74`U>2EH*>rlvumP<=^4V4iXm42z{&ra79ijOL^eHi(t19FWOlg3%4|5Wo)t zJcI*R0W-(6AXYX+$r(Yp%a_3n;RTja&9PpReB* z^tZ?>!gOY25*%L^oTCDHTbTC3)#kx@SxBxwGSBXsE{4IOY6%CZ_wnQN>!(yz-=nJg zV(o~BInmLf;+k>yU@R&J{8n7;?DX633YHjGaY808@)>bi>5*U1;+A5?bRE%~!AB6XLK;7>` z^dI&XX2kVY&OMsTUl6^>r>X&HePbd?c2w5+p67~l43VVc*9 z4MshbUlLecTbr7*Hzdq3^`RTw8q73yLJ44o zjhS!rg4M@qgeij)gn<_n--l#pGxY()rOXIc?P1AmXkA$Ap^>Bigzp9@4m7M-7Y2bZ zCSpCMX;uN@5GV(FcP6=y-yDRJKqJN%mj#72KZTbkWDXJg6Of|aw;i-on4syeKs3NOT) z{yK87)H?ZoNcu^_=)&WWbI#r>ne4gzgft1#okC*Tg~f7zR2-!8_7}>MCzbvV+)wN% za@9T3Y-)0T%LRbVSN?RNRF(qa!`_aG zff%nBFiO9L8h@oBVfwOfvrd5)X~nu}Q$Lepy;#V`1ISsD0>1z6-=h);zRkMI$GY!E z!~CU=V2nefb};FV)e)Mg%Sf&-HxAXmYGmPjq~3v&^-GNt^(gur@O|}n8-J@`YyNMq zZ$ziThsGhm2f$}{eE@B)?`}-gccbm#w-N3rz7gz=^)Wch@P7jCPd7fy@8oBlZr;n5 zUQhNd`AJ2`OMc~sUr&Se;3MSMNtgV$gWT=tyUu_)mNC9yybtVKN#jcfD!rPFY$7jV z*g?F=7)#8}EP&UOk)H$Dw@4$7Bq82Ju|v8H&C)R=#Hj&a80^~)k;5nSSple J{cs^5e+LcS_#FTM literal 0 HcmV?d00001 diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.e.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.e.hex new file mode 100644 index 00000000..bf312566 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.e.hex @@ -0,0 +1,129 @@ +:10000000B8DAF617AF3212223A2F223DFA1F183211 +:100010002F22C21F183A0920E6C7320920D3053A19 +:1000200030223DFA3618323022C236183A0920E61C +:10003000FD320920D3052120203A03222201222269 +:1000400000203204223E09CD9E1BFAE918CAA618E8 +:100050003E0CCD0A1B3E0ECD0A1B3E0FCD9E1BF55E +:100060003621CDCC002A0122463E05CDA8007E23B4 +:10007000B7FA8D18C280182B360423237EC3981834 +:1000800080BEC298183EFC2B7780C398182380BE90 +:10009000D29818237E2336C12A0122773E0FCDA89D +:1000A000003604C3DF182346234E2A01222323B837 +:1000B000C2BA1823237EB9CAE9183A3622B8DACC74 +:1000C000183A3122B7C2CC183C32312278FE60D2C5 +:1000D000D7183E043225223E0FCD9E1BF53605CDA6 +:1000E000CC003E0FCD9E1BF1773E10CD9E1B3A04F7 +:1000F000223DC23C183A1D22B7CA1A1521402235AA +:10010000C21A153A0322FE06CA1A15C380113A1DF7 +:10011000223DC3831E321722321522CD5D1C3213BD +:10012000223A17224F3A342281F22D19AF3234226B +:100130002180200620CD521A3A15224F3A352281CD +:10014000F24419AF32352206CFCD521A3E40320763 +:1001500022212710CDAB1A21F619E53E40320922A3 +:10016000D304AF321222322D222120203E0622005B +:10017000203204223E05CD2002B7CA84193A092252 +:10018000B7C28E193E0FCD20023621CDCC003E10D5 +:10019000CD20023A04223DC26E19D3043A1222FE47 +:1001A00004DA9A193A07223DFAD619320722C2B761 +:1001B00019CD1F1AC3D6192180202200207EB7CA6C +:1001C000D619CDCC003E02CD2002343E0FCD200208 +:1001D000360523C3BA193A09223DF25D193A1D22A8 +:1001E000B7C26C053A3D22B7FAF5193A0822B73A78 +:1001F0001322CAF210C921D53611F90BCD5A0321A9 +:10020000071AE5AFC35D19CD9407CD9407CD9407C8 +:100210003A0022323F22C32C05213410CDAB1A21E3 +:10022000F53B3A3522CD2E1A2115263A34224F3A83 +:100230001822B9D2391A320822790E00FE0AFA477A +:100240001A0CD60AC33C1ACD75041140FF1979C3A4 +:10025000750479B7F26D1AFEF7F4A51A36A4CD9598 +:100260001A792F3C4FFE0AFA8F1AC37C1ACDA51AB1 +:1002700079FE0AF27C1ACDA51AC38F1A1E247BC6FA +:10028000045F79D60A4FFE0AF27E1A73CD951A7969 +:100290008787C624772323366E232370110B00191A +:1002A000360423360078D60847C975111020060594 +:1002B0007E1223131305C2B01A7E1B1223221C20A8 +:1002C000CDC900013A1220211620863212202323A4 +:1002D0003A1420863214202335C2C01AD3042A1CB3 +:1002E000207EFEFFC2AB1AC9EBCDA8004E21000054 +:1002F0000DFAF81A19C3F01A0E047CB7F2001B3776 +:100300001F677D1F6F0DC2FA1AC9F5CD9E1B4E23C4 +:1003100046F1D60BCD9E1B7E8177237E8877C9F56B +:100320002A0522CDA8005E2356F1FE07C2321B2308 +:100330003600F5CD9E1B935F237E9A57F1FE07C2D0 +:10034000451B2336002100000DFA501B19C3481B22 +:100350003A2D22B7F07C2F677D2F6F23C9320B22F5 +:100360002A01222200200600CDA8005E23567AB77B +:10037000FA781B05792F4F03EB093A3122B7FA8738 +:100380001BCA871B090909EB722B730E02EBCDFA0E +:100390001AEB3A0B22C607CD2002732372C92A0139 +:1003A00022856FD2A71B247EB7C97CB7CABB1BFEB0 +:1003B000FFC07DFEF0D82600C3BF1B7DFE10D02EEF +:1003C000003A04223C320422C9213C2235F0360492 +:1003D0003A0A22EE01320A222A01227E113410FE4C +:1003E00000CAE71B113A102180202200201A77232F +:1003F00023131A772323131A773E0BCDA800360454 +:10040000CDCC002120203A03223DCA321C322D22BD +:100410002200203E05CDA8007EB7C2271C3E0ACD93 +:10042000A8003621CDCC003E10CD20023A2D22C3AB +:10043000091C2A01223A0322C602FE07F2561C3288 +:100440002D223E20CDA800220020CDCC003A2D2226 +:100450002A0020C3381C2A0122220020C921202082 +:100460003A0022B7CA4C1D3EFF3214223216223AFD +:1004700003223DC822012232042206FF7E111422EB +:10048000FE00CA881C1116223E04CDA11BFE3FDAD5 +:10049000A71CFE9AD2A71C2B2B7EFE0BDAA71C1AD8 +:1004A000BEDAA61C7E12043E05CD9E1B703E10CD0A +:1004B0009E1B3A04223DC2741C1114220E003A16EF +:1004C00022471AB8CAD21CDAD31C13130E0447C32E +:1004D000D31C04132120203A03223D32042222019E +:1004E000223E05CD9E1BFA221D2A012223237EB81F +:1004F000D21B1D3242222A01227EB9C2221D3A425B +:100500002221B510BED20D1D2323C3041D231A863C +:10051000123E05CD9E1B3600C3221D3E05CD9E1BFF +:1005200036013E10CD9E1B3A04223DC2DB1C3A141C +:1005300022473A1622B8C2461D3E04B9CA481D4F8A +:10054000111622C3D21C79C93A1322C93A03223D9B +:10055000C822012232042223237EFE72D2E51DFE30 +:100560001DDAAC1D23235E57D618F26E1DAF1F4F48 +:10057000C642BBD2E51D3E9591BBDAE51D060A7A5F +:10058000FE57D2CE1D7BFE6FD2901DFE69D2E51DB7 +:1005900006087AFE51D2E51DFE3AD2CE1DFE34D2B7 +:1005A000E51DFE1DDAE51D0607C3CE1DFE0EDAE5CC +:1005B0001DFE17D2E51D23237EFE42DAE51DFE97C0 +:1005C000D2E51D060A2A01227EEE04C3D21D2A01AD +:1005D000227E111522FE00CADD1D1117221A80127B +:1005E0000600C3E71D06013E05CD9E1B703E10CDE3 +:1005F0009E1B3A04223DC2511D3A1322EE04C9212A +:10060000D83601DFFF3E543600233600093DC207CD +:100610001EC940FC000048FC200020FCF0FF78FCD4 +:10062000EAFF80FC20007BFC0C001EFCC0FF90FC5D +:100630001000E0FCF0FF70FCB0FFA0FCD0FF70FCED +:10064000B0FF50FC2800A8FC200040FC000000FC8B +:10065000B0FF30FC100060FC300038FC60FF48FC4C +:10066000600050FCD0FF28FC000030FC100028FC8B +:10067000600028FC400030FC200028FC90FF48FC73 +:10068000A8FFCBCA5D19AFC31519FE80DA9D1E2ADB +:10069000E705CDEB3622E70521DF05362D2AE705F4 +:1006A000444DCD5B1EC9CDFB0CCDF60C2ADE0344B8 +:1006B0004DCD402F3AE203FEC4C2E91E3AE803FEE4 +:1006C00000CACF1E0E31CD8D2221000022E3033A55 +:1006D000E703E680FE00CADE1E0E4ACD8D222AE325 +:1006E00003444DCD7B1ECDFB0C3E0011E303CD2119 +:1006F00037B5C2011FCDA72DF6014FCDBA2DC316B8 +:100700001FCDD62D3E00CD0037B5CA161FCDA72D63 +:10071000E6FE4FCDBA2D2AE303E5CD992DE5CDD6E2 +:100720002DEBC1CDE52FCDD62DEB21E503CD2F3718 +:10073000D2381F0E4BCD8D22C9CDF60C2ADE0322F6 +:10074000DC03CD0F11C9CDFB0CCDF60C3E0011DC46 +:1007500003CD2137B5C2611F2AE30322DC03C38224 +:100760001F3E0011E303CD2137B5CA821F2AE303E0 +:1007700023E52AE30323444DCD4B30E67F5FC1CD13 +:1007800053302AE503EB2ADE031922DE03CD400DA8 +:10079000C9CD2B2022E905CD2B2022E3033E00CD3D +:1007A0000037B5C2AB1F0E4DCD8D22CDF60C3E00ED +:1007B00011E905CD2137B5D6019FF53E0011E303C0 +:1007C000CD2137B5D6019FC148B1EB11DE032BF522 +:1007D000CD16379FC148B11FD2E71F21000022DC90 +:1007E0000322DE03C3272001E30311DE03CD143708 +:1007F00023EB2B732372EB11E905CD2437D20620AE +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.f.bin b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.f.bin new file mode 100644 index 0000000000000000000000000000000000000000..ba6856a466aa5b2a587fe6f8b0a555be4f43842a GIT binary patch literal 2048 zcmYjSZ)_7~7{BYT?R9Iq-k-LVve~{jV6>Cs$%hHZ0^pbn~-19u| z^XK>c-nVR5xcvi9y{ng`nKwL}H_>&)_73K#M;6B!hFvB;g0;?{`-Wk|{JAjJ`jeL~ zK==5iFttqGefYfx#zv>7r}@I(JqO0dM)?gx5Dtv-s|yfzAK*JTP+<@K?T5g3u7+aI zUWWB}`Ib;?m}&C)dB3j-LAgLU-tj>1Q!LAR@Nn@h%C^pZYN=&Q>o##;q_l=z?rCjm z;TWbZb!F52ImR%<^W4e_M}ctBz7V!|`^xHiqIMHCM$|m9!ZGOFaRW7)5B%4ptb7nB^^?u+L*rF4TUIE;SA(gc0r zl|i_FZg_=5v!OwaBYDFkAhPaLn+Rc&_9aFS+ewes1k2L`lv&l-*)3KQ>T(;^|hq_ zhUr5ge&Imwt;1q384(OdDA^On_(7WW{!^gUoVYE)~VH+Cg4_IZ!RDIShsN<)*hj6g7XcVsv?R zRqZ9_FS5>JJi6DON%*+sMMd%&r?6Qh^PDCUhg+FQ0)j)Mj8P$D_ zuQW@PoyriDqnR;f+_|&pk#cuzQA%;7+xk;BgOYQ3E-2+LLk9%Sv!a`AGCQnHX1C%U z#9NS>Ml$;|2ys!{Ku~iTP}nDe(7R*T!d( z%eN6pSPY^=49c=4;cO6jkOUgcIo(O@PZM+(QmV~F?IGzjRblG_Yx!gs!iu#dnLkNt zfS_dRY+p^V(~4xsK591+;O>>88ZX2)=Vnj zUQTGM!8zyr(iuvHjl`@ADdz9hSwG7Sl7Q3Sr331aPz1u2}qLkWPAL6|Fwq-S|E8^4J7BiFlC9^8PV2)+AGOPbuF>3M4(+u z6P8t;ASuR9bJAeeKxAn)0<}3Cak(?B42@T6&qlIa4`+uZ+Gwd#8;N8Khq8lUz^(CX zoG}wAxodSzb=SVY<|l6EjnRl3uG`0Da*WqF9zndDslIRt^-ZIx$y=>>uC)##$&SQL zD)=D)7M|dI&(Oi`rM*N^`oSW&D$3-sg4#uDKSr}X1>n(4N={&IA*Lupsdwqk zw{!fRLG^x8`v(q#Al41)bIA2+I846k^kD;FxGzD%q)I~MQLT$$55T@JQ6)i=4wLvq z#p;gLevP5`7jCnlN^joS6q}g$rh`OyC0w$vFURhZa3q`#5qwl}-dhM|vb8@3GK^=p zN;D2lfey45_m2XjeYJ?|=16g?eKY}kwQ+)B2C(l^)BCOo3S8@GK18$W{INzp-H#-+ nf+KDPRr7fY56*5LkQyIE?}2VkMKwP-@>>K)d?jfu;12y4;f8h{ literal 0 HcmV?d00001 diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.f.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.f.hex new file mode 100644 index 00000000..4fcca38e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.f.hex @@ -0,0 +1,129 @@ +:10000000012C101E9B02FF2C40222A008602443F36 +:100010002A0086021C5C24008B0214127A00000164 +:10002000181245000001FF08B6BF00011008B61005 +:10003000000110FF50CCC00000014CCC10000001AA +:10004000FF808080808080808008667473728282E6 +:1000500082084766657473737208375666657474F0 +:1000600073082747566665647408283747566665DF +:100070006508283747465666650828273747566576 +:100080006600010205080B0E0F10000306070807A3 +:100090000603000001040910192431405101010137 +:1000A0000202020204194B235A286932780B4B0FC3 +:1000B0005A1269157829011A020F030B0400001D5A +:1000C00021E03F2D3600C2C310D304257CFE23C29D +:1000D000C310C9CDC010CD6406AF323422323522F0 +:1000E000321722323D22CD191AAF3241223E04325C +:1000F000132247782120200E08FE00C200110EBAFC +:100100003E03320422703A0022B7F211113A132250 +:1001100077160023722336E8237223713E0423727C +:100120003DC21E112336011E061936042378EE0443 +:1001300047FE003EB2CA3A113E4E814F3A1322B8F2 +:10014000C2051179C60E4F3A04223DC20211212088 +:10015000203E06320322220020CDCC003E10CD20CE +:10016000023A03223DC253113203223A3D22FE01DC +:10017000C280112F323D2221D53611C70BCD5A0333 +:100180003A0022B7C2CD113A0322FE02F2CD114746 +:100190003A4122B0CACD11324122218020220020D2 +:1001A000361423233612232336B03E0ACD200236DE +:1001B0001223367A3E05328F20CDCC003E18328095 +:1001C00020AF3284203E45328B20CDCC003A032232 +:1001D000472120203C320322FE07CA0E19FE02C22C +:1001E000E21105FAEE113E10CDA800C3E211220083 +:1001F000202201223E0FCDA8003605AF3239222A37 +:100200000020232336F72323366F3A1D22B7C22A54 +:10021000123A21223DC230132A00207EFE00C23055 +:100220001311410C21F934CD5A033EFF3231222102 +:1002300000001138003A1D22B7C26012111C003AAA +:100240003422473A352290FE08F2601278B7C25F36 +:10025000123A1722FE02F25F12114E1EC37E1219CD +:10026000014A1E3A0022B7C26D1201121E3A242220 +:10027000C604BBFA7712AF322422856F09EBAF3286 +:1002800036223E04CD2002366F3A1D22B7CA9F1295 +:100290003A0720B7C22C053E32324022C3E1143E59 +:1002A000013204223E05CD9E1B06041A7723130556 +:1002B000C2AB12AF321222D3043A1222FE04DAB7D2 +:1002C000123E08CD9E1B562B5E3E04CD9E1B462B38 +:1002D0004EEB09EB7323723E06CD9E1B462B4E2A36 +:1002E0000122235E2356EB09EB722B73237AFEF770 +:1002F000DA021336F7CD121321042235CAF014C3E3 +:100300000C13FED8D20C1336D8CD1213CDCC00C3AB +:10031000B3123E05CD9E1B7E2F5F237E2F57237E7B +:100320002F4F237E2F471303702B712B722B73C912 +:100330003A3722323622AF323122CD5D1C2A0020DC +:100340002201223A3922B7CABE13F33A0820F60135 +:10035000320820D306FBCDCC00CDFF1D21D83311B0 +:10036000EA0BCD5A0321D936111D0CCD5A033E0597 +:10037000320422D601C28713F33A0820E6FE32087F +:1003800020D306FBCDFF1D1120003E5A217B2C36C9 +:1003900000193DC28F13321222D3043A1222FE04F6 +:1003A000C2991321A60FCDAB1AAF321222D3043A51 +:1003B0001222FE04C2AD133A04223DC2701311DAB8 +:1003C0000C2A01227EFE00CACD1311B30C21D936AE +:1003D000CD5A032A01222200202A2822CDAA1BAFAF +:1003E000321222320422320A22323C222A2A22CD1E +:1003F000AA1B3A0422D601CA0614D3043A1222B721 +:10040000CAFA13C3D913320922CDCC00AF3212225B +:10041000CDC91BD3043A1222FE02DA13143A092280 +:10042000B7CA44143C320922FE06CA99142A26226D +:100430003A2B22BCFA4414C299143A2A22BDFA4437 +:1004400014C299142A0020234E2346EB2A2A222282 +:100450002622CDAA1B097CEBFE60DA6214FEF7DAD5 +:1004600064143EF677FED8D275143A0922B7C275E5 +:10047000143C3209222B7323234E2346EB2A2822D5 +:10048000CDAA1B09EB723E43BADA8D14773E95BEB6 +:10049000D29414772B73C309143A0A22B7C4D81B19 +:1004A0003A27222100FEBCFAB2143E01323922C39F +:1004B000FF112100F9BCF2BC142226222120203A8F +:1004C00003223DCADE143204223E05CDA8003600C8 +:1004D0003E0ACDA8003600233A0422C3C2141126D6 +:1004E000223E05CD200206041A77132305C2E81424 +:1004F0003E09CD9E1B36003E023225223E06CD200F +:10050000022F3C070707E638473A0920B032092096 +:10051000D3053E02322F22C328153A2E22473A2510 +:1005200022A8322E22CAE0153E02322E222120209D +:10053000AF3208223A03222201223204223E09CDA0 +:100540009E1BCA4E15FAC615320822C3C6153E05B3 +:10055000CD9E1B5F23567AB7F261152F577B2F5F15 +:1005600013234E234678B7F270152F47792F4F0388 +:100570003E05F57AE604C29E1578E604C29E15EBA8 +:1005800029EB606909444DF13DC272153E09CD9ECB +:100590001B3506042B360005C29415C3C615F12180 +:1005A00041107807070782CDA8007EF50F0F0F0FC7 +:1005B000E60F4F3E05CD5D1BF1E60F4F3E07CD5DCB +:1005C0001B3E013208223E10CD9E1B3A04223DC242 +:1005D00037153A0822B7C2E015CDFF1DC38011249C +:1005E0003A2522D3043207222120203A0322220175 +:1005F000223204223E09CD9E1BC26E163E0CCD0A4D +:100600001BFE0CD216163E07CD9E1B4F2346110033 +:10061000FF3E54C333163E0ECD0A1BFE99DA261652 +:10062000010001C32E16FE40D26E160100FF11001C +:10063000FF3E7CF53E033230223A0920F602D30514 +:100640003209203E0CCD9E1B732372237123702A26 +:1006500001224678D1D604CA5C16C60C8211090064 +:100660001936012B702B772BC610772B36003E10D6 +:10067000CD9E1B3A04223DC2EE152120203A0322D2 +:100680003204222201223DCAEF173209223E09CD4F +:100690009E1BE2E3172A0122320822AF320A223ED1 +:1006A00010CDA8002205223A0822473E09CDA11B01 +:1006B000E2D617A0C2D6172A052223234623234EAB +:1006C0002A012223237E9047322C22F2D7162F3C78 +:1006D000473E01320A2278FE09D2D617232356213B +:1006E0009310CDA8005E7A914F322D22F2FB162F87 +:1006F0003C4F3A0A22EE01320A2279FE09D2D6177D +:10070000219310CDA8007E83FE41D2D6173E07CD9F +:100710001F1B221022EB220E22483A2C22322D22BD +:100720003E05CD1F1BEB220C222A1022197CB7CAD2 +:100730003517F2E3173A092067F601D3053E403D2D +:10074000C23F177CD3052A0C2211811078CDE81AFC +:1007500022102278118A102A0E22CDE81AEB3E05CB +:10076000320B223A0A22B7CA71177B2F5F7A2F57B2 +:10077000132A102219221022EB2A05223A0B2222D8 +:100780000020CDA8007E83775F237E8A7757CD8BAC +:100790001B2A1022EB2A01222200203A0B22CD9E96 +:1007A0001B93775F237E9A7757CD8B1B3A0B22FEE4 +:1007B00007CAD6172A0E221181103E0890CDE81ADA +:1007C0002210223E07320B222A0C22118A1078CDE9 +:1007D000E81AEBC363172A05223A09223D3209229F +:1007E000C29B163E10CD9E1B3A04223DC380163A92 +:1007F00007223DC2E515D3043A25220F473A1222BB +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.g.bin b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.g.bin new file mode 100644 index 0000000000000000000000000000000000000000..d20308fb883140e69b29adb95803b6274ea6fc87 GIT binary patch literal 2048 zcmah|O>E;t6rPDU>1>-gp|s$`Hrq&DZKW;9luNdO=COj8578mh*PeJdzA|a z&fM4o;sggommA#ZqDtKMhy+?8A))045<-XryO=j)dt3U$zR~yQ&6_vx&3p4^Dqe|G znkGz-do&SK!G-}H(4;EdIEZQjRxVu-VM?Ph#SBKY97K#JTuek5Csf(3hLm$U7Bq6D zYLXwjI--e3Bf$b{PQ-`?oWf@AO3)x`@K`YJfUCX}(&b^CCh9hcaE8P5b(&o1B`J0H z9=j;+CibFu=&cM>=F3n62Ta9o%6S|$cjFYMA}KL>HVsA3VR=?!oaXUpv>GSkY#K(K zigPpBP{nydI?o*YoF12kEgw6b=5=9b+)dA`jtBnWgi4P!RCT6#eVE~;Cm*Xw4@#>4 zr=;SXn(8NODkfX!RndgVN?(RAs=IQkx&l(0o@$)78;8RbURsQT!9ZQ#9Qp9{;L+V< zPuRYG;&jpzVZcr38^)jo)bXM{qo=(fVH`TEM}k!HjwGZ)b*Jv1t`akKQJT5^~HelF{hyzrHQA4 z_9;Y-_@Yb=exu9932|9o%Ax*%=GA}?)LuNk^$D?_JBFtK$Ctb~9UQYIp?;l+U!}>S z%+m`Z;B`P=v8YFvm># z_!t*2mIl--tuB%Y{-QzfR}G9m2OI$IG}_p1zJT>+z4A>1R}LGs$`61CfZqX+0GIVz zWfjl?JO{W5pn9uv3-Gp1@EyRHfUg1H0`3961N;bh0QePfPhY?v06x@f_+!0_KhZDY z&tUy0;34R=W))vY{edp0vN?H|xek`j^xQl?c->kBPH zZOztRgz=a5i}o9wmGb-Admv?+iA-d}_zC}^^oQCZE@kPz344E|pS5>14V7mz@FMRZ z{n%O?-PP`DRzXJvm20^t$3r_GSwZDm?jd7#|NhKCa+Z^IbYw{m3}wcKH6B|VMr*Un zd3UpA7#l!_LCDI=3VBS1WzFZ7Wwg58{rzqi%;XKE*%cr{kRhumW6afLWtohTSs2?G zBfC|v*r?OFcFjh`!tQiBHd?4wt0hNDb$zt~np{R0%Wa_C8reGpZ6mx-^j(DCAo>l2 z7l?i!`I^$KDb1SFWYV&Zw+ULW;{)L9&0T`p>&=gVlkcT{Mz&mp$7D+#+mgr3)(!M- pW$UWso6k$0k)2xzzeIMF(T?&xdK2MwGE$mR9{(+jc3SOT zBrQOtU;68mKrI_xlDnnNw0Td)D)D<)|!<|qt}HzsG&%YQ%AF5<^LHlu}k;B)2e0| znM*a2Rl@&8YP0++=3huP)yQlrS4G zLg6~&Jk1&3(dJSHw8%bn5@N&@Lm@W53-Z<(9K*psZZ|Rw7t5!d4(3GpVtA+`85A=y zT=Cfm6L@n@+d4x3!H;mYv;95v3xbY1J33SZ>)U}+B;>_$aKu@! z*Q>8A%iq_P0z99tip4k|3WvgaD6HrqWl~-UeKo-uFR+?W78}ukGEko|K42~R*+h(& zoKF~;lk~1@&;7wF`hNR7yJCs<%F%4hBVA@yk5uGhf^?Zt1*wR~*%Fl=EG6v-*X2aG z&rU0?N~=bx60uh3rGPDRX9eRt3xv{NRf2h*)t>!03lEqhx8Jy)(~?KCrKF{O`El0z z6%LLYTdBt8p#!c|CsbnuUW9RVA%PZICchn2l(WH0n>bSM0!)ROd4x--8gY&Xo%#mQ zP%z%)Vu<`iK?gYxU}pz*-o(yHTy-^b=8wVH8n?Ty`ow+noNh+E#|Nx}{TU~2^Eo~4 zArg1_zySvQ@}LVcG}V)1qd#!sa-rrqiOpuL92;GT)B2uiaj1ripU)Y;3sVW(kHy

wC? zadKb4IoKc{3b?B`vREDsm@ux3iVG0_+V5S7p!;^>dd_$r%YK(?$uGCo)EfKoRka|} znuY@)Mg&;SRN}O_R4{uOP^?44IiF(jLw~Iqf zulQig-k52|DlZMHGD#SVd8pH@0`U%4w)1)w`6ws~sJj2F_qz#ez$ol3#6cZfcOPab=0W*79kRx{BoCz-Y5a)+`1=07W5>D?Sfj zUfAmpsT@DIm$&Bi_V(V}yJ7vUceiC`?T)TZZJRQ_D!y^Uy0-Og)j?k^Xrt@t>z$3N S4d%kSGT@obwb9qLsrMhG=cF9~ literal 0 HcmV?d00001 diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.h.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.h.hex new file mode 100644 index 00000000..620300a5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/roms/shuffle.h.hex @@ -0,0 +1,129 @@ +:10000000C328028400301133FBC97100009C3763A0 +:10001000F5E5D5C5CDAB043A12223C3212223A3373 +:10002000223D323322C246003A3222B7CA46003D50 +:10003000323222C246003A3D22B7C22C053C323D44 +:10004000223E1E323222210A20DB05479670CD68FF +:1000500000222A22210D20DB06479670CD6800225F +:100060002822C1D1E1F1FBC9B7FA7600FE21FA7D61 +:10007000003E21C37D00FEE0F27D003EE023470EFE +:10008000007E2F57237E2F5F13EB0906027CB7F209 +:100090009300371F677D1F6F05C28D00EB7B86774E +:1000A0005F2B7E8A77676BC9856FD024C9070707E6 +:1000B000072100201600E6F05F19C9D1E17E472331 +:1000C000E5D5CDAD00220020C9CDBB002A00204ED1 +:1000D00021FE0C79CDA8005E2356EB221221EB23E2 +:1000E0005E2356EB2210213E0FCD2002B71F323B7C +:1000F00022D20201060A11AB01CD26013A3B22E6CB +:1001000010C03A3B22060211AB01B7C211011160C7 +:1001100001CD26012A002023235E2323563E0ACD4B +:100120002002732372C9AFD30278CD2002E607D331 +:10013000013A1321215801CDA8006E260019EB2A9F +:100140001221D52DC24201CDF6012A12213E209462 +:100150004F06002A1021EBC93F362D241B1209003F +:100160001AD302DB01B67713231AD302DB01B67769 +:1001700013231AD302DB01B67713231AD302DB0150 +:10018000B67713231AD302DB01B67713231AD302EF +:10019000DB01B67713231AD302DB01B6771323AF43 +:1001A000D302DB01B67709AFD302C91AD302DB0150 +:1001B000AE7713231AD302DB01AE7723131AD302CF +:1001C000DB01AE7713231AD302DB01AE7713231AB8 +:1001D000D302DB01AE7713231AD302DB01AE771310 +:1001E000231AD302DB01AE771323AFD302DB01AEB8 +:1001F0007709AFD302C978CD20020F0F0FE61F5742 +:100200002378FE0ACA0802237E0F0F0F47E6E0B2EA +:100210005F78E61FC62457C9CDA8007E23666FC944 +:100220002A0020CDA8007EC9310024DB02E680CA66 +:100230007602AF323522323422323222320022327A +:100240003F22D3062100200620772305C24902322F +:100250002422FBC32C05000102030405060708093C +:100260000A0B0C0D0E0F100F0E0D0C0B0A090807D0 +:100270000605040302010601110000210020D30439 +:10028000707EA8CA8902CD3203237CFE40C27E0262 +:10029000D3042B7CFE1FCAAE027EA8CAA102CD32B7 +:1002A00003782F77AECA9002CD3203C39002D304F5 +:1002B000237CFE40CAC502782FAECAC002CD3203ED +:1002C000AF77C3AE02780747D27B027AB3CAF40293 +:1002D000EBF91100200600210000390E10AF29DAD9 +:1002E000E3022F12133E1812130DC2DD0205C2D70E +:1002F00002C32D03310024210C32E52100001142FC +:1003000003010004AF86D304230DC2050305C20513 +:10031000033CCA1F031AE3EBC5CD4A03C1EBE31349 +:100320007CFE20C20103E17DFE0CCA0000D304C3A1 +:100330002D034F7DE60179C23F03B257C34103B39A +:100340005FC94848474746464545D5E5EBCD890353 +:10035000CD9803E1D113C92A1E22EB3A3E224E2347 +:1003600006003DFA6A0309C35E03EB793DF8F51A0E +:1003700013D5FE30C27D03CD8907C38403CD890325 +:10038000CD980309D1F1C36C03EB21B603D64047E6 +:10039000070780CDA800EBC93E05F501E0FF091A6B +:1003A00077F13D09C8F513C39F03EB214204CD8FBC +:1003B00003CD980309C970605008047814161478A6 +:1003C0007E4A4A4A343C424242247E4242423C7E79 +:1003D000525252427E121202023C424252747E102B +:1003E00010107E42427E424232423E02027E181885 +:1003F00024427E404040407E0408047E7E04182053 +:100400007E3C4242423C7E1212120C3C4242225C32 +:100410007E1212324C244A5A522402027E02023EBA +:100420004040403E06186018063E4078403E422458 +:10043000182442060870080662725A4E46000000F0 +:1004400000003C4242423C40447E40407252525A7C +:100450004E425A5A5A7E0E08087E004E4A4A3200D0 +:100460007E4A4A7A004222120A063C5A5A5A3C04F0 +:100470000A0A0A7E36EB21D90DE60F0707470780E7 +:10048000CDA8000606AF121312137E1213237E129C +:1004900023E5211D0019EBE105C285043E08EB119F +:1004A0001F00702370193DC2A204C9217F3D3A0785 +:1004B00020CDAA032105207E4F17DAF804237EA75A +:1004C000CADD04352B3E8FB6773A0920F60432098F +:1004D00020D3053A0820F603320820D306DB04E6D1 +:1004E000014779E640CA18054FCD1805B9C823342D +:1004F00023343E01322022C9357EE60FCA1105D6CB +:1005000008C2DD043A0820E6FC320820D306C3DD29 +:10051000043E7FA677C3DD0421052078A7C2270506 +:100520003E40B677E640C93EBFA677C9F331002406 +:100530003A0820E6FE320820D306AF323222FB32E0 +:100540000920D305323A22323D223C321D22DB0201 +:10055000E630219B102323D610F25505221922DB09 +:1005600002E603FE03FA69053D323E22CDC010CDFE +:10057000191A3A0720B7C297053A0022EE01320055 +:1005800022CD6406CD7A06CD9706CDC4063A072063 +:10059000B7C22C05C3E9103A3F22320022CD6406CF +:1005A000CD7A06CD9706119D0BCD5703115C0C3A01 +:1005B0000022B7CAB90511710CCD5A03CD890711B4 +:1005C000860CCD5703CD8907CD8907AF3220223A5B +:1005D00007202A1922BED2E805113308CD5703CDD2 +:1005E0008907CDC406C32C0623BED21D06477E90C4 +:1005F000F5117C08CD5703CD890711BA08CD5703F3 +:10060000CD890711F708F13DCA0E06114B09CD57E8 +:1006100003CD8907119A09CD5703C32C0611CF09C1 +:10062000CD5703CD890711000ACD5A03D3043A20D0 +:1006300022B7C2A0053A3A2247DB042FE60E323A2F +:10064000224F782FA1CA2C06EE08C2F6063A0022E5 +:10065000EE01320022210F39221E22CDC010CD1909 +:100660001AC39D05215E0FCDAB1A21AD0F3A0022B2 +:10067000B7C2770621D20FC3AB1A210D2411160081 +:1006800006CB0E0A3600230DC284061905C2820667 +:10069000210E39221E22C9218E34115C0C3A00220F +:1006A000B7C2A70611710CCD5A03CD8907CD8907B2 +:1006B000C9F5CDAA03111808CD5A03F13DC8112D73 +:1006C00008C35A032A19227E2A1E22CDB10611A37D +:1006D00007CD5A03CD8907CD89072A19227E23BE6B +:1006E000CAF0067E2A1E22CDB10611C807C35A03DE +:1006F00011EF07C357032A19220E01E604CA0207A5 +:10070000230C3A072096FA2C063207207932212250 +:100710003DC22607CDC010210F39221E2211510AD9 +:10072000CD5A03CD9407CDC01021A5101108003A71 +:100730000022B7CA370719DB02E60CCA4507232394 +:10074000D604C23E077EF53D321822DB02E640CADF +:100750005407237E323222210F3911B70ACD5A03B2 +:10076000F121912FCD2E1A211539221E2211F30AC3 +:10077000CD5A03CD94073E20323722AF321D223EA0 +:1007800004320920D305C3D3102A1E220101000917 +:10079000221E22C9AF321222D3043A1222FEC0DA3C +:1007A0009807C90B5B5B5B5D5B504C415945520B35 +:1007B0005B5B5B5D5B4A4F554555520C5B5B5B5D1C +:1007C0005B535049454C45520C5B5B5B5E5B504C48 +:1007D00041594552530C5B5B5B5E5B4A4F55455537 +:1007E00052530C5B5B5B5E5B535049454C45520C6E +:1007F0004F525B5E5B504C41594552530C4F555B19 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/spram.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/sprom.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/sprom.vhd new file mode 100644 index 00000000..a81ac959 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Shuffleboard_MiST/rtl/sprom.vhd @@ -0,0 +1,82 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_aclr_a : STRING; + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/Invaders2.qpf b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/Invaders2.qpf new file mode 100644 index 00000000..215a8d81 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/Invaders2.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2013 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.0 Build 162 10/23/2013 SJ Web Edition +# Date created = 21:27:39 November 20, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "21:27:39 November 20, 2017" + +# Revisions + +PROJECT_REVISION = "Invaders2" diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/Invaders2.qsf b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/Invaders2.qsf new file mode 100644 index 00000000..f7c9eea1 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/Invaders2.qsf @@ -0,0 +1,173 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 13:13:10 June 05, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Invaders_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Invaders2_mist.sv +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/invaders_memory.sv +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_global_assignment -name VHDL_FILE rtl/sprom.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_video.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name QIP_FILE ../../../../common/mist/mist.qip + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Invaders2_mist +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== + set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# --------------------------- +# start ENTITY(Invaders_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top + set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top + set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Invaders_mist) +# ------------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/Invaders2.sdc b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/Invaders2.sdc new file mode 100644 index 00000000..f91c127c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/Invaders2.sdc @@ -0,0 +1,126 @@ +## Generated SDC file "vectrex_MiST.out.sdc" + +## Copyright (C) 1991-2013 Altera Corporation +## Your use of Altera Corporation's design tools, logic functions +## and other software and tools, and its AMPP partner logic +## functions, and any output files from any of the foregoing +## (including device programming or simulation files), and any +## associated documentation or information are expressly subject +## to the terms and conditions of the Altera Program License +## Subscription Agreement, Altera MegaCore Function License +## Agreement, or other applicable license agreement, including, +## without limitation, that your use is for the sole purpose of +## programming logic devices manufactured by Altera and sold by +## Altera or its authorized distributors. Please refer to the +## applicable agreement for further details. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition" + +## DATE "Sun Jun 24 12:53:00 2018" + +## +## DEVICE "EP3C25E144C8" +## + +# Clock constraints + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty + +# tsu/th constraints + +# tco constraints + +# tpd constraints + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + + + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] + +#************************************************************** +# Create Generated Clock +#************************************************************** + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + +#************************************************************** +# Set Input Delay +#************************************************************** + +set_input_delay -add_delay -clock_fall -clock [get_clocks {CLOCK_27}] 1.000 [get_ports {CLOCK_27}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {CONF_DATA0}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DI}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SCK}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}] + +#************************************************************** +# Set Output Delay +#************************************************************** + +set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_L}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_R}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {LED}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {VGA_*}] + +#************************************************************** +# Set Clock Groups +#************************************************************** + +set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}] + +#************************************************************** +# Set False Path +#************************************************************** + + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + +set_multicycle_path -to {VGA_*[*]} -setup 2 +set_multicycle_path -to {VGA_*[*]} -hold 1 + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/README SpaceInvaders2.txt b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/README.txt similarity index 100% rename from Arcade_MiST/Midway-Taito 8080 Hardware/README SpaceInvaders2.txt rename to Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/README.txt diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/clean.bat b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/Invaders2_mist.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/Invaders2_mist.sv new file mode 100644 index 00000000..8cf901c0 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/Invaders2_mist.sv @@ -0,0 +1,211 @@ +module Invaders2_mist( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Space Inv.2;;", + "O2,Rotate Controls,Off,On;", + "O34,Scanlines,Off,25%,50%,75%;", + "O5,Overlay, On, Off;", + "T6,Reset;", + "V,v1.20.",`BUILD_DATE +}; + +assign LED = 1; +assign AUDIO_R = AUDIO_L; + + +wire clk_sys; +wire pll_locked; +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_sys) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0,joystick_1; +wire scandoublerD; +wire ypbpr; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; +wire [7:0] audio; +wire hsync,vsync; +wire hs, vs; +wire r,g,b; + +wire [15:0]RAB; +wire [15:0]AD; +wire [7:0]RDB; +wire [7:0]RWD; +wire [7:0]IB; +wire [5:0]SoundCtrl3; +wire [5:0]SoundCtrl5; +wire Rst_n_s; +wire RWE_n; +wire Video; +wire HSync; +wire VSync; + +invaderst invaderst( + .Rst_n(~(status[0] | status[6] | buttons[1])), + .Clk(clk_sys), + .ENA(), + .Coin(btn_coin), + .Sel1Player(~btn_one_player), + .Sel2Player(~btn_two_players), + .Fire(~m_fire), + .MoveLeft(~m_left), + .MoveRight(~m_right), + .DIP(dip), + .RDB(RDB), + .IB(IB), + .RWD(RWD), + .RAB(RAB), + .AD(AD), + .SoundCtrl3(SoundCtrl3), + .SoundCtrl5(SoundCtrl5), + .Rst_n_s(Rst_n_s), + .RWE_n(RWE_n), + .Video(Video), + .HSync(HSync), + .VSync(VSync) + ); + +invaders_memory invaders_memory ( + .Clock(clk_sys), + .RW_n(RWE_n), + .Addr(AD), + .Ram_Addr(RAB), + .Ram_out(RDB), + .Ram_in(RWD), + .Rom_out(IB) + ); + +invaders_audio invaders_audio ( + .Clk(clk_sys), + .S1(SoundCtrl3), + .S2(SoundCtrl5), + .Aud(audio) + ); + +invaders_video invaders_video ( + .Video(Video), + .Overlay(~status[5]), + .CLK(clk_sys), + .Rst_n_s(Rst_n_s), + .HSync(HSync), + .VSync(VSync), + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs) + ); + +mist_video #(.COLOR_DEPTH(3)) mist_video( + .clk_sys(clk_sys), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r,r}), + .G({g,g,g}), + .B({b,b,b}), + .HSync(hs), + .VSync(vs), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .rotate({1'b0,status[2]}), + .scandoubler_disable(scandoublerD), + .scanlines(status[4:3]), + .ce_divider(1), + .ypbpr(ypbpr) + ); + +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac dac ( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +wire m_up = ~status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_up | joystick_0[3] | joystick_1[3]; +wire m_down = ~status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_down | joystick_0[2] | joystick_1[2]; +wire m_left = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_left | joystick_0[1] | joystick_1[1]; +wire m_right = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_right | joystick_0[0] | joystick_1[0]; +wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; +wire m_bomb = btn_fire2 | joystick_0[5] | joystick_1[5]; +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_left = 0; +reg btn_right = 0; +reg btn_down = 0; +reg btn_up = 0; +reg btn_fire1 = 0; +reg btn_fire2 = 0; +reg btn_fire3 = 0; +reg btn_coin = 0; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h75: btn_up <= key_pressed; // up + 'h72: btn_down <= key_pressed; // down + 'h6B: btn_left <= key_pressed; // left + 'h74: btn_right <= key_pressed; // right + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h14: btn_fire3 <= key_pressed; // ctrl + 'h11: btn_fire2 <= key_pressed; // alt + 'h29: btn_fire1 <= key_pressed; // Space + endcase + end +end + +endmodule diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T8080se.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T8080se.vhd new file mode 100644 index 00000000..65b92d54 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T8080se.vhd @@ -0,0 +1,194 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80_ALU.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80_ALU.vhd new file mode 100644 index 00000000..e09def1e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80_ALU.vhd @@ -0,0 +1,361 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80_MCode.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80_Pack.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80_Reg.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/T80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/dac.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- Refer to Xilinx Application Note XAPP154. +-- +-- This DAC requires an external RC low-pass filter: +-- +-- dac_o 0---XXXXX---+---0 analog audio +-- 3k3 | +-- === 4n7 +-- | +-- GND +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/invaders.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/invaders.vhd new file mode 100644 index 00000000..a509baa4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/invaders.vhd @@ -0,0 +1,271 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaderst is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire : in std_logic; + MoveLeft : in std_logic; + MoveRight : in std_logic; + DIP : in std_logic_vector(8 downto 1); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0); + SoundCtrl5 : out std_logic_vector(5 downto 0); + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic + ); +end invaderst; + +architecture rtl of invaderst is + + component mw8080 + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); + end component; + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(6 downto 2); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; +begin + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; + + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; + if WD_Cnt = 255 then + Rst_n_s_i <= '0'; + end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then + WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then + if Sounds(0) = '1' and Old_S0 = '0' then + WD_Cnt <= WD_Cnt + 1; + end if; + if PortWr(6) = '1' then + WD_Cnt <= (others => '0'); + end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: mw8080 + port map( + Rst_n => Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + Video => Video, + HSync => HSync, + VSync => VSync); + + with AD_i(9 downto 8) select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + S when others; + + GDB0(0) <= '1';--DIP(8); -- Unused ? + GDB0(1) <= '1';--DIP(7); + GDB0(2) <= '1';--DIP(6); -- Unused ? + GDB0(3) <= '1'; -- Unused ? + GDB0(4) <= not Fire; + GDB0(5) <= not MoveLeft; + GDB0(6) <= not MoveRight; + GDB0(7) <= '1';--DIP(5); -- Unused ? + + GDB1(0) <= not Coin;-- Active High ! + GDB1(1) <= not Sel2Player; + GDB1(2) <= not Sel1Player; + GDB1(3) <= '1';-- Unused ? + GDB1(4) <= not Fire; + GDB1(5) <= not MoveLeft; + GDB1(6) <= not MoveRight; + GDB1(7) <= '1';-- Unused ? + + GDB2(0) <= '1';--DIP(4); -- LSB Lives 3-6 + GDB2(1) <= '1';--DIP(3); -- MSB Lives 3-6 + GDB2(2) <= '0';-- Tilt ? + GDB2(3) <= '0';--DIP(2); -- Bonus life at 1000 or 1500 + GDB2(4) <= not Fire; + GDB2(5) <= not MoveLeft; + GDB2(6) <= not MoveRight; + GDB2(7) <= '1';--DIP(1); -- Coin info + + PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; + PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; + PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; + PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; + PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + OldSample := '0'; + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0); + end if; + if PortWr(4) = '1' and OldSample = '0' then + D5(15 downto 8) <= DB; + D5(7 downto 0) <= D5(15 downto 8); + end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0); + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/invaders_audio.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/invaders_memory.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/invaders_memory.sv new file mode 100644 index 00000000..9ad7fe2a --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/invaders_memory.sv @@ -0,0 +1,104 @@ + +module invaders_memory( +input Clock, +input RW_n, +input [15:0]Addr, +input [15:0]Ram_Addr, +output [7:0]Ram_out, +input [7:0]Ram_in, +output [7:0]Rom_out +); + +wire [7:0]rom_data_0; +wire [7:0]rom_data_1; +wire [7:0]rom_data_2; +wire [7:0]rom_data_3; +wire [7:0]rom_data_4; +wire [7:0]rom_data_5; + +sprom #( + .init_file("./roms/invad2ct.h.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_h ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_0) + ); + +sprom #( + .init_file("./roms/invad2ct.g.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_g ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_1) + ); + +sprom #( + .init_file("./roms/invad2ct.f.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_f ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_2) + ); + +sprom #( + .init_file("./roms/invad2ct.e.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_e ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_3) + ); + +sprom #( + .init_file("./roms/invad2ct.b.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_b ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_4) + ); + +sprom #( + .init_file("./roms/invad2ct.a.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_a ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_5) + ); + +always @(Addr, rom_data_0, rom_data_1, rom_data_2, rom_data_3, rom_data_4, rom_data_5) begin + Rom_out = 8'b00000000; + case (Addr[15:11]) + 5'b00000 : Rom_out = rom_data_0; + 5'b00001 : Rom_out = rom_data_1; + 5'b00010 : Rom_out = rom_data_2; + 5'b00011 : Rom_out = rom_data_3; + + 5'b01010 : Rom_out = rom_data_4; + 5'b01011 : Rom_out = rom_data_5; + default : Rom_out = 8'b00000000; + endcase +end + +spram #( + .addr_width_g(13), + .data_width_g(8)) +u_ram0( + .address(Ram_Addr[12:0]), + .clken(1'b1), + .clock(Clock), + .data(Ram_in), + .wren(~RW_n), + .q(Ram_out) + ); +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/invaders_video.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/invaders_video.vhd new file mode 100644 index 00000000..77ac2478 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/invaders_video.vhd @@ -0,0 +1,127 @@ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + + +entity invaders_video is + port( + Video : in std_logic; + Overlay : in std_logic; + CLK : in std_logic; + Rst_n_s : in std_logic; + HSync : in std_logic; + VSync : in std_logic; + O_VIDEO_R : out std_logic; + O_VIDEO_G : out std_logic; + O_VIDEO_B : out std_logic; + O_HSYNC : out std_logic; + O_VSYNC : out std_logic + ); +end invaders_video; + +architecture rtl of invaders_video is + + signal HCnt : std_logic_vector(11 downto 0); + signal VCnt : std_logic_vector(11 downto 0); + signal HSync_t1 : std_logic; + signal Overlay_G1 : boolean; + signal Overlay_G2 : boolean; + signal Overlay_R1 : boolean; + signal Overlay_G1_VCnt : boolean; + signal VideoRGB : std_logic_vector(2 downto 0); +begin + process (Rst_n_s, Clk) + variable cnt : unsigned(3 downto 0); + begin + if Rst_n_s = '0' then + cnt := "0000"; + elsif Clk'event and Clk = '1' then + if cnt = 9 then + cnt := "0000"; + else + cnt := cnt + 1; + end if; + end if; + end process; + + p_overlay : process(Rst_n_s, Clk) + variable HStart : boolean; + begin + if Rst_n_s = '0' then + HCnt <= (others => '0'); + VCnt <= (others => '0'); + HSync_t1 <= '0'; + Overlay_G1_VCnt <= false; + Overlay_G1 <= false; + Overlay_G2 <= false; + Overlay_R1 <= false; + elsif Clk'event and Clk = '1' then + HSync_t1 <= HSync; + HStart := (HSync_t1 = '0') and (HSync = '1'); + + if HStart then + HCnt <= (others => '0'); + else + HCnt <= HCnt + "1"; + end if; + + if (VSync = '0') then + VCnt <= (others => '0'); + elsif HStart then + VCnt <= VCnt + "1"; + end if; + + if HStart then + if (Vcnt = x"1F") then + Overlay_G1_VCnt <= true; + elsif (Vcnt = x"95") then + Overlay_G1_VCnt <= false; + end if; + end if; + + if (HCnt = x"027") and Overlay_G1_VCnt then + Overlay_G1 <= true; + elsif (HCnt = x"046") then + Overlay_G1 <= false; + end if; + + if (HCnt = x"046") then + Overlay_G2 <= true; + elsif (HCnt = x"0B6") then + Overlay_G2 <= false; + end if; + + if (HCnt = x"1A6") then + Overlay_R1 <= true; + elsif (HCnt = x"1E6") then + Overlay_R1 <= false; + end if; + + end if; + end process; + + p_video_out_comb : process(Video, Overlay_G1, Overlay_G2, Overlay_R1) + begin + if (Video = '0') then + VideoRGB <= "000"; + else + if Overlay_G1 or Overlay_G2 then + VideoRGB <= "010"; + elsif Overlay_R1 then + VideoRGB <= "100"; + else + VideoRGB <= "111"; + end if; + end if; + end process; + + + O_VIDEO_R <= VideoRGB(2) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_G <= VideoRGB(1) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_B <= VideoRGB(0) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_HSYNC <= not HSync; + O_VSYNC <= not VSync; + + +end; \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/mw8080.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/mw8080.vhd new file mode 100644 index 00000000..b9a88f96 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/mw8080.vhd @@ -0,0 +1,336 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n, Rd_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/pll.qip b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/pll.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/pll.vhd new file mode 100644 index 00000000..d65b9f9b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/pll.vhd @@ -0,0 +1,350 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire4_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire4_bv(0 DOWNTO 0) <= "0"; + sub_wire4 <= To_stdlogicvector(sub_wire4_bv); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + sub_wire2 <= inclk0; + sub_wire3 <= sub_wire4(0 DOWNTO 0) & sub_wire2; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_UNUSED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire3, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.a.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.a.hex new file mode 100644 index 00000000..38fd57d7 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.a.hex @@ -0,0 +1,129 @@ +:10000000E5CDC40020E12323110722EB06047E2B5B +:100010002BE61FFE15CA49581ABEC24958231313AE +:100020001AC606BECA2A58D24358C618BEDA435862 +:10003000233E80B67778C6043203221B1B1B1BC3EA +:100040006058C91B1B23C34B582323232323230599 +:10005000C20E58C9F3BFF3BFF3BFF3BFF3BFFBBF7B +:100060002B2BCD551CC9F3BFF3BFF3BFF3BFFBBFB1 +:10007000000000E5D5C5CD3E1DCD811DC1D1E1C932 +:10008000CA8B187CFE01CC7058C37216F3BFF7BF41 +:100090002B7E12D513131313237E2BE61FFE143E63 +:1000A00000C2A6583EFD12D1C3F215BFF3BFF7BF81 +:1000B0003A0722E61FFE15C29A0A3A0B22E61FFEF5 +:1000C00015C29A0A3A3020FE16C29A0A3A0920C38B +:1000D0002E0AF3BFF3BFF3BFF3BFF3BFF3BFF7BF06 +:1000E0003A0F22E61FFE15C2100B3A1322E61FFE3E +:1000F00015C2100B3A6020FE16C2100B3A0920C33D +:10010000A40AFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:10011000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:10012000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF1F +:10013000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF0F +:10014000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFFFF +:10015000FFEFFFEFFFFFFFFFFFFFFFEFFFFFFFFFDF +:10016000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFFDF +:10017000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFFCF +:10018000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFFBF +:10019000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFFAF +:1001A000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF9F +:1001B000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF8F +:1001C000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF7F +:1001D000FFEFFFEFFFFFFFFFFFFFFFEFFFFFFFFF5F +:1001E000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF5F +:1001F000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF4F +:10020000A5EFFFEFFFFFFFFFFFEFFFEFFFFFFFFF98 +:10021000CA610FE5CD5B115EE10A83C3480FFFFFA2 +:100220001B1BAF12131306107DC38C1CFFFFFFFFB7 +:100230003AD821FE21C8210722C3C354FFFFFFFF84 +:10024000AF320B20211D37114F083E09CDA557268F +:10025000FFCD180BC39F57FFFFFFFFEFFFFFFFFF0F +:10026000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFFDE +:10027000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFFCE +:10028000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFFBE +:10029000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFFAE +:1002A000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF9E +:1002B000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF8E +:1002C000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF7E +:1002D000FFEFFFEFFFFFFFFFFFFFFFEFFFFFFFFF5E +:1002E000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF5E +:1002F000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF4E +:10030000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF3D +:10031000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF2D +:10032000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF1D +:10033000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF0D +:10034000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFFFD +:10035000FFEFFFEFFFFFFFFFFFFFFFEFFFFFFFFFDD +:10036000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFFDD +:10037000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFFCD +:10038000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFFBD +:10039000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFFAD +:1003A000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF9D +:1003B000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF8D +:1003C000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF7D +:1003D000FFEFFFEFFFFFFFFFFFFFFFEFFFFFFFFF5D +:1003E000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF5D +:1003F000FFEFFFEFFFFFFFFFFFEFFFEFFFFFFFFF4D +:10040000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:10041000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:10042000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:10043000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:10044000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:10045000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:10046000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:10047000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:10048000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:10049000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:1004A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:1004B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:1004C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:1004D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:1004E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:1004F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:10050000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:10051000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:10052000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:10053000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:10054000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:10055000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:10056000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:10057000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:10058000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:10059000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:1005A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:1005B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:1005C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:1005D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:1005E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:1005F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:10060000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:10061000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:10062000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:10063000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:10064000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:10065000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:10066000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:10067000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:10068000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:10069000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:1006A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:1006B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:1006C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:1006D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:1006E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:1006F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:10070000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:10071000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:10072000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:10073000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:10074000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:10075000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:10076000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:10077000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:10078000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10079000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:1007A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:1007B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:1007C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:1007D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:1007E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:1007F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.b.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.b.hex new file mode 100644 index 00000000..ec483fdc --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.b.hex @@ -0,0 +1,129 @@ +:1000000002000000000000000100020000000004E7 +:100010000E0008003E000000FD000E00000000047D +:1000200016000000000000000000160000000004A0 +:1000300004000000000000000100040000000004B3 +:100040000F00F0003E00000000000F000000000460 +:100050001600000000000000000016000000000470 +:100060001500000000000000000015000000001353 +:10007000170000000000000000001700000000044E +:10008000780E781E782E783E784E785E786E787E80 +:10009000788E789E78AE680E681E682E683E684E30 +:1000A000685E686E687E688E689E68AE580E581EE0 +:1000B000582E583E584E585E586E587E588E589E50 +:1000C00058AE80AE809E808E807E806E805E804E38 +:1000D000803E802E801E800E90AE909E908E907EF0 +:1000E000906E905E904E903E902E901E900EA0AE20 +:1000F000A09EA08EA07EA06EA05EA04EA03EA02ED0 +:10010000A01EA00E0E019B520E011F520E01845123 +:100110000E0192510E01A0510E01AE510E01BC51C3 +:100120000E01CA510E01D8510E01E6510B01F351D7 +:100130000B01FE510B0109520B0114521501C35260 +:100140001501D8520F01ED520F01FC5203010C535F +:1001500003010F530601185306019B5228019B52BD +:1001600019021E5319025053210182531F01A35338 +:1001700001010B5301010B530301125303011553EA +:1001800016052D52000080617FD6F4F4D67F618081 +:100190000000000010607FDFF4F4DF7F60100000DB +:1001A000000018DCBC76DEDE76BCDC180000000047 +:1001B00098DCBC76DEDE76BCDC9800000000895B53 +:1001C0003E2C38382C3E5B890000000008183B6D3F +:1001D000B8A87D3B18080000000000F8B8749C9C8B +:1001E00074B8F8000000000080F838749C9C7438E3 +:1001F000F8800000003C7EDDF6DD7E3C0000000063 +:10020000BF7CD5E6D57CBF000000001856BA10BAF6 +:100210005618000000009856BA50BA5698000000D0 +:100220000000221400007700001422000008009152 +:10023000003C0600DA007EFE007C00BBFB003400C0 +:100240006F2F001C00BB2F001C007EFB0034003C05 +:10025000FE007C00000600DA0000080091000000AB +:100260000000000000000000001800000018DC0082 +:10027000F80056BC00B800BA7600740010DE009C8E +:1002800000BADE009C00567600740018BC00B8006E +:1002900000DC00F800001800000000000000000072 +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000C0E0E0E3E2CFE2C3E26 +:1002D0000E0E0E0C00000000000000003070707068 +:1002E0007C347F347C707070300000000000002A85 +:1002F00000401A984200280044100000812EC500DA +:10030000B845C243C2422598433085FF44AA112212 +:10031000558844FF1122FF8800AD7E7E7D00FF01DD +:10032000FF03FF07FF0FFF0FFF0FFF0FFF0FFF0F71 +:10033000FF0FFF0FFF0FFF0FFF0FFF0FFF0FFF0F4D +:10034000FF0FFF0FFF0FFF0FFF0FFF07FF03FF015F +:1003500080FFC0FFE0FFF0FFF0FFF0FFF0FFF0FFD5 +:10036000F0FFF0FFF0FFF0FFF0FFF0FFF0FFF0FF15 +:10037000F0FFF0FFF0FFF0FFF0FFF0FFE0FFC0FF45 +:1003800080FF00000000000000101010103078FC0A +:100390009E9EF2F29E9EF2F29E9E7C3810101010ED +:1003A0000000000000000000000001021C9CD2F1CF +:1003B000F3F5D9911191D9F5F3F1D29C1C0201000A +:1003C0000000C3C157C680212C22773A242057FE53 +:1003D00004DAA9543A5420C60ABEDAED5396477A95 +:1003E000B8D2ED53210003222720C30F547AFEC355 +:1003F000D2B2543A5420C60A5FD6E02F3CBEDA0F80 +:10040000547B86477AB8DA0F542100FD2227203A20 +:100410002820A7C218543E01322820D53E023203BC +:1004200022110F221AE61FFE151B1BCA8A5421F93E +:10043000543A47223DCD92001ABECA4054D28A5443 +:100440000F0F0FE61F3D210155CD92003A28204F96 +:10045000A73A2420F25D54C60496C36754C60447E5 +:1004600079A778CA67548647C60E67131AB8DA8A1E +:1004700054BCD28A5479A7F28054210003C3835418 +:100480002100FD22272021E4213421032235CA97AF +:1004900054111322C324543AE421FE02D1C3B854A8 +:1004A000210000222720C3B854210003222720C3A3 +:1004B000B8542100FD2227203A5420CDEA54A7C089 +:1004C000C3305A1124200E60CD96573A0920E68099 +:1004D000C03A2420CDEA54A7003A4622A7C0210FF3 +:1004E000221154200E00CD9657C9D60E5FC627475D +:1004F0007AC60ABBD8B8D0AFC9081018202830383F +:1005000040000306090C0F1215E5D57BFE3B01D117 +:1005100021FA175501DC210AFE02CA2255FE04C247 +:100520007E557BFE3B111E202128223A2420FA3AD8 +:1005300055114E20212A223A5420F51AA7C24B55B4 +:10054000F1FE80DA4C553E0BC34D55F11A87E5217B +:100550008155CD92005E23560B0B0B0B0AC60BFE8A +:1005600012DA66553E1187218155CD92007E832790 +:100570004F237E8A2747E17123702BD1F1C9D1E146 +:10058000C90010000500045004000450030003508B +:10059000020002500100015000000400030002505C +:1005A00001000175003A4522A7CA03563A4422A722 +:1005B000C2DB553A0920E680F5CCC253F1CA035696 +:1005C0003A0920E640F5C4C253F1C20356DB0247A4 +:1005D000E620C2E45578E640C2F555210000222706 +:1005E00020C303563A2420FE04DADB552100FD2205 +:1005F0002720C303563A2420FEC3D2DB5521000333 +:100600002227203A4722A7CA7D563A4622A7C2553A +:10061000563A0920E680C247563A5420473A5820B5 +:10062000A7C229563E02325820FA385678FEC3DA5D +:100630007D562100FEC3415678FE04D27D5621002E +:1006400002225720C37D56DB0147E620C25E567862 +:10065000E640C26F56210000225720C37D563A540F +:1006600020FE04DA55562100FD225720C37D563A5C +:100670005420FEC3D255562100032257203A45226A +:10068000A7CA9156212A2011442206020E0ECDA49B +:10069000563A4722A7C8215A2011462206050E0FB6 +:1006A000CDA456C97EFE16CAFA561AA7CC0C57C856 +:1006B0007EFE103610C2BA5636111A3D12C2F656D8 +:1006C0003616131AFE80C2CB56AF12A7CAD0563DBB +:1006D000121B3E60122B2B3600C5CD9957CD9C576F +:1006E0003A4522473A0920E640CAEE5606003A4704 +:1006F00022B0C1CA405ACD0C57C91AA7C83D12C072 +:10070000131AA7C8713EFA856F3603C9F57832020D +:1007100020CD9800220020CDC40020F1C921102056 +:10072000361F2323368023233690211A20361FCDEF +:10073000C40001AF320B200E10211032E5CDA257BC +:10074000E12323E50E20CDA257E123230E30CDA2D5 +:100750005721102F117E573E06E5D5F5CDA557F14F +:10076000D1E12323E5D5F5CDA557F1D1E12323CD63 +:10077000A557210E391184573E11CDA557C9504FA9 +:10078000494E545353504143455B494E56414445AD +:1007900052535B494946C3D011C3D41DC3EB1DC39B +:1007A0001A09C34305C34D040A09434D5009420DBC +:1007B000FABB573A0920E640C2EF1C7E8127C3E905 +:1007C0001C3A54228787878787473AD82190C3C528 +:1007D00053233E80B6777AC604320322606923E54C +:1007E000CDE51BE1D1C36B0F3A0220F5CDC4000764 +:1007F000F1320220C3261C093B4D4F53430D0A0919 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.e.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.e.hex new file mode 100644 index 00000000..84ee5864 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.e.hex @@ -0,0 +1,129 @@ +:1000000078A7C00EAAC93A0220E6010601CA16184E +:10001000CD7A1FC31918CD871FC93A0220E6012ADD +:100020002B20C228182A5B20C97EFE08F23218064F +:1000300000C9FE08C23A180601C91AFE01F24318A7 +:100040000600C97EFE09C24C180604C9FE0AC25445 +:10005000180605C91AFE02F25D180600C97ED60B05 +:1000600087C60347C93A0220CD9800220020C3006A +:100070005820C93A0220E6013E06211B20C28518FD +:100080003E08214B2032E621C3A0183A0220E601A7 +:100090003E0A211B20C29D183E0C214B2032E62136 +:1000A0001ABEFA0517C1C50AFE16C21D193A02206A +:1000B000E601F5CABA18782F3C47F13E80CAC2184B +:1000C0003E78C1C503030203033E0702030303D5C1 +:1000D0001B1B1B1B1AD605FADB18AF2F3C8711130D +:1000E0001ACD3D111A0203131A02D103033A02205A +:1000F000E6013E1ACAF9183E1902C1C50203030AF5 +:10010000CA0919327B20C30C19327C200601CA1798 +:1001100019CD521FC31A19CD5C1FC32E190AFE1028 +:10012000CA2819FE11C22E191A3C77C3FB192323C2 +:10013000237EA7C25C19C5E53A0220E6012A2D20DC +:10014000C246192A5D207EFE0AD24E193E0AD60406 +:10015000F25419AF32E321E1C1C366192BD5562BF6 +:100160005E131AD1232303030303C610D5570ABA1B +:10017000D1DA05177EA7C29F192BD5562B5E3A02FE +:1001800020E601CA8C193A7B20C38F193A7C2012D1 +:10019000133AE32112133AE62112D123C3CD192BCE +:1001A000D5562B5EE5D5E13A0220E601CAB5192302 +:1001B0002323C3B8192B2B2B1A7713231AC61077B6 +:1001C000233AE621772B2BEBE1732372D1D51B1B4E +:1001D0001B1B1A3C123E0ACD3D111A3C12D1237E44 +:1001E0003C77C1C50AFE16CAF0197EFE0BC2051780 +:1001F0002B2B2B1A3C77FE03C20517233A0220E66D +:1002000001118120C20A1A1144217323722336007E +:10021000C3051780028003000480048005FAE5D539 +:10022000C5CD281AC1D1E1C9237EE61FFE14C83E00 +:1002300080B6772B2B7EFE80D2B41A3A4E22070767 +:10024000070747C618BEDAAB1A78C607BEDA541AD3 +:10025000CD481CC9E5CD3B1BE13A0322FE07F03A2D +:100260004422A7C03A2020A7C8233A2420C6FEBEB5 +:10027000D0C613BED83A4522A7C83E043244223E17 +:10028000A0322F223E10322A200604CD521F3E10EB +:100290003235223A0322FE05F8FE07F021472234C8 +:1002A0000610CD5C1F3E20323D22C9E5CD3B1BE14F +:1002B000CD481CC9FE80DA371B3A532207070707CF +:1002C0002F3C47C6E6BED22E1B78C6F9BED2D41A42 +:1002D000CD481CC9E5CD3B1BE13A0322FE05C8FE13 +:1002E00006C83A4622A7C03A5020A7C8233A54204D +:1002F000C6FEBED0C613BED83A4722A7C83E0432B7 +:1003000046223EA03230223E10325A200604CD5CF6 +:100310001F3E10323B223A0322FE05F8FE07F82169 +:100320004522340610CD521F3E20323722C9E5CD7A +:100330003B1BE1CD481CC9CD481CC9AF32ED213A69 +:100340000322FE05F8477EE6F84F78FE07FA541BB5 +:100350003E00814F3E2132E421118320EB060A7ECC +:10036000E61F79C2801B233AE421D60332E42179C7 +:100370002323C25F1B3E2132E42105C879C35F1BE2 +:100380002B2BBE2323CAB71B4F3AE421CD92003E4C +:100390002132E4217905C25F1B3AED21A7C03C322E +:1003A000ED211AE6F84F3A0322FE07F2B21B3E0097 +:1003B000814FEBC3541BC93AE421472B131A96DA39 +:1003C000C71BFE0EDAD11B232323050505C2BD1B67 +:1003D000C9237EE680C07EE61FCAE11BFE01C2E59E +:1003E0001B2BC3C71BC50E10FE06FAF61B0E20FE04 +:1003F0000AFAF61B0E300600CDCD1CC12B2B117056 +:1004000020EB360123231A772323131A772323366D +:1004100000232323233E0113127723232323233690 +:1004200004E5C3E85707E136133A0322FE05F8FE58 +:10043000070608FA3F1CCD521F3E05323822C9CDAF +:100440005C1F3E05323E22C9113020CD551C116083 +:1004500020CD551CC91AFE16C83A0322FE05F81312 +:10046000131AD60247C6094F7EB8D8B9D023131342 +:100470001A3DBED0C621BED83E09CD3D111AA7C037 +:100480003E04121B1B1B3E1012C3205AFE0BF2A48B +:100490001C3E10323622325B22CD701F0601CD7A0F +:1004A0001FC3B11C3E10323C22CD661F0601CD8712 +:1004B0001F2A2622CDED1F7BFE3BF2C31C222B20E0 +:1004C000C3C61C225B204E2346CDCD1CC93A092051 +:1004D000E680C83A0322FE05F8FE07E5F5214B2227 +:1004E000F2E61C215022C3B05777237E882777DBA2 +:1004F00002173E14DAF91C3E19BED2351D237EA721 +:10050000C2351D343A0322FE07214522F2121D2175 +:100510004722347E7DFE450610C22A1DCD521F3E65 +:1005200020323722CDD41DC3351DCD5C1F3E203275 +:100530003D22CDEB1DF1F43E1DFC811DE1C93A09C0 +:1005400020E640C0DB02E608CA621D3E01320B20F5 +:100550003A4C224F21E93ECD43053A4B224FCD4341 +:1005600005C93E02320B203A4B220F0F0F0F4F21CD +:10057000E93ECD43053A4C220F0F0F0F4FCD4305F7 +:10058000C93E01320B203A51224F21F33ECD4305A3 +:100590003A50224FCD4305C9C901320B203A4A22B5 +:1005A0004F21EE3ECD43053A49224FCD4305C92A9E +:1005B0004922EB2A4B22CDC41D2A4922EB2A502284 +:1005C000CDC41DC97ABCDAD01DC07BBDDAD01DC92F +:1005D000224922C9210B203601DB02E608C2E11DB7 +:1005E0003421E23E3A4522CDFA1DC921F93E3E01B1 +:1005F000320B203A4722CDFA1DC947878011311EA0 +:10060000CD3D1106033A0B20FE02CA1C1EC5D51AA9 +:100610004FCD4305D1C11305C20D1EC91313C5D556 +:100620001A0F0F0F0F4FCD4305D1C11B05C21E1E60 +:10063000C90AAAAA1AAAAA2ABAAA3ABBAA4ABBBA39 +:100640005ABBBB6ABBBB7ABBBB8ABBBB9ABBBB10EA +:10065000BBBB3A4422A7C03A0920E640C001CD21E5 +:10066000113922214022CD961EF1A7C8C5060FCD13 +:10067000A11FC1CD701FC93A4622A7C001D82111C0 +:100680003F22214222CD961EF1A7C8C5060FCD9468 +:100690001FC1CD661FC91AA7CA9D1EFE01CAA21E90 +:1006A0002600225922E3E5C00AF52A59224E2346A4 +:1006B0000AFEFFC2BA1E01D11EAF03702B7147F1B3 +:1006C000A787C6024F78A7CACE1E3E0212C979126A +:1006D000C901010101000202020200040404000831 +:1006E0000808FF2A26222323237EFE05C2F21E21AC +:1006F000F81E2B222622C9500000015001000200E2 +:10070000030005213422113A1F0E0CD5CD181F23EA +:10071000D113130DC20B1FC97EA7C8FE01C2381F1B +:10072000EB7E234623EBFE01CA7A1FFE03CA871F16 +:10073000FE05CA941FC3A11F35C901020104071099 +:1007400001100108070F030203040510031003083A +:10075000050F3A3122B0323122D301C93A2522B0F5 +:10076000322522D303C93A3222B0323222D305C90C +:100770003A3322B0323322D307C9782F473A312295 +:10078000A0323122D301C9782F473A2522A0322541 +:1007900022D303C9782F473A3222A0323222D3051E +:1007A000C9782F473A3322A0323322D307C9DB015D +:1007B0002FE631C0AF320B202A5D227DB4CAC41FA0 +:1007C0002B225D22C0219D3F11D11F3E19CD4D042A +:1007D000C942595B4A4F454C5B4B52454745525BBA +:1007E000464F525B4D4944574159C3A555C309551E +:1007F000C31D57414C462D57415920504F494E5427 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.f.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.f.hex new file mode 100644 index 00000000..cf20ae03 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.f.hex @@ -0,0 +1,129 @@ +:10000000C32C0F7EA7C20A103601232334E10B0B49 +:1000100022E421CD4D1122002023230A772323033C +:100020000A7722E621032A00200AE61F77FE01C292 +:100030003C10AFCD42111A3D12C34B100AE601CA63 +:1000400048100A3D02C34B100A3C023E0ACD920002 +:100050000AE61F772AE4212B7EA7CA77102AE62119 +:1000600023233ACC21A73604C26D1036FC3E09CDBD +:1000700092003605C385102AE621232336003E0967 +:10008000CD92003604D5C53ACC21A7F5CC4212F169 +:10009000C47412CDC40020CDC40020C1D10B2AE607 +:1000A000217E022B2B0B7E02032AE4210AFE08D2BA +:1000B000C8102B7EA7C2E010D53E05CD3D113E02F3 +:1000C00012D1CD2511C3E010FECADAE0102B7EA7B5 +:1000D000C2E010D53E05CD3D113EFE12D1CD251119 +:1000E000131AA7C83D12C01313131A3C123ACC219D +:1000F000A73A4E22CAFA103A532287D60A2F3C4713 +:10010000D5131313131AD60BFA10110404C30611D6 +:10011000D11AB8F83ACC213C3C473AF821B032F831 +:1001200021CD440EC9E5212D203ACC21A7CA331197 +:10013000215D20712370E1C9814FD004C9835FD054 +:1001400014C9E5F50AE6E06FF1B502E1C93ACC2140 +:10015000211020A7CA5A11214020C93ACC212118C8 +:1001600020A7CA6811214820C93A0920E640C2A444 +:1001700011DB022FE610CA7F1132F921C3A4113A14 +:10018000F921A7CAA4113A2020FE16CAA4113A45A3 +:1001900022A7CAA411AF32F9212107221124200E6F +:1001A00060CDD011DB012FE610CAB01132FE21C99B +:1001B0003AFE21A7C83A5020FE16C83A4722A7C8DF +:1001C000AF32FE21210F221154200E00CDD011C9D3 +:1001D0007EE61FFE15CAEB11E5CD2C12E13E04CDE3 +:1001E00092007EE61FFE15C0C30012E523232323E1 +:1001F0007EE61FFE15C2FC11E1C30012CD2C12E1F8 +:10020000361B79B6772B1AC60A772B1B1B1A772B4E +:10021000360006027DFE0AF22312CD521F3E08323E +:100220003422C9CD5C1F3E08323A22C92B2B7EFEF8 +:1002300080F579A7CA3C12F1D0F1F1C9F1D8F1F1FA +:10024000C9943A0920E640C03A4522A7C8212F2286 +:100250007EA7CA571235C911FB1321EA21060ECD1C +:10026000F00D11FA212AFC210124203E01327E20CA +:10027000CDA012C93A4722A7C82130227EA7CA833F +:100280001235C911091421EA21060ECDF00D11FF16 +:10029000212A01220154203E01327E20CDA012C924 +:1002A0001AD5FE01D2BB12E52AF6213600237EA71D +:1002B000CAB41235E1C25113C30513E52AEF217EFA +:1002C000E1E61FFE15C2CA12AF123AF221C60B3286 +:1002D000F2213E01327E20131AFE01DAF112E52AE4 +:1002E000EF21232323237EE1E61FFE15C25113AF26 +:1002F00012E52AF6217EA7CAFB1235C20113233666 +:1003000000E1C251132B2B7E2BE61FFE02DA3813BD +:10031000CD3814C5477EC6064F78D604B9D23713F8 +:10032000C611B9DA37131A3C12C1D1473A7E20B848 +:10033000CA5613CD1714C9C1D113137D12137C12E1 +:100340001BEBE5D52AEC21197DB4D1E1EBCC1914D6 +:10035000C9D1CD1714C9EBE5D52AEC21197DB4D14B +:10036000E1EBE5CC1714E1E52AEF21444DE10AE683 +:100370001FFE15CA8013030303030AE61FFE15C000 +:10038000D5C5EB2AEC2119EB2322EC213E210605F1 +:10039000BBCA9713D2A013C62105C29013C3B513CD +:1003A00005CAB5133E21CD92007EFE02DAA01322CB +:1003B000EC21C3A0132AEC212BC1D1C579E604CAD4 +:1003C000C91303030303C3CD130B0B0B0B0AE61F67 +:1003D000FE15CAE6130B0A3CBEDAE613D60EBED2F1 +:1003E000E613C1C3F713C13AF221027EC6060B021F +:1003F0002B3AEE21860B02CD1714C927217EDFF898 +:100400001722003208CD215522CC21D9DE081F2227 +:100410000852F1D82157221313F52AF4213E08CDB2 +:1004200092007E2F4F06FF032AEA21090909EB7388 +:100430002372EB1B1B1BF1C9E52AF4217E2E00FE63 +:1004400002FA54142E03FE0CFA54142E06FE17FA68 +:1004500054142E097D211A15CD92003A4822BEDA95 +:100460009014E12B0B0B0A96F26D142F3CD6080367 +:100470000323D5C5A71F57030303030AA7C282148A +:1004800016000AA77AF28A142F3C57C10A82D1C9F2 +:1004900023BEDA1015E10ABEDAB0143AEE21A7F253 +:1004A000A914CDC5140033DEC9CDC5140180DFC940 +:1004B0003AEE21A7F2BE14CDC51401DBDEC9CDC5CD +:1004C0001400D8DEC9EBE3EBC523444DE51AA7C2FF +:1004D000D814232323C3DB142B2B2BC5131A4F1340 +:1004E0001A471B1BE50978B1E1C1CA04152B2B0B78 +:1004F0000B0A0303BE2323C204157EA7CACD1444EE +:100500004DC3CD140B0AE1C1131313EBE3EB2BC95D +:1005100023BEE1DA18150AC97EC9FFFFFFFF80007C +:100520008020004020003E083203222107227EE680 +:100530001FFE15CAA31532EC21FE14C26A153E1522 +:10054000773A0322472F3C4F78FE05F26415FE03ED +:10055000FA59153E0481C35C153E078101FA21CD8D +:100560003811AF02CDB215C39815FE14F27B15FEFB +:10057000130612CA78150613C38715D61B11391630 +:10058000CD3D111AC61B477EE6E0B077E680CA98DB +:100590001506147EE660B0777EE61FFE15CAA31529 +:1005A000CDB215232323233A03223D320322C22E48 +:1005B00015C9E53A0322117A207EE61F121B1B1B88 +:1005C0001BFE14C2CC15010000C3E915FE15C2D7ED +:1005D00015010000C3E9157EE660070707E5213134 +:1005E0001687CD92004E2346E178121B79121BC369 +:1005F00090581B1B2B7E121B2B7E121B3AEC2112D8 +:1006000013E5D5CDC40007D1E11A7713231A77F586 +:100610001313231A773A7422A7C41E1AF1FE04DAC0 +:100620002A16FEF7D22A16C32F16237EF68077E10C +:10063000C900F800FC000400080100030211D121E8 +:100640000130202A3B203E03CD5B16C911DC21017D +:1006500060202A6B203E06CD5B16C93202201AFEAE +:1006600002F8C5FE02CA7318FE04F26F16C1C9C3B0 +:1006700080587DB4CA8C162B3A0220E601CA861631 +:10068000223B20C38916226B20C305170AFE16C21F +:100690000517C5D53A0220E60121D121114E22C20B +:1006A000A81621DC21115322F5CD291878878787D8 +:1006B00047F1F5CABC163E7890C3BF163E808067EE +:1006C000E6082E10CAC9162EC8F1D1C1F503037C65 +:1006D0000203037D020303037DE608218002CAE4CE +:1006E000162180FD7D02037C020303F13E1ACAF34A +:1006F000163E1902C1C5020601CA0217CD521FC318 +:100700000517CD5C1F3A0220E601213E20C21317D7 +:10071000216E207EA7CA201735C22017C1C36518D5 +:100720002B2B2BC10AFE16C8030303030AFE07DAAC +:100730003A17FED0D23A17C34D173E06CD38113EB8 +:100740001602CD06183600233601C3651823237E12 +:10075000A7CA65183E06CD38110AFE103E11CA63BD +:10076000173E100235C265183E16020B0BAF020B86 +:10077000022B2B36002336013A0220E601213020DD +:10078000013E20C28C17216020016E203E16773E6C +:100790001902220020CDF802210003193A5B22A79A +:1007A000CAAA17DB02E608CACC17AF320B20E5CD88 +:1007B0001A1823CDF417E1CD4305E5CD1A184EE103 +:1007C000CD43050EAACD4305CD0618C9AF325B2235 +:1007D0003EFF320B20E5CD1A187E0F0F0F0F4FE1B1 +:1007E000CD4305E5CD1A1823CDF417790F0F0F0F60 +:1007F0004FC3BF177E4FE6F0C07EE60F47C6A04F3F +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.g.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.g.hex new file mode 100644 index 00000000..63b4648e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.g.hex @@ -0,0 +1,129 @@ +:100000005B504C415945525B425554544F4E494EFA +:10001000534552545B434F494E494E534552545BEE +:100020005C5B4D4F52455B434F494E494E534552E1 +:10003000545B5D5B4D4F52455B434F494E53464FBA +:10004000525B5D5B504C415945525B47414D4547C2 +:10005000414D455B4F5645525C5B4F525B5D5B507B +:100060004C41594552535553455B52494748545B9F +:10007000534944455B434F4E54524F4C535B4D499B +:10008000445741595B4D46475E5B434F5E5BDB0126 +:10009000E606FE0447C5CAB708FE02CAE008C1CD9D +:1000A000AE1F3A0720F5CD6200F1473A072090D302 +:1000B00006CA8E08C3AD063A0820D601C178FA9F59 +:1000C000083A0920F64021F408320920DB02E60351 +:1000D00016005F19463A072080320720D1C3C809AD +:1000E0003A0820D602C1FA9F083A0920E6BF21F853 +:1000F00008C3C908FFFFFEFEFEFFFCFE4F57204667 +:10010000AF3207203E0A320520210000224B222276 +:1001100050222249223E55324822AFD303322522B3 +:10012000D301323122CDAF1D21F71E22262231000C +:10013000243E03324522324722325E22AF3209206A +:10014000324E22210000224E22225322CD300BCDEE +:10015000EA0CCD981DCD300B3E0F32F82121000363 +:100160002260223EFD325820CD6200CDD20ECDA5B8 +:1001700006CD2615CDEA1FCD220BD3063A452247E0 +:100180003A4722B0CA2509CDBE09C268092100013B +:10019000226022CD300BCDEA0C2109203E20B6771B +:1001A000CDA506CDF01FCD6200D306CDBE09C2A0FD +:1001B000092109203EFDA677C32509C368092A60E5 +:1001C000222B2260227CB5C931002406803A092006 +:1001D000B0320920210000224B2222502221F71E9A +:1001E0002226223E03324522324722AF324D2232AE +:1001F0005222325C22324E22325322CD300BCDEAD3 +:100200000CCD300B32F821D306CD6200CD6200CD8B +:10021000D20ECDEA1FCD6911CD2615CD3D16CD4CA0 +:1002200016CD220B3ACD21A7C29A0AC3B058E64098 +:10023000C29A0A3AD121FE02F2690A0100103E0870 +:10024000CDD91C210010222822212822222B203E39 +:1002500003320220325B223E403232203E6E323484 +:1002600020CD78172640CD180B214E227EFE02CAE3 +:10027000730A34237EC6012777CDF10CCD6F0B11A5 +:1002800045221AA7C29A0A215C227EE601C29A0A76 +:1002900034EB3421F8213EFDA6773AD821A7C210CD +:1002A0000BC3E058E640C2DC0A3ADC21FE02F2DC75 +:1002B0000A0100103E06CDD91C210010222A22215D +:1002C0002A22225B203E063202203EC03262203EBD +:1002D0006E326420CD78172640CD180B2153227E34 +:1002E000FE02CAE60A34237EC6012777CD470DCD2C +:1002F000DF0B1147221AA7C2100B215C227EE610E9 +:10030000C2100B3E10B677EB3421F8213EF2A677EF +:10031000D306CDE31EC3090AD306CD620025C8C3A8 +:10032000180BA73A482217D22C0BEE2B324822C9C1 +:10033000CD3A0BCD6F0BCDDF0BC9AF320B2032CCDA +:100340002132032232E32132F821322422322522C3 +:10035000322E22322D2221F71E22262221D11E22C8 +:100360004022224222017020117F20CD1204C901B7 +:10037000F92111FD21CD120401CD2111D721CD127A +:10038000043E40322F220630211020110050CDF0C3 +:100390000D21CD2136213A0920E640CAA00B3600B6 +:1003A00021A220221C20CD4B0CAF32CC21CD980CA9 +:1003B000AF3244223A4E22070707072122208677D0 +:1003C000013422113922CD12043A0920E680CAD81C +:1003D0000B3E20323122D301AFD307323322C90181 +:1003E000FE21110222CD120401D82111E221CD12E9 +:1003F000043E403230220640214020113050CDF0E2 +:100400000D21D8213621216521224C20CD7A0C3EA8 +:100410000B32CC21CD980CAF32CC213246223A534C +:1004200022070707072F3C2152208677013A221125 +:100430003F22CD12043A0920E680CA440C3E203205 +:100440002522D303AFD305323222C921805011C3F4 +:10045000200621CD6E0ECD5A0CC93A0920E6400E79 +:1004600000118320CA700CAF0637CD930EC3730CF6 +:10047000CD7C0ECD9C0ECDAA0EC921C25011682193 +:100480000621CD6E0ECD890CC90E02112821CD7C1E +:100490000ECDA30ECDB70EC9E5D5F511CF2121267E +:1004A0002101D6213ACC21A7CAB40C21CB2111DAE3 +:1004B0002101E121AF020B0B02030A0B0B022F4FAC +:1004C00006FF03090909EB7323723A0920E680CA83 +:1004D000DC0C3ACC21A7CC3D16C44C163ACC21C634 +:1004E00001E607320220F1D1E1C9CDF10CCD470D73 +:1004F000C901002411DF3FCDA60DCDD20D3E04323F +:10050000E4212110201170500610CDF00D3A4E223A +:10051000070707074711330EDB02E608F53E00C266 +:10052000230D3D320B20AF32E6213A4F22C6012780 +:10053000CD9B0DF1C23D0D790F0F0F0F4FCDF90D72 +:10054000CD3E1DCDD41DC901102411DF3FCDA60D18 +:10055000CDDB0D3E0432E421214020117050061005 +:10056000CDF00D2110207EFE18CA730D3E187721A4 +:100570001A2077113B0E3A5322070707072F3C47F3 +:10058000AF320B203C32E6213A5422C60127CD9BE4 +:100590000DCDF90DCD811DCDEB1DC94FE6F0C2A5E6 +:1005A0000D3EA0B14FC97B916F7A986723EB6960CC +:1005B00006107AB3C836001B2305C2B20D06103EE2 +:1005C00010CD92007AB3C87BD6105F7ADE0057C395 +:1005D000B20D2100243E10CDE40DC9211F243E0898 +:1005E000CDE40DC911200006DE771905C2E90DC959 +:1005F0001A77132305C2F00DC92112201A80771330 +:1006000023231A7713D5C5CDC40001C1C53E0132DD +:100610005F22CDF802218001193AE621CD9200CD6A +:100620004305AF325F22C1D13AE4213D32E421C219 +:10063000F90DC91C101C461C7C1CB2DC10DC46DC0D +:100640007CDCB2663AF82147FE02CA550EFE0DCA9E +:10065000640EFE0FC0CD751ACA600E3E8032452270 +:1006600078FE0FC0CDF81AC83E80324722C97E12EC +:1006700023137E1223131305C26E0EC9AF0616CDC7 +:10068000930E3E0681060BCD930E3E02810616CDDB +:10069000930EC91213131305C2930EC921272122E9 +:1006A000FC21C921CC21220122C9210722CDC40E5F +:1006B000211722CDC40EC9210F22CDC40E211F2225 +:1006C000CDC40EC906023E15772323232305C2C8D5 +:1006D0000EC9AF32CC213E0232242221CD213ACCA8 +:1006E00021CD9200E5D12323E52323232322E821F2 +:1006F000E13ACC21C601E6073202203ACC21A7011B +:100700004422CA080F0146220AA7CA130F030AA7E8 +:10071000C2160FCD290F3ACC21EE0B32CC213A2450 +:10072000223D322422C2DB0EC91AA7C8E54E234659 +:100730000B0AFE02FA6B0F0BD521072216047E2B43 +:10074000E61FFE15C3105A0ABECA4F0FD2610FC66C +:100750000EBEDA610F2B0B0ABE0323C2610FC3D199 +:1007600057232323232315C23E0FD12AE8217E3CA1 +:1007700077FE38E1CC980CC2CE0FE53ACC21A7C267 +:10078000A90F3ACD2121D7217721D2217EA747CAAF +:10079000CD0F36003AF821E602C2A20F21CD217E0C +:1007A000237721182070C3CD0F3AD82121E2217779 +:1007B00021DD217EA747CACD0F36003AF821E60C8D +:1007C000C2C90F21D8217E237721482070E1E52A74 +:1007D000E8217E2323BEE1CA2C0F4E23460B0B0BD0 +:1007E000702B7103030AE61FE52AE82123C20310D8 +:1007F0007EA723C2F70F3423237E2BBECA730FE1DB +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.h.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.h.hex new file mode 100644 index 00000000..1ffa200a --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/roms/invad2ct.h.hex @@ -0,0 +1,129 @@ +:100000003E00327B22C32503F53E01327A22F1C93C +:10001000F53E02327A223A8E223C328E22F1C327FA +:1000200000F1CD7800FBC9228C22E1E5E5F5E1E3A2 +:10003000D5C5116EFF197CA7F5CD031FCD521ECD7E +:10004000771ECD3B06F1FA5100C1D1F12A8C22FB7B +:10005000C9C1D1F12A8C22C321003E01327B22C3C7 +:1000600088003A8E22FE02DA6F00AF328E22C9AFCC +:10007000328E223E02C35C003A7B22FE00CA8C0014 +:10008000473A7A22B8CA8C00FBC388003E00327B14 +:1000900022C9856FD024C9BA070707075F2100204E +:1000A000E60F577BE6F05F19C9D1E17E4723E5D51E +:1000B000E6E0CAB9003A02204778320220CD980023 +:1000C000220020C9CDA9002A00207E87874F210465 +:1000D0005179CD920056235EEB227522EB235E23ED +:1000E000563E0FCD1D03320320EB2270223A8B22A5 +:1000F000FE01CA2601AF3274223A0320E601CA107B +:100100000106063A0320E602CA0D010604CD6A0183 +:100110003E0ACD1D032A00204EB9CA2A0177218B41 +:10012000223601C3C700AF328B223A0320E640C219 +:100130005201210000392277222A002023F3F9C13D +:10014000D1E109444DE1193B3B3B3BE5C52A772210 +:10015000F9FB06023A03204FE604C2660179060065 +:10016000E610C26601C9CD6A01C9AFD3042A0020D6 +:1001700023237EE607D3027821AB01CD1503EB786C +:1001800007072A75228521B301CD92006E2600193A +:10019000545D2A7522D525C29501CDF8022A752213 +:1001A0003E20954F06002A7022EBC9D301540275F8 +:1001B00002C8026C5A4836241200001C1814100C95 +:1001C000080400463C32281E140A002A241E181275 +:1001D0000C06001AD304DB03A6CADF01327422DB4B +:1001E00003AE7723131AD304DB03A6CAF1013274DA +:1001F00022DB03AE7723131AD304DB03A6CA030260 +:10020000327422DB03AE7723131AD304DB03A6CAAE +:100210001502327422DB03AE7723131AD304DB03F7 +:10022000A6CA2702327422DB03AE7723131AD30443 +:10023000DB03A6CA3902327422DB03B6772313AF7D +:10024000D304DB03A6CA4B02327422DB03AE770968 +:10025000AFD304C91A7713231A7713231A771323FA +:100260001A7713231A7713231A7713231A77132372 +:10027000AFB67709C9CD6F00C30C04A67713231A54 +:10028000D304DB032FA67723231AD304DB032FA683 +:100290007713231AD304DB032FA67713231AD3046F +:1002A000DB032FA67713231AD304DB032FA67713C0 +:1002B000231AD304DB032FA6771323AFD304DB0366 +:1002C0002FA67709AFD304C91A2FA67713231A2FA5 +:1002D000A67713231A2FA67713231A2FA677132393 +:1002E0001A2FA67713231A2FA67713231A2FA67770 +:1002F0001323AF2FA67709C93E02CD1D030F0F0FA1 +:10030000E61F5723237E0F0F0F47E6E0B25F78E624 +:100310001FC62457C9CD92007E23666FC92A0020CC +:10032000CD92007EC9310024DB00E601CA5203C32E +:100330000009000102030405060708090A0B0C0D59 +:100340000E0F100F0E0D0C0B0A090807060504030B +:1003500002010601110000210020D306707EA8CA08 +:100360006503CD2404237CFE40C25A03D3062B7CB4 +:10037000FE1FCA8A037EA8CA7D03CD2404782F7786 +:10038000AECA6C03CD2404C36C03D306237CFE40A9 +:10039000CAA103782FAECA9C03CD2404AF77C38AC9 +:1003A00003780747D257037AB3CAD203F3EBF911A4 +:1003B00000200600210000390E10AF29DAC0032FFB +:1003C00012133E1812130DC2BA0305C2B403FBC3C5 +:1003D0000D04F3310024210C32E521000011340416 +:1003E000010008AF86D306230DC2E40305C2E4036F +:1003F0003CCAFE031AE3EBC5CD4004C1EBE3137C1A +:10040000FE60C2E003E17DFE0CCA0000FBD306C320 +:1004100075027B914F7A984703EB36000B2B78B12E +:10042000C21A04C94F7DE60179C23104B257C33301 +:1004300004B35FC9484746455B5B5B5B5B5B42411E +:10044000D5E5EBCD7704CD8704E1D113C9F51A13B7 +:10045000D5CD77043A0B20E601CC87043A0B20E691 +:1004600001C4990409D1F13DCA6E04C34D043A0B8D +:1004700020E6FE320B20C9E521AD04D6414717170F +:1004800080CD9200EBE1C93E05F501E0FF091A7746 +:10049000F13D09C8F513C38E043E0501E0FFF51ACE +:1004A0007713F1093DC29E042301A000C9781416F8 +:1004B00014787E4A4A4A343C424242247E424242B6 +:1004C0003C7E525252427E121202023C424252740E +:1004D0007E1010107E42427E424232423E02027E36 +:1004E000181824427E404040407E0408047E7E046A +:1004F00018207E3C4242423C7E1212120C3C424288 +:10050000225C7E1212324C244A5A522402027E028B +:10051000023E4040403E06186018063E4078403E8D +:100520004224182442060870080662725A4E460099 +:100530000000000040447E40407452524A4C00008B +:1005400000C0C0790F0F0F0FE5CD72053A0B20FEEA +:1005500001110100F25A051100FFE11979E5CD7290 +:10056000053A0B20FE01110100F26F051100FFE1B9 +:1005700019C9EB21D3050608E60F070707CD92003E +:100580003A0B20A7CAB605FE01CAB605D53E07CD6F +:10059000920011EA210608C506000E087E1FF578B4 +:1005A0001747F10DC29D057812132BC105C297059F +:1005B00021EA21D106083A5F22A7F5F1F57ECAC4E7 +:1005C00005EBAEEB1223E521200019EBE105C2BBE0 +:1005D00005F1C9003E414141413E000000407F42DB +:1005E000000000004245495162400000364949413F +:1005F00041220000007F090A0C08000031494949E6 +:100600004F00000031494949523C000001030509EF +:100610001163000036494949493600000E1929493D +:100620000600000000000000000000001038383E06 +:100630003838103C42A5A5A599423C2105207E4FA3 +:1006400017DA7306237EA7CA5706352B3E82B67784 +:100650003A2522F604D3002105207E17D8DB01E6D7 +:10066000014779E640CA91064FCD9106B9C82334B7 +:100670002334C9357EE60FCA8A061E08BBC2570658 +:100680003A2522E6FBD300C357063E7FA677C35721 +:100690000621052078A7CAA0063E40B677E640C9E5 +:1006A0003EBFA677C93A0720A7CA6507D101002433 +:1006B00011DF3FCD1204CD3E1DCD981DCD811DAF64 +:1006C000320B20DB0247E601CADC0678E602CA3FAD +:1006D000073A0720FE02FA2D07C33F0778E6023AE1 +:1006E0000720CAF706D604F23F07FEFFF2FC06FE1B +:1006F000FEF2A307C32D07FE02F23F0721E33611E6 +:10070000D4073E0DCD4D0421E43911E1073E15CD4E +:100710004D0421C5381119083E12CD4D042166380B +:10072000113E083E11CD4D043E01C3390721C538A5 +:100730001119083E12CD4D04AF320820C38E082196 +:10074000E33611D4073E0DCD4D0421E43911E10704 +:100750003E15CD4D0421053B11F6073E18CD4D0445 +:100760003E02C33907AF320B203A0920E620C821E8 +:100770002536110E083E0BCD4D04AF320B200EACCA +:1007800021C73CCD430521C73B117D083E11CD4D0E +:1007900004AF320B200E1921072CCD43050E80CD5E +:1007A0004305C921E33611D4073E0DCD4D0421E4A4 +:1007B0003911E1073E15CD4D0421C538112B083EF6 +:1007C00013CD4D04216638113E083E11CD4D043E37 +:1007D00001C33907544F5B53544152545B47414D59 +:1007E0004550524553535B5C5B504C415945525BFD +:1007F000425554544F4E4F525B50524553535B5DDC +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/spram.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/sprom.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/sprom.vhd new file mode 100644 index 00000000..a81ac959 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders 2_MiST/rtl/sprom.vhd @@ -0,0 +1,82 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_aclr_a : STRING; + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/README SpaceInvaders.txt b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/README.txt similarity index 100% rename from Arcade_MiST/Midway-Taito 8080 Hardware/README SpaceInvaders.txt rename to Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/README.txt diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/SpaceInvaders.qpf b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/SpaceInvaders.qpf new file mode 100644 index 00000000..4195da4c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/SpaceInvaders.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2013 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.0 Build 162 10/23/2013 SJ Web Edition +# Date created = 21:27:39 November 20, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "21:27:39 November 20, 2017" + +# Revisions + +PROJECT_REVISION = "SpaceInvaders" diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/SpaceInvaders.qsf b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/SpaceInvaders.qsf new file mode 100644 index 00000000..6c2d87d6 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/SpaceInvaders.qsf @@ -0,0 +1,173 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 19:10:47 June 08, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# SpaceInvaders_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/spaceinvaders_mist.sv +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/spaceinvaders_memory.sv +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_global_assignment -name VHDL_FILE rtl/sprom.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/spaceinvaders_overlay.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name QIP_FILE ../../../../common/mist/mist.qip + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name TOP_LEVEL_ENTITY spaceinvaders_mist + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== + set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# -------------------------------- +# start ENTITY(spaceinvaders_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top + set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top + set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(spaceinvaders_mist) +# ------------------------------ \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/SpaceInvaders.sdc b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/SpaceInvaders.sdc new file mode 100644 index 00000000..f91c127c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/SpaceInvaders.sdc @@ -0,0 +1,126 @@ +## Generated SDC file "vectrex_MiST.out.sdc" + +## Copyright (C) 1991-2013 Altera Corporation +## Your use of Altera Corporation's design tools, logic functions +## and other software and tools, and its AMPP partner logic +## functions, and any output files from any of the foregoing +## (including device programming or simulation files), and any +## associated documentation or information are expressly subject +## to the terms and conditions of the Altera Program License +## Subscription Agreement, Altera MegaCore Function License +## Agreement, or other applicable license agreement, including, +## without limitation, that your use is for the sole purpose of +## programming logic devices manufactured by Altera and sold by +## Altera or its authorized distributors. Please refer to the +## applicable agreement for further details. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition" + +## DATE "Sun Jun 24 12:53:00 2018" + +## +## DEVICE "EP3C25E144C8" +## + +# Clock constraints + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty + +# tsu/th constraints + +# tco constraints + +# tpd constraints + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + + + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] + +#************************************************************** +# Create Generated Clock +#************************************************************** + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + +#************************************************************** +# Set Input Delay +#************************************************************** + +set_input_delay -add_delay -clock_fall -clock [get_clocks {CLOCK_27}] 1.000 [get_ports {CLOCK_27}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {CONF_DATA0}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DI}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SCK}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}] + +#************************************************************** +# Set Output Delay +#************************************************************** + +set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_L}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_R}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {LED}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {VGA_*}] + +#************************************************************** +# Set Clock Groups +#************************************************************** + +set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}] + +#************************************************************** +# Set False Path +#************************************************************** + + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + +set_multicycle_path -to {VGA_*[*]} -setup 2 +set_multicycle_path -to {VGA_*[*]} -hold 1 + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/clean.bat b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T8080se.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T8080se.vhd new file mode 100644 index 00000000..65b92d54 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T8080se.vhd @@ -0,0 +1,194 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80_ALU.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80_ALU.vhd new file mode 100644 index 00000000..e09def1e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80_ALU.vhd @@ -0,0 +1,361 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80_MCode.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80_Pack.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80_Reg.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/T80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/dac.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- Refer to Xilinx Application Note XAPP154. +-- +-- This DAC requires an external RC low-pass filter: +-- +-- dac_o 0---XXXXX---+---0 analog audio +-- 3k3 | +-- === 4n7 +-- | +-- GND +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/invaders.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/invaders.vhd new file mode 100644 index 00000000..21326c26 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/invaders.vhd @@ -0,0 +1,271 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaderst is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire : in std_logic; + MoveLeft : in std_logic; + MoveRight : in std_logic; + DIP : in std_logic_vector(8 downto 1); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0); + SoundCtrl5 : out std_logic_vector(5 downto 0); + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic + ); +end invaderst; + +architecture rtl of invaderst is + + component mw8080 + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); + end component; + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(6 downto 2); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; +begin + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; + + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; + if WD_Cnt = 255 then + Rst_n_s_i <= '0'; + end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then + WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then + if Sounds(0) = '1' and Old_S0 = '0' then + WD_Cnt <= WD_Cnt + 1; + end if; + if PortWr(6) = '1' then + WD_Cnt <= (others => '0'); + end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: mw8080 + port map( + Rst_n => Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + Video => Video, + HSync => HSync, + VSync => VSync); + + with AD_i(9 downto 8) select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + S when others; + + GDB0(0) <= DIP(8); -- Unused ? + GDB0(1) <= DIP(7); + GDB0(2) <= DIP(6); -- Unused ? + GDB0(3) <= '1'; -- Unused ? + GDB0(4) <= not Fire; + GDB0(5) <= not MoveLeft; + GDB0(6) <= not MoveRight; + GDB0(7) <= DIP(5); -- Unused ? + + GDB1(0) <= not Coin;-- Active High ! + GDB1(1) <= not Sel2Player; + GDB1(2) <= not Sel1Player; + GDB1(3) <= '1';-- Unused ? + GDB1(4) <= not Fire; + GDB1(5) <= not MoveLeft; + GDB1(6) <= not MoveRight; + GDB1(7) <= '1';-- Unused ? + + GDB2(0) <= DIP(4); -- LSB Lives 3-6 + GDB2(1) <= DIP(3); -- MSB Lives 3-6 + GDB2(2) <= '0';-- Tilt ? + GDB2(3) <= '0';--DIP(2); -- Bonus life at 1000 or 1500 + GDB2(4) <= not Fire; + GDB2(5) <= not MoveLeft; + GDB2(6) <= not MoveRight; + GDB2(7) <= '1';--DIP(1); -- Coin info + + PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; + PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; + PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; + PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; + PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + OldSample := '0'; + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0); + end if; + if PortWr(4) = '1' and OldSample = '0' then + D5(15 downto 8) <= DB; + D5(7 downto 0) <= D5(15 downto 8); + end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0); + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/invaders_audio.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/mw8080.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/mw8080.vhd new file mode 100644 index 00000000..b9a88f96 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/mw8080.vhd @@ -0,0 +1,336 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n, Rd_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/pll.qip b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/pll.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/pll.vhd new file mode 100644 index 00000000..d65b9f9b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/pll.vhd @@ -0,0 +1,350 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire4_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire4_bv(0 DOWNTO 0) <= "0"; + sub_wire4 <= To_stdlogicvector(sub_wire4_bv); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + sub_wire2 <= inclk0; + sub_wire3 <= sub_wire4(0 DOWNTO 0) & sub_wire2; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_UNUSED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire3, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/roms/invaders_e.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/roms/invaders_e.hex new file mode 100644 index 00000000..5ff2818c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/roms/invaders_e.hex @@ -0,0 +1,129 @@ +:1000000020C3C9162184207EA7CA0707237EA7C064 +:100010000601C3FA1821102811A31C0E15CDF308F0 +:100020003E0A326C2001BE1DCD5618DA3718CD4479 +:1000300018C32818CDB10A01CF1DCD5618D8CD4C04 +:1000400018C33A18C50610CD3914C1C9C53A6C2079 +:100050004FCD930AC1C90AFEFF37C86F030A670371 +:100060000A5F030A5703A7C921C22034234ECDD902 +:1000700001473ACA20B8CA98183AC220E6042ACCE6 +:1000800020C288181130001922C72021C520CD3B7D +:100090001AEBC3D3150000003E0132CB20C921501A +:1000A0002011C01B0610CD321A3E023280203EFFC6 +:1000B000327E203E0432C1203A5520E601CAB818EB +:1000C0003A5520E601C2C0182111333E2600CDFF6B +:1000D00008C3B60A3100240600CDE601CD56193E0C +:1000E0000832CF20C3EA0A3A672021E7200FD02345 +:1000F000C906023A82203DC004C93A9420B0329425 +:1001000020D303C9210022C3C301CDD814C397153E +:1001100021E7203A67200FD823C90E1C211E241185 +:10012000E41AC3F30821F820C3311921FC20C3319C +:10013000195E2356237E23666FC3AD090E07210186 +:100140003511A91FC3F3083AEB2021013CC3B209C2 +:1001500021F420C33119CD5C1ACD1A19CD2519CD42 +:100160002B19CD5019CD3C19C34719CDDC19C371DA +:10017000163E01326D20C3E616CDD719CD4719C3FF +:100180003C1932C120C98B19C3D60921032811BEDD +:10019000190E13C3F308000000003A1E20A7C2ACDA +:1001A00019DB01E676D672C03C321E20DB01E67612 +:1001B000FE34C0211B2E11F70B0E09C3F3082813C0 +:1001C0000008130E26020E110F0E110013080E0D5B +:1001D000283E0132E920C9AFC3D319003A9420A0C8 +:1001E000329420D303C9210127CAFA1911601C06D1 +:1001F000104FCD3914793DC2EC190610CDCB147CCB +:10020000FE35C2FA19C9217220461AE680A8C03705 +:10021000C9322B241C16110D0A0807060504030217 +:1002200001342E27221C181513100E0D0C0B090774 +:1002300005FF1A77231305C2321AC95E2356237E9F +:10024000234E2346616FC9C506037C1F677D1F6F60 +:1002500005C24A1A7CE63FF62067C1C92100243650 +:1002600000237CFE40C25F1AC9C5E51AB677132386 +:100270000DC26B1AE101200009C105C2691AC9CD7E +:100280002E09A7C8F53D77CDE619F1210125E60F26 +:10029000C3C50900000000FFB8FE201C109E00200E +:1002A0001C30100B080706000C04260E150411263E +:1002B000260F0B001804112426251B260E11261CC0 +:1002C0000F0B001804111226011413130E0D260E25 +:1002D0000D0B18261B0F0B001804112626011413F2 +:1002E000130E0D262612020E1104241B25260708C4 +:1002F0003F12020E11042612020E1104241C2526A0 +:100300000100001000000000027838783800F80082 +:100310000080008E02FF050C601C203010010000E0 +:10032000000000BB030010901C2830010400FFFFF8 +:100330000000027604000000000004EE1C00000330 +:10034000000000B604000001001D04E21C000003D0 +:100350000000008206000001061D04D01C000003FE +:10036000FF00C01C0000102101003000120000003E +:100370000F0B0018260F0B00180411241B25FC007E +:1003800001FFFF00000020641DD0291802541D0049 +:100390000800060000014000010000109E00201C23 +:1003A000000304781413081A3D68FCFC683D1A0029 +:1003B000000001B898A01B10FF00A01B0000000067 +:1003C0000010000E05000000000007D01CC89B03B1 +:1003D0000000030478140B193A6DFAFA6D3A19000B +:1003E00000000000000000000001000001741F0078 +:1003F0008000000000001C2F00001C2700001C399A +:10040000000039797A6EECFAFAEC6E7A79390000EC +:10041000000000781DBE6C3C3C3C6CBE1D780000AA +:1004200000000000193A6DFAFA6D3A190000000058 +:100430000000387A7F6DECFAFAEC6D7F7A380000B4 +:100440000000000E18BE6D3D3C3D6DBE180E000054 +:10045000000000001A3D68FCFC683D1A0000000026 +:1004600000000F1F1F1F1F7FFF7F1F1F1F1F0F0079 +:10047000000401130307B30F2F032F4904030001E6 +:10048000400805A30A035B0F27270B4B4084114844 +:100490000F993C7E3DBC3E7C99271B1A260F0E0807 +:1004A0000D13122812020E110426000315000D026E +:1004B00004261300010B04280210203013080B132C +:1004C0000008492214814200428114224908000098 +:1004D00044AA1088542210AA442254884A15BE3FC8 +:1004E0005E2504FC0410FC1020FC2080FC8000FE33 +:1004F0000024FE1200FE0048FE900F0B00290000B1 +:100500000107010101040B01060301010B090208A7 +:10051000020B04070A050205040607080A060A0377 +:10052000FF0FFF1FFF3FFF7FFFFFFCFFF8FFF0FF04 +:10053000F0FFF0FFF0FFF0FFF0FFF0FFF8FFFCFF2F +:10054000FFFFFFFFFF7FFF3FFF1FFF0F051015306D +:1005500094979A9D10050510151010053010101075 +:100560000515100500000000040C1E373E7C747E4B +:100570007E747C3E371E0C0400000000002200A5A3 +:100580004008983DB63C361D104862B61D9808429A +:1005900090080000261F1A1B1A1A1B1F1A1D1A1A70 +:1005A00010203060504848484040400F0B0018125F +:1005B0000F0002042626080D1500030411120E2C4C +:1005C000681D0C2C201C0A2C401C082C001CFF0E43 +:1005D0002EE01D0C2EEA1D0A2EF41D082E991CFF7C +:1005E0002738260C181213041118271D1A260F0E6F +:1005F000080D1312271C1A260F0E080D13120000E7 +:10060000001F2444241F0000007F49494936000090 +:10061000003E414141220000007F4141413E000037 +:10062000007F494949410000007F48484840000098 +:10063000003E414145470000007F0808087F000058 +:100640000000417F4100000000020101017E000026 +:10065000007F081422410000007F01010101000019 +:10066000007F2018207F0000007F1008047F00001A +:10067000003E4141413E0000007F484848300000B4 +:10068000003E4145423D0000007F484C4A31000099 +:1006900000324949492600000040407F40400000A8 +:1006A000007E0101017E0000007C0201027C00004E +:1006B000007F020C027F0000006314081463000036 +:1006C0000060100F106000000043454951610000B8 +:1006D000003E4549513E00000000217F010000001E +:1006E0000023454949310000004241495966000054 +:1006F000000C14247F04000000725151514E000080 +:10070000001E29494946000000404748506000004B +:100710000036494949360000003149494A3C000049 +:1007200000081422410000000000412214080000CB +:100730000000000000000000001414141414000055 +:100740000022147F14220000000304780403000038 +:10075000241B260E11261C260F0B0018041112252F +:100760002626281B260F0B0018041126261B2602FE +:100770000E080D2601010000010002010002010027 +:1007800060100F106030181A3D68FCFC683D1A00BC +:10079000080D120411132626020E080D0D2A501FF3 +:1007A0000A2A621F072AE11FFF0211040308132609 +:1007B0000060100F106038193A6DFAFA6D3A19009E +:1007C0000020404D50200000000000FFB8FF801FB7 +:1007D000109700801F000001D022201C10940020E0 +:1007E0001C281C260F0B0018041112261C26020EB2 +:1007F000080D120F14120726000808080808000048 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/roms/invaders_f.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/roms/invaders_f.hex new file mode 100644 index 00000000..4f7acccc --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/roms/invaders_f.hex @@ -0,0 +1,129 @@ +:1000000000000000000000000000000000000000F0 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000000CE +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD +:1004000000CD741400C5E51AD304DB03B6772313BB +:10041000AFD304DB03B677E101200009C105C205B3 +:1004200014C90000CD7414C5E5AF77237723E1012B +:10043000200009C105C22714C9C51A77130120007D +:1004400009C105C23914C900000000000000000005 +:100450000000CD7414C5E51AD304DB032FA677235F +:1004600013AFD304DB032FA677E101200009C105F8 +:10047000C25514C97DE607D302C3471AC5E57E12EB +:1004800013230DC27E14E101200009C105C27C14B2 +:10049000C9CD7414AF326120C5E51AD304DB03F56E +:1004A000A6CAA9143E01326120F1B6772313AFD357 +:1004B00004DB03F5A6CABD143E01326120F1B67714 +:1004C000E101200009C105C29814C9AFC577012018 +:1004D0000009C105C2CC14C93A2520FE05C8FE0298 +:1004E000C03A2920FED847D230153A0220A7C87852 +:1004F000FECED27915C606473A0920FE90D20415E1 +:10050000B8D2301568CD62153A2A2067CD6F152212 +:1005100064203E05322520CD81157EA7CA301536D0 +:1005200000CD5F0ACD3B1ACDD3153E10320320C952 +:100530003E03322520C34A1521032035C02A6420FA +:100540000610CD24143E04322520AF32022006F7D7 +:10055000C3DC19000E00BCD49015BCD0C6100CC36F +:100560005A153A092065CD54154105DE106FC93A78 +:100570000A20CD5415DE1067C93E01328520C345DF +:100580001578070707808080813D6F3A672067C92B +:100590000CC610FA9015C93A0D20A7C2B71521A4B0 +:1005A0003ECDC515D006FE3E01320D207832082022 +:1005B0003A0E20320720C9212425CDC515D0CDF112 +:1005C00018AFC3A91506177EA7C26B162305C2C7AD +:1005D00015C900CD7414E5C5E51AD304DB037723F0 +:1005E00013AFD304DB0377E101200009C105C2D7B3 +:1005F00015E1C9CD11160100377EA7CAFF150C23DE +:1006000005C2F91579328220FE01C0216B20360126 +:10061000C92E003A672067C93A1520FEFFC0211095 +:10062000207E2346B0C03A2520A7C03AEF20A7CAB3 +:1006300052163A2D20A7C24816CDC017E610C83E64 +:1006400001322520322D20C9CDC017E610C0322D31 +:1006500020C921252036012AED20237DFE7EDA6384 +:10066000162E7422ED207E321D20C937C9AFCD8BE6 +:100670001ACD10193600CDCA092311F5201ABE1B58 +:100680002B1ACA8B16D29816C38F16BED298167E16 +:100690001213237E12CD50193ACE20A7CAC91621B3 +:1006A000032811A61A0E14CD930A2525061B3A67B6 +:1006B000200FDAB716061C78CDFF08CDB10ACDE7BA +:1006C000187EA7CAC916C3ED0221182D11A61A0E4D +:1006D0000ACD930ACDB60ACDD609AF32EF20D305A5 +:1006E000CDD119C3890B310024FBAF321520CDD8F1 +:1006F000140604CDFA18CD590AC2EE16CDD7192129 +:100700000127CDFA19AFCD8B1A06FBC36B19CDCAE1 +:1007100009237E11B81C21A11A0E04471AB8D2274A +:100720001723130DC21C177E32CF20C93A2520FE95 +:1007300000C2391706FDC3DC190602C3FA1800000F +:10074000219B2035CC6D173A6820A7CA6D172196DA +:100750002035C02198207ED3053A8220A7CA6D1784 +:100760002B7E2B772B36013E04329B20C93A9820F2 +:10077000E630D305C93A9520A7CAAA1721111A1144 +:10078000211A3A8220BED28E172313C385171A323C +:1007900097202198207EE630477EE60F07FE10C2A4 +:1007A000A4173E01B077AF32952021992035C006BD +:1007B000EFC3DC1906EF2198207EA077D305C9008E +:1007C0003A67200FD2CA17DB01C9DB02C9DB02E698 +:1007D00004C83A9A20A7C03100240604CDD60905E2 +:1007E000C2DC173E01329A20CDD719FB11BC1C2167 +:1007F00016300E04CD930ACDB10AAF329A2032934F +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/roms/invaders_g.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/roms/invaders_g.hex new file mode 100644 index 00000000..44ccade4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/roms/invaders_g.hex @@ -0,0 +1,129 @@ +:10000000AF32C120CDCF013A67200FDA7208CD138D +:1000100002CDCF01CDB100CDD1190620CDFA18CD3A +:100020001816CD0A19CDF315CD88093A8220A7CA32 +:10003000EF09CD0E17CD3509CDD808CD2C17CD59E8 +:100040000ACA49080604CDFA18CD7517D306CD049F +:1000500018C31F0800000011BA1ACDF3080698DB78 +:10006000010F0FDA6D080FDA9807C37F073E01C34F +:100070009B07CD1A02C314083A0820472A0920EB2F +:10008000C386080000003A6720672EFCC921112BA7 +:1000900011701B0E0ECDF3083A67200F3E1C211184 +:1000A00037D4FF083EB032C0203AC020A7C8E604CB +:1000B000C2BC08CDCA09CD3119C3A9080620211C2C +:1000C000273A67200FDACB08211C39CDCB14C3A9FE +:1000D00008DB02E603C603C93A8220FE09D03EFBD4 +:1000E000327E20C93ACE20A7C0211C390620C3CBBE +:1000F000140E031AD5CDFF08D1130DC2F308C91190 +:10010000001EE526006F29292919EBE10608D30610 +:10011000C339143A0920FE78D02A91207DB4C2292F +:10012000092100063E013283202B229120C9CD11E6 +:10013000162EFF7EC9CD10192B2B7EA7C80615DB06 +:1001400002E608CA48090610CDCA09237EB8D8CDF0 +:100150002E09347EF521012524243DC258090610BC +:1001600011601CCD3914F13CCD8B1ACD10192B2BFD +:1001700036003EFF3299200610C3FA1821A01DFE5A +:1001800002D823FE04D823C9CDCA093AF120A7C852 +:10019000AF32F120E52AF220EBE17E8327775F235F +:1001A0007E8A277757237E23666FC3AD097ACDB247 +:1001B000097BD5F50F0F0F0FE60FCDC509F1E60F3F +:1001C000CDC509D1C9C61AC3FF083A67200F21F867 +:1001D00020D821FC20C92102243600237DE61FFE01 +:1001E0001CDAE809110600197CFE40DAD909C9CDEC +:1001F0003C0AAF32E920CDD6093A6720F5CDE401BB +:10020000F13267203A672067E52EFE7EE6073C77ED +:1002100021A21D233DC2130A7EE12EFC772336382E +:100220007C0FDA330A3E21329820CDF501CD041936 +:10023000C30408CDEF01CDC001C30408CD590AC2E3 +:10024000520A3E3032C0203AC020A7C8CD590ACA4F +:10025000470ACD590AC2520AC93A1520FEFFC93AC7 +:10026000EF20A7CA7C0A480608CDFA184178CD7C51 +:10027000097E21F32036002B772B3601216220C91D +:100280003E0232C120D3063ACB20A7CA850AAF323C +:10029000C120C9D51ACDFF08D13E0732C0203AC0CF +:1002A000203DC29E0A130DC2930AC9215020C34BA0 +:1002B000023E40C3D70A3E80C3D70AE1C372003A68 +:1002C000C1200FDABB0A0FDA68180FDAAB0AC921AE +:1002D000142B0E0FC3930A32C0203AC020A7C2DAF3 +:1002E0000AC921C220060CC3321AAFD303D305CDED +:1002F0008219FBCDB10A3AEC20A72117300E04C2B7 +:10030000E80B11FA1CCD930A11AF1DCDCF0ACDB168 +:100310000ACD1518CDB60A3AEC20A7C24A0B1195A2 +:100320001ACDE20ACD800A11B01BCDE20ACD800AB7 +:10033000CDB10A11C91FCDE20ACD800ACDB10A2183 +:10034000B733060ACDCB14CDB60ACDD6093AFF2174 +:10035000A7C25D0BCDD10832FF21CD7F1ACDE401BC +:10036000CDC001CDEF01CD1A023E0132C120CDCF6B +:1003700001CD1816CDF10BD306CD590ACA710BAFBA +:10038000322520CD590AC2830BAF32C120CDB10A2C +:10039000CD88190E0C21112C11901FCDF3083AECC9 +:1003A00020FE00C2AE0B2111333E02CDFF08019C9E +:1003B0001FCD5618CD4C18DB0207DAC30B01A01F66 +:1003C000CD3A18CDB60A3AEC20FE00C2DA0B11D5B0 +:1003D0001FCDE20ACD800ACD9E1821EC207E3CE69E +:1003E0000177CDD609C3DF1811AB1DCD930AC30B1E +:1003F0000BCD0A19C39A19130008130E26020E0F0B +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/roms/invaders_h.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/roms/invaders_h.hex new file mode 100644 index 00000000..60810bae --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/roms/invaders_h.hex @@ -0,0 +1,129 @@ +:10000000000000C3D4180000F5C5D5E5C38C00007E +:10001000F5C5D5E53E8032722021C02035CDCD1703 +:10002000DB010FDA67003AEA20A7CA42003AEB2068 +:10003000FE99CA3E00C6012732EB20CD4719AF32E8 +:10004000EA203AE920A7CA82003AEF20A7C26F004F +:100050003AEB20A7C25D00CDBF0AC382003A9320CD +:10006000A7C28200C365073E0132EA20C33F00CD2C +:1000700040173A3220328020CD0001CD4802CD1306 +:100080000900E1D1C1F1FBC900000000AF327220CC +:100090003AE920A7CA82003AEF20A7C2A5003AC1D8 +:1000A000200FD28200212020CD4B02CD4101C382FE +:1000B00000CD8608E57E23666F220920220B20E111 +:1000C0002B7EFE03C2C8003D320820FEFE3E00C269 +:1000D000D3003C320D20C93E0232FB2132FB22C349 +:1000E000E408000000000000000000000000000024 +:1000F0000000000000000000000000000000000000 +:100100002102207EA7C23815E53A06206F3A672003 +:10011000677EA7E1CA360123237E2346E6FE070752 +:10012000075F160021001C19EB78A7C43B012A0BBE +:10013000200610CDD315AF320020C921300019EBB5 +:10014000C93A6820A7C83A0020A7C03A6720673A92 +:10015000062016023CFE37CCA1016F4605C25401B1 +:10016000320620CD7A0161220B207DFE28DA71193A +:100170007A3204203E01320020C916007D21092078 +:1001800046234EFE0BFA9401DE0B5F78C610477BC8 +:1001900014C3830168A7C85F79C6104F7B3DC39520 +:1001A0000115CACD012106203600234E3600CDD9D7 +:1001B000012105207E3CE60177AF21672066C9005A +:1001C000210021063736012305C2C501C9E1C93E18 +:1001D0000106E0210224C3CC142346237986772329 +:1001E000788677C906C011001B210020C3321A216E +:1001F0004221C3F8012142220E0411201DD5062CF4 +:10020000CD321AD10DC2FD01C93E01C31B023E0110 +:10021000C31402AF114222C31E02AF114221328128 +:10022000200102162106283E04F5C53A8120A7C206 +:100230004202CD691AC1F13DC8D511E00219D1C3FE +:100240002902CD7C14C335022110207EFEFFC8FE9A +:10025000FECA810223464FB079C27702237EA7C22D +:100260008802235E2356E5EBE5216F02E3D5E9E141 +:10027000110C0019C34B020504C27D023D05702B11 +:100280007711100019C34B02352B2BC38102E123D8 +:100290007EFEFFCA3B032335C047AF326820326978 +:1002A000203E30326A207836052335C29B032A1A55 +:1002B000200610CD241421102011101B0610CD3261 +:1002C0001A0600CDDC193A6D20A7C03AEF20A7C866 +:1002D000310024FBCDD719CD2E09A7CA6D16CDE765 +:1002E000187EA7CA2C033ACE20A7CA2C033A67204F +:1002F000F50FDA3203CD0E02CD78087323722B2B63 +:100300007000CDE401F10F3E210600D21203062059 +:100310003E22326720CDB60AAF32112078D3053C99 +:10032000329820CDD609CD7F1AC3F907CD7F1AC3E5 +:100330001708CD0902C3F802000000216820360129 +:10034000237EA7C3B003002B36013A1B20473AEFA8 +:1003500020A7C263033A1D200FDA81030FDA8E0350 +:10036000C36F03CDC0170707DA810307DA8E0321B5 +:100370001820CD3B1ACD471ACD39143E0032122039 +:10038000C978FED9CA6F033C321B20C36F0378FEC5 +:1003900030CA6F033D321B20C36F033CE6013215A8 +:1003A000200707070721701C856F221820C36F03E1 +:1003B000C24A032335C24A03C34603112A20CD068D +:1003C0001AE1D0237EA7C8FE01CAFA03FE02CA0AB8 +:1003D0000423FE03C22A0435CA36047EFE0FC0E59C +:1003E000CD3004CD5214E123342323353523353564 +:1003F00035233608CD3004C300143C773A1B20C6A1 +:1004000008322A20CD3004C30014CD3004D5E5C510 +:10041000CD5214C1E1D13A2C20856F322920CD91E3 +:10042000143A6120A7C8320220C9FE05C8C33604A9 +:10043000212720C33B1ACD3004CD52142125201191 +:10044000251B0607CD321A2A8D202C7DFE63DA5338 +:10045000042E54228D202A8F202C228F203A842093 +:10046000A7C07EE601012902C26E0401E0FE218AD6 +:100470002071232370C9E13A321B3232202A3820FE +:100480007DB4C28A042B223820C91135203EF9CD13 +:1004900050053A46203270203A5620327120CD6302 +:1004A000053A7820A7213520C25B0511301B213089 +:1004B000200610C3321AE13A6E20A7C03A8020FE0F +:1004C00001C01145203EEDCD50053A362032702056 +:1004D0003A5620327120CD63053A7620FE10DAE7D5 +:1004E000043A481B3276203A7820A7214520C25B87 +:1004F0000511401B2140200610CD321A3A82203DC2 +:10050000C208053E01326E202A7620C37E06E11124 +:1005100055203EDBCD50053A46203270203A362039 +:10052000327120CD63053A7620FE15DA34053A584B +:100530001B3276203A7820A7215520C25B05115046 +:100540001B2150200610CD321A2A7620225820C9AD +:10055000327F20217320060BC3321A117320060B41 +:10056000C3321A2173207EE680C2C1053AC120FE43 +:10057000043A6920CAB705A7C82336003A7020A7F5 +:10058000CA8905473ACF20B8D03A7120A7CA960544 +:10059000473ACF20B8D0237EA7CA1B062A76204E22 +:1005A0002300227620CD2F06D0CD7A0179C60767A9 +:1005B0007DD60A6F227B202173207EF6807723343C +:1005C000C9117C20CD061AD0237EE601C244062341 +:1005D00034CD75063A7920C603217F20BEDAE205C4 +:1005E000D60C3279203A7B20473A7E2080327B201D +:1005F000CD6C063A7B20FE15DA12063A6120A7C8B8 +:100600003A7B20FE1EDA1206FE2700D2120697322F +:1006100015203A7320F601327320C93A1B20C60810 +:1006200067CD6F1579FE0CDAA5050E0BC3A5050D78 +:100630003A6720676916057EA737C07DC60B6F1520 +:10064000C23706C9217820357EFE03C26706CD7504 +:100650000621DC1C227920217C2035352B35353EC6 +:1006600006327D20C36C06A7C0C37506217920CD54 +:100670003B1AC39114217920CD3B1AC3521422484E +:1006800020C9E13A8020FE02C02183207EA7CA0F44 +:10069000053A5620A7C20F05237EA7C2AB063A82B1 +:1006A00020FE08DA0F053601CD3C07118A20CD0661 +:1006B0001AD02185207EA7C2D606218A207E232338 +:1006C00086328A20CD3C07218A207EFE28DAF90670 +:1006D000FEE1D2F906C906FECDDC1923357EFE1FE8 +:1006E000CA4B07FE18CA0C07A7C006EF2198207E48 +:1006F000A077E620D305000000CD4207CDCB142122 +:100700008320060ACD5F0706FEC3DC193E0132F1E5 +:10071000202A8D20460E0421501D114C1D1AB8CAE6 +:10072000280723130DC21D077E3287202600682963 +:1007300029292922F220CD4207C3F108CD4207C35F +:100740003914218720CD3B1AC3471A06102198205F +:100750007EB077CD7017217C1D228720C33C071106 +:10076000831BC3321A3E01329320310024FBCD7922 +:1007700019CDD60921133011F31F0E04CDF3083A19 +:10078000EB203D2110280E14C2570811CF1ACDF3CB +:1007900008DB01E604CA7F070699AF32CE203AEBA8 +:1007A00020802732EB20CD471921000022F820229B +:1007B000FC20CD2519CD2B19CDD7192101017C3273 +:1007C000EF2022E72022E520CD5619CDEF01CDF50F +:1007D00001CDD10832FF2132FF22CDD700AF32FE4A +:1007E0002132FE22CDC001CD041921783822FC210E +:1007F00022FC22CDE401CD7F1ACD8D08CDD6090093 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/spaceinvaders_memory.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/spaceinvaders_memory.sv new file mode 100644 index 00000000..cb74d5cf --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/spaceinvaders_memory.sv @@ -0,0 +1,82 @@ + +module spaceinvaders_memory( +input Clock, +input RW_n, +input [15:0]Addr, +input [15:0]Ram_Addr, +output [7:0]Ram_out, +input [7:0]Ram_in, +output [7:0]Rom_out +); + +wire [7:0]rom_data_0; +wire [7:0]rom_data_1; +wire [7:0]rom_data_2; +wire [7:0]rom_data_3; + + + +sprom #( + .init_file("./roms/invaders_h.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_h ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_0) + ); + +sprom #( + .init_file("./roms/invaders_g.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_g ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_1) + ); + +sprom #( + .init_file("./roms/invaders_f.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_f ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_2) + ); + +sprom #( + .init_file("./roms/invaders_e.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_e ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_3) + ); + + +always @(Addr, rom_data_0, rom_data_1, rom_data_2, rom_data_3) begin + Rom_out = 8'b00000000; + case (Addr[13:11]) + 3'b000 : Rom_out = rom_data_0; + 3'b001 : Rom_out = rom_data_1; + 3'b010 : Rom_out = rom_data_2; + 3'b011 : Rom_out = rom_data_3; + default : Rom_out = 8'b00000000; + endcase +end + +spram #( + .addr_width_g(13), + .data_width_g(8)) +u_ram0( + .address(Ram_Addr[12:0]), + .clken(1'b1), + .clock(Clock), + .data(Ram_in), + .wren(~RW_n), + .q(Ram_out) + ); +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/spaceinvaders_mist.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/spaceinvaders_mist.sv new file mode 100644 index 00000000..ad18ca58 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/spaceinvaders_mist.sv @@ -0,0 +1,211 @@ +module spaceinvaders_mist( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Space Inv.;;", + "O2,Rotate Controls,Off,On;", + "O34,Scanlines,Off,25%,50%,75%;", + "O5,Overlay, On, Off;", + "T6,Reset;", + "V,v1.20.",`BUILD_DATE +}; + +assign LED = 1; +assign AUDIO_R = AUDIO_L; + + +wire clk_sys; +wire pll_locked; +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_sys) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0,joystick_1; +wire scandoublerD; +wire ypbpr; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; +wire [7:0] audio; +wire hsync,vsync; +wire hs, vs; +wire r,g,b; + +wire [15:0]RAB; +wire [15:0]AD; +wire [7:0]RDB; +wire [7:0]RWD; +wire [7:0]IB; +wire [5:0]SoundCtrl3; +wire [5:0]SoundCtrl5; +wire Rst_n_s; +wire RWE_n; +wire Video; +wire HSync; +wire VSync; + +invaderst invaderst( + .Rst_n(~(status[0] | status[6] | buttons[1])), + .Clk(clk_sys), + .ENA(), + .Coin(btn_coin), + .Sel1Player(~btn_one_player), + .Sel2Player(~btn_two_players), + .Fire(~m_fire), + .MoveLeft(~m_left), + .MoveRight(~m_right), +// .DIP(dip), + .RDB(RDB), + .IB(IB), + .RWD(RWD), + .RAB(RAB), + .AD(AD), + .SoundCtrl3(SoundCtrl3), + .SoundCtrl5(SoundCtrl5), + .Rst_n_s(Rst_n_s), + .RWE_n(RWE_n), + .Video(Video), + .HSync(HSync), + .VSync(VSync) + ); + +spaceinvaders_memory spaceinvaders_memory ( + .Clock(clk_sys), + .RW_n(RWE_n), + .Addr(AD), + .Ram_Addr(RAB), + .Ram_out(RDB), + .Ram_in(RWD), + .Rom_out(IB) + ); + +invaders_audio invaders_audio ( + .Clk(clk_sys), + .S1(SoundCtrl3), + .S2(SoundCtrl5), + .Aud(audio) + ); + +spaceinvaders_overlay spaceinvaders_overlay ( + .Video(Video), + .Overlay(~status[5]), + .CLK(clk_sys), + .Rst_n_s(Rst_n_s), + .HSync(HSync), + .VSync(VSync), + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs) + ); + +mist_video #(.COLOR_DEPTH(3)) mist_video( + .clk_sys(clk_sys), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r,r}), + .G({g,g,g}), + .B({b,b,b}), + .HSync(hs), + .VSync(vs), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .rotate({1'b0,status[2]}), + .scandoubler_disable(scandoublerD), + .ce_divider(1), + .scanlines(status[4:3]), + .ypbpr(ypbpr) + ); + +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac dac ( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +wire m_up = ~status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_up | joystick_0[3] | joystick_1[3]; +wire m_down = ~status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_down | joystick_0[2] | joystick_1[2]; +wire m_left = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_left | joystick_0[1] | joystick_1[1]; +wire m_right = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_right | joystick_0[0] | joystick_1[0]; +wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; +wire m_bomb = btn_fire2 | joystick_0[5] | joystick_1[5]; +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_left = 0; +reg btn_right = 0; +reg btn_down = 0; +reg btn_up = 0; +reg btn_fire1 = 0; +reg btn_fire2 = 0; +reg btn_fire3 = 0; +reg btn_coin = 0; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h75: btn_up <= key_pressed; // up + 'h72: btn_down <= key_pressed; // down + 'h6B: btn_left <= key_pressed; // left + 'h74: btn_right <= key_pressed; // right + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h14: btn_fire3 <= key_pressed; // ctrl + 'h11: btn_fire2 <= key_pressed; // alt + 'h29: btn_fire1 <= key_pressed; // Space + endcase + end +end + +endmodule diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/spaceinvaders_overlay.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/spaceinvaders_overlay.vhd new file mode 100644 index 00000000..5188f6f0 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/spaceinvaders_overlay.vhd @@ -0,0 +1,127 @@ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + + +entity spaceinvaders_overlay is + port( + Video : in std_logic; + Overlay : in std_logic; + CLK : in std_logic; + Rst_n_s : in std_logic; + HSync : in std_logic; + VSync : in std_logic; + O_VIDEO_R : out std_logic; + O_VIDEO_G : out std_logic; + O_VIDEO_B : out std_logic; + O_HSYNC : out std_logic; + O_VSYNC : out std_logic + ); +end spaceinvaders_overlay; + +architecture rtl of spaceinvaders_overlay is + + signal HCnt : std_logic_vector(11 downto 0); + signal VCnt : std_logic_vector(11 downto 0); + signal HSync_t1 : std_logic; + signal Overlay_G1 : boolean; + signal Overlay_G2 : boolean; + signal Overlay_R1 : boolean; + signal Overlay_G1_VCnt : boolean; + signal VideoRGB : std_logic_vector(2 downto 0); +begin + process (Rst_n_s, Clk) + variable cnt : unsigned(3 downto 0); + begin + if Rst_n_s = '0' then + cnt := "0000"; + elsif Clk'event and Clk = '1' then + if cnt = 9 then + cnt := "0000"; + else + cnt := cnt + 1; + end if; + end if; + end process; + + p_overlay : process(Rst_n_s, Clk) + variable HStart : boolean; + begin + if Rst_n_s = '0' then + HCnt <= (others => '0'); + VCnt <= (others => '0'); + HSync_t1 <= '0'; + Overlay_G1_VCnt <= false; + Overlay_G1 <= false; + Overlay_G2 <= false; + Overlay_R1 <= false; + elsif Clk'event and Clk = '1' then + HSync_t1 <= HSync; + HStart := (HSync_t1 = '0') and (HSync = '1'); + + if HStart then + HCnt <= (others => '0'); + else + HCnt <= HCnt + "1"; + end if; + + if (VSync = '0') then + VCnt <= (others => '0'); + elsif HStart then + VCnt <= VCnt + "1"; + end if; + + if HStart then + if (Vcnt = x"1F") then + Overlay_G1_VCnt <= true; + elsif (Vcnt = x"95") then + Overlay_G1_VCnt <= false; + end if; + end if; + + if (HCnt = x"027") and Overlay_G1_VCnt then + Overlay_G1 <= true; + elsif (HCnt = x"046") then + Overlay_G1 <= false; + end if; + + if (HCnt = x"046") then + Overlay_G2 <= true; + elsif (HCnt = x"0B6") then + Overlay_G2 <= false; + end if; + + if (HCnt = x"1A6") then + Overlay_R1 <= true; + elsif (HCnt = x"1E6") then + Overlay_R1 <= false; + end if; + + end if; + end process; + + p_video_out_comb : process(Video, Overlay_G1, Overlay_G2, Overlay_R1) + begin + if (Video = '0') then + VideoRGB <= "000"; + else + if Overlay_G1 or Overlay_G2 then + VideoRGB <= "010"; + elsif Overlay_R1 then + VideoRGB <= "100"; + else + VideoRGB <= "111"; + end if; + end if; + end process; + + + O_VIDEO_R <= VideoRGB(2) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_G <= VideoRGB(1) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_B <= VideoRGB(0) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_HSYNC <= HSync; + O_VSYNC <= VSync; + + +end; \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/spram.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/sprom.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/sprom.vhd new file mode 100644 index 00000000..a81ac959 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Space Invaders_MiST/rtl/sprom.vhd @@ -0,0 +1,82 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_aclr_a : STRING; + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/README SpaceLaser.txt b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/README.txt similarity index 100% rename from Arcade_MiST/Midway-Taito 8080 Hardware/README SpaceLaser.txt rename to Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/README.txt diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/SpaceLaser.qpf b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/SpaceLaser.qpf new file mode 100644 index 00000000..2dd6eff6 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/SpaceLaser.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2013 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.0 Build 162 10/23/2013 SJ Web Edition +# Date created = 21:27:39 November 20, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "21:27:39 November 20, 2017" + +# Revisions + +PROJECT_REVISION = "SpaceLaser" diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/SpaceLaser.qsf b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/SpaceLaser.qsf new file mode 100644 index 00000000..97a90f38 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/SpaceLaser.qsf @@ -0,0 +1,173 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 13:58:36 June 09, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# SpaceLaser_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/spacelaser_mist.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/spacelaser_memory.sv +set_global_assignment -name VHDL_FILE rtl/spacelaser_overlay.vhd +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name VHDL_FILE rtl/sprom.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/roms/clr.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name QIP_FILE ../../../../common/mist/mist.qip + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name TOP_LEVEL_ENTITY SpaceLaser_mist + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== + set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# ----------------------------- +# start ENTITY(SpaceLaser_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top + set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top + set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(SpaceLaser_mist) +# --------------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/SpaceLaser.sdc b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/SpaceLaser.sdc new file mode 100644 index 00000000..f91c127c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/SpaceLaser.sdc @@ -0,0 +1,126 @@ +## Generated SDC file "vectrex_MiST.out.sdc" + +## Copyright (C) 1991-2013 Altera Corporation +## Your use of Altera Corporation's design tools, logic functions +## and other software and tools, and its AMPP partner logic +## functions, and any output files from any of the foregoing +## (including device programming or simulation files), and any +## associated documentation or information are expressly subject +## to the terms and conditions of the Altera Program License +## Subscription Agreement, Altera MegaCore Function License +## Agreement, or other applicable license agreement, including, +## without limitation, that your use is for the sole purpose of +## programming logic devices manufactured by Altera and sold by +## Altera or its authorized distributors. Please refer to the +## applicable agreement for further details. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition" + +## DATE "Sun Jun 24 12:53:00 2018" + +## +## DEVICE "EP3C25E144C8" +## + +# Clock constraints + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty + +# tsu/th constraints + +# tco constraints + +# tpd constraints + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + + + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] + +#************************************************************** +# Create Generated Clock +#************************************************************** + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + +#************************************************************** +# Set Input Delay +#************************************************************** + +set_input_delay -add_delay -clock_fall -clock [get_clocks {CLOCK_27}] 1.000 [get_ports {CLOCK_27}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {CONF_DATA0}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DI}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SCK}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}] + +#************************************************************** +# Set Output Delay +#************************************************************** + +set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_L}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_R}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {LED}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {VGA_*}] + +#************************************************************** +# Set Clock Groups +#************************************************************** + +set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}] + +#************************************************************** +# Set False Path +#************************************************************** + + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + +set_multicycle_path -to {VGA_*[*]} -setup 2 +set_multicycle_path -to {VGA_*[*]} -hold 1 + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/clean.bat b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T8080se.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T8080se.vhd new file mode 100644 index 00000000..65b92d54 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T8080se.vhd @@ -0,0 +1,194 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80_ALU.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80_ALU.vhd new file mode 100644 index 00000000..e09def1e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80_ALU.vhd @@ -0,0 +1,361 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80_MCode.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80_Pack.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80_Reg.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/T80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/invaders.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/invaders.vhd new file mode 100644 index 00000000..d37537f9 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/invaders.vhd @@ -0,0 +1,245 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaderst is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire : in std_logic; + MoveLeft : in std_logic; + MoveRight : in std_logic; + DIP : in std_logic_vector(8 downto 1); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0); + SoundCtrl5 : out std_logic_vector(5 downto 0); + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + CAB : out std_logic_vector(7 downto 0); + HSync : out std_logic; + VSync : out std_logic + ); +end invaderst; + +architecture rtl of invaderst is + + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(6 downto 2); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; +begin + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; + + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; + if WD_Cnt = 255 then + Rst_n_s_i <= '0'; + end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then + WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then + if Sounds(0) = '1' and Old_S0 = '0' then + WD_Cnt <= WD_Cnt + 1; + end if; + if PortWr(6) = '1' then + WD_Cnt <= (others => '0'); + end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: entity work.mw8080 + port map( + Rst_n => Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + CAB => CAB, + Video => Video, + HSync => HSync, + VSync => VSync); + + with AD_i(9 downto 8) select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + S when others; + + GDB0(0) <= '1';--unknown + GDB0(1) <= '1';--unknown + GDB0(2) <= '1';--unknown + GDB0(3) <= '1';--unknown + GDB0(4) <= '1';--unknown + GDB0(5) <= '1';--unknown + GDB0(6) <= '1';--unknown + GDB0(7) <= '1';--unknown + + GDB1(0) <= not Coin; + GDB1(1) <= not Sel2Player; + GDB1(2) <= not Sel1Player; + GDB1(3) <= '1';--unknown + GDB1(4) <= not Fire; + GDB1(5) <= not MoveLeft; + GDB1(6) <= not MoveRight; + GDB1(7) <= '1';--unknown + + GDB2(0) <= '0';--unknown + GDB2(1) <= '0';--unknown + GDB2(2) <= '0';--unknown + GDB2(3) <= '0';--unknown + GDB2(4) <= not Fire;--player2 + GDB2(5) <= not MoveLeft;--player2 + GDB2(6) <= not MoveRight;--player2 + GDB2(7) <= '1';-- Coinage + + PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; + PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; + PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; + PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; + PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + OldSample := '0'; + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0); + end if; + if PortWr(4) = '1' and OldSample = '0' then + D5(15 downto 8) <= DB; + D5(7 downto 0) <= D5(15 downto 8); + end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0); + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/invaders_audio.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/mw8080.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/mw8080.vhd new file mode 100644 index 00000000..536bb064 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/mw8080.vhd @@ -0,0 +1,336 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + CAB : out std_logic_vector(7 downto 0); + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n, Rd_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + CAB <= std_logic_vector(CntE7(3 downto 0)) & std_logic_vector(CntE5(3 downto 0)); + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/pll.qip b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/pll.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/pll.vhd new file mode 100644 index 00000000..f8d0b139 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/pll.vhd @@ -0,0 +1,382 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + sub_wire2 <= sub_wire0(1); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + c1 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 20, + clk1_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire4, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "20.000000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "ps" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "20" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "20.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK1 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "20" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/clr.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/clr.vhd new file mode 100644 index 00000000..1ebf53de --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/clr.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity clr is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(3 downto 0) +); +end entity; + +architecture prom of clr is + type rom is array(0 to 255) of std_logic_vector(3 downto 0); + signal rom_data: rom := ( + "0101","0111","0001","0011","0100","0110","0110","0010","0010","0101","0101","0010","0010","0001","0011","0010", + "0101","0111","0001","0011","0100","0110","0110","0010","0010","0101","0101","0010","0010","0001","0011","0010", + "0101","0111","0001","0011","0100","0110","0110","0010","0010","0101","0101","0110","0110","0001","0011","0010", + "0010","0010","0001","0011","0100","0110","0110","0010","0010","0101","0101","0110","0110","0001","0011","0010", + "0101","0111","0001","0011","0100","0110","0110","0010","0010","0101","0101","0010","0010","0001","0011","0010", + "0101","0111","0001","0011","0100","0110","0110","0010","0010","0101","0101","0010","0010","0001","0011","0010", + "0010","0010","0001","0011","0100","0110","0110","0010","0010","0101","0101","0110","0110","0001","0011","0010", + "0010","0010","0001","0011","0100","0110","0110","0010","0010","0101","0101","0110","0110","0001","0011","0010", + "0010","0010","0001","0011","0100","0110","0110","0010","0010","0101","0101","0011","0011","0001","0011","0110", + "0010","0010","0001","0011","0100","0110","0110","0010","0010","0101","0101","0011","0011","0001","0011","0110", + "0110","0110","0001","0011","0100","0110","0110","0010","0010","0101","0101","0101","0101","0001","0011","0110", + "0110","0110","0001","0011","0100","0110","0110","0010","0010","0101","0101","0101","0101","0001","0011","0110", + "0010","0010","0001","0011","0100","0110","0110","0010","0010","0101","0101","0011","0011","0001","0011","0110", + "0110","0110","0001","0011","0100","0110","0110","0010","0010","0101","0101","0101","0101","0001","0011","0110", + "0110","0110","0001","0011","0100","0110","0110","0010","0010","0101","0101","0101","0101","0001","0011","0110", + "0110","0110","0001","0011","0100","0110","0110","0010","0010","0101","0101","0101","0101","0001","0011","0110"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/la01.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/la01.hex new file mode 100644 index 00000000..761aac36 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/la01.hex @@ -0,0 +1,129 @@ +:10000000C34000414B412045FBC9203135353848BC +:10001000D306C380003020434E414B4120454F550D +:100020002031353538480D013932383020434E41C2 +:100030004B4120454F552031353538480D01393277 +:100040002100203600237CFE40C2430031C022CD77 +:100050005A01CD6F01CD0004CD401CAF325020328B +:100060005120325A203252203E0932592032582033 +:1000700000FBC37000454F552031353538480D0120 +:10008000CD990FC3BC00211E20347E0FDA9800CD1D +:10009000D700CDE100C39E00CDE100CDD700CDD289 +:1000A00006CDEE0BCD0903CD7F01CDF80A3A5020E5 +:1000B000A7CC340ACD5907CD8007FBC92147207E44 +:1000C000A7CA001435CACB00C30014214E207EE617 +:1000D000EF77D303C30014CD1104CD1406CD65060C +:1000E000C9CDA707CD8809CDD90900C9487802E054 +:1000F00002504802B002583002A002606002C802FA +:100100006828029802704802E8027820027802808B +:10011000A802B8028840028802905802B80298905B +:1001200002E802A07002B802A85002E002B0300259 +:100130009002007E183C66663C187E000018181875 +:100140003C247E7E180000925428C6285492000059 +:100150000000000000000000000021002111EC0060 +:100160001A7713237DFE47C26001AF32C021C92137 +:1001700000212281213E07328A21AF328B21C93AE8 +:10018000C021A7CA9E013DCA900132C021C39E0171 +:10019000AF32C0213A4E20E6F7D303324E202A81F7 +:1001A000217E328321232284217E328621232287CD +:1001B000217E328921218B21343A8321A7C2E0019B +:1001C0001105002A8121197DFE46C2D0012100219E +:1001D0002281213A8A21218B21BEC29E01AF77C99B +:1001E0003A8321E60F328E21AF328C21328D213AB3 +:1001F0008621A7C22F02218D2134218C21347EFE3D +:1002000002C214023A8D21FE02C211022A8121AFDC +:1002100077C3C0012A842123237E328621228421B0 +:100220002A872123237E328921228721C3EF013AA5 +:100230008921FE01CA3D02DA5502C35E0221460150 +:10024000228F213A4E20F608D303324E203E0A3246 +:10025000C021C37402215001228F21C374023A8E3F +:1002600021A7C26E02213201228F21C37402213CD8 +:1002700001228F21AF3291213A8E21A7C28502CD72 +:100280008B02C3BB02CD8B02C3EA023A83210F0F5C +:100290000FE61F4F06203A86216F260029292929BB +:1002A0002909EB2A8F21EB0120001A7713093A91D3 +:1002B000213C329121FE0AC2AA02C93A8921FE01DB +:1002C000CADA02DAE2022A84217EFEFFC2D5023EA9 +:1002D0001877C3FA013C77C3FA012A8721AF77C3A5 +:1002E000FA012A8421AF77C3FA013A8921FE01CAB3 +:1002F000DA02DAE2022A84217EFE16C204033EFFFD +:1003000077C3FA013D77C3FA013A0D20A7C218035B +:100310003A2C20A7C22F03C921062022A0212107A1 +:100320002022A221CD3E03AF320D20322C20C92144 +:10033000292022A021212A2022A221C324032AA08D +:10034000217E3CE6F8472100211105000E0E0D7EAE +:10035000B8CA5B031979A7C24E03C901140222A4CB +:10036000212AA2217ED60A2AA42123BECA7D0323E4 +:100370002305C26B0306023C0DC26703C93E01237D +:1003800077C9C3BB02CD8B02C3EA023A83210F0FA8 +:100390000FE61F4F06203A86216F260029292929BA +:1003A0002909EB2A8F21EB0120001A7713093A91D2 +:1003B000213C329121FE0AC2AA02C93A8921FE01DA +:1003C000CADA02DAE2022A84217EFEFFC2D5023EA8 +:1003D0001877C3FA013C77C3FA012A8721AF77C3A4 +:1003E000FA012A8421AF77C3FA013A8921FE01CAB2 +:1003F000DA02DAE2022A84217EFE16C204033EFFFC +:10040000065021002011700E1A77132305C208042C +:10041000C93A0C20A7C03A0020A7C265053A0220BD +:10042000A7C207053A0120A7C270043A5020A7CA04 +:10043000D9043A1420A7C0DB01E610CA03053A3BF1 +:1004400020A7C207052F323B20AF323820CD040C45 +:100450003A0820FE05DA07053E01320120CDFF06ED +:100460003A0A20C6073207203E00320520323320E8 +:100470003A05203C320520CD200ACD5A052A062017 +:10048000EBCDAD063A30204F160F3A05205F3A0803 +:1004900020BBDAF6043E26BBDAF6047AA6C249058A +:1004A000E5C5012000097EA7C2CF0401C0FF097E77 +:1004B000A7C2CF04C1E17AB6770DCA5A05CD200A8A +:1004C0003A05203C3205200FD2D40423C38804C14E +:1004D000E1C3490516F0C38A043E013236202138B3 +:1004E000207EA7C249042139207EFE0100CA2B05C7 +:1004F000D23A05C319053A05203D320520CD2A0A16 +:10050000C34F05AF323B203A5020A7CAE604DB01B7 +:100510000707DA2B0507DA3A052A0920EBCDAD06E5 +:10052000EB2A1520EB060FCDC406C93A0A20FEE0DF +:10053000CA19053C320A20C319053A0A20FE30CAFE +:1005400019053D320A20C319057AB677320B203ED1 +:1005500001320C203A32203219203A05208787C612 +:1005600037320620C93A03203D320320A7C03E059A +:10057000320320CD43073A04203D320420A7CAA00D +:10058000053A10203CE601321020070707072A151C +:1005900020856FEB2A0920EBE5CDAD06D1C32505FB +:1005A0003A5020A7CAE105CD4E073A1A203D321A2B +:1005B00020F5CD0711F1CACF053A5020A7CAE105B1 +:1005C000CD740ACD5A01CD581531C022C370002F09 +:1005D000321D203257203E12325820CDB60ACD832C +:1005E000132150203600233600CD4E07AF320122B2 +:1005F000C3C0053A5020A7C82A20203A24208527C6 +:100600006F3A25208C2767222420210000222020F9 +:10061000CD5510C93A0B20A7C83A0520FE25DA416E +:10062000063E013214203E0A3203203E16320420D8 +:1006300021300E2217203E01321020322120C35ECD +:1006400006320D2001070921500E3A0520B8DA5A6A +:100650000623040404040DC24D067E322020AF326E +:100660000B20C3F3053A0C20A7C83A19203D3219D4 +:1006700020A7C02A0620EBCDAD06AF3A0520471FC4 +:10068000CE0036002B3DC28206320C20320120CD36 +:1006900038073A082090320820AF320F203A332032 +:1006A0002FC69B473A0E208027320E20C926006AAB +:1006B0002929292929010020097B0F0F0FE61F0690 +:1006C000004F09C91A7713C501200009C105C2C42A +:1006D00006C93A2D203D322D20C03A3120322D203E +:1006E0003A0820FE64CA12073C3208203A0E20C69F +:1006F0000127320E20DA0A07AF320F20C30F073A64 +:100700004E20F601324E20D303C93E01320F20CDD8 +:10071000BF0F3A2B20FE64C83C322B203A2E20C655 +:100720000127322E20DA2F07AF322F20C334073EA5 +:1007300001322F20000000C93A4E20E6FE324E2042 +:10074000D303C93A4E20F604324E20D303C93A4EA1 +:1007500020E6FB324E20D303C93A4520A7C03A25F4 +:1007600020FE05D8211A2034CD07113A4E20F6106C +:10077000324E20D3033E803247203E01324520C90D +:100780003A4620A7C03A2720FE05D8211B2034CDA9 +:100790001A113A4E20F610324E20D3033E803247D3 +:1007A000203E01324620C93A2820A7C03A1420A78B +:1007B000C205093A0120A7C294083A0220A7C20341 +:1007C000083A0020A7C03A3620A7C27908DB02E623 +:1007D00010CA90083A3C20A7C294082F323C20AFA0 +:1007E000324B223A2B20FE05DA94083E01320220D9 +:1007F000CDFF063A1320C607322A203E00320520DC +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/la02.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/la02.hex new file mode 100644 index 00000000..37b1d86a --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/la02.hex @@ -0,0 +1,129 @@ +:100000003233203A05203C320520CD200ACDF708B6 +:100010002A2920EBCDAD063A30204F16F03A0520C4 +:100020005F3A2B20BBDA6C083E26BBDA6C087AA656 +:10003000C2E608E5C5012000097EA7C2620801C02A +:10004000FF097EA7C26208C1E17AB6770DCAF70838 +:10005000CD200A3A05203C3205200FD267082BC379 +:100060001B08C1E1C3E608160FC31D083A05203D71 +:10007000320520CD2A0AC3EC08214B227EA7C2DF1D +:10008000073A4C22FE0100CAB808D2CF08C3A6081E +:10009000AF323C203A3620A7C28108DB020707DADC +:1000A000CF0807DAB8082A1220EBCDAD06EB2A17E5 +:1000B00020EB060FCDC406C93A1320FEE0CAC708DC +:1000C0003C321320C3A6083EFF324C22C3A6083A96 +:1000D0001320FE30CADE083D321320C3A6083E01BD +:1000E000324C22C3A6087AB677321F203E0132284E +:1000F000203A32203219203A052087872FC601C6C0 +:10010000C8322920C93A03203D320320A7C03E054A +:10011000320320CD43073A04203D320420A7CA40D1 +:10012000093A10203CE601321020070707072A177A +:1001300020856FEB2A1220EBE5CDAD06D1C3B208C6 +:100140003A3620A7C25909CD4E073A1B203D321B33 +:1001500020F5CD1A11F1CA5F09CD4E07C3B905C309 +:10016000CF053A5020A7C83A3620A7C02A22203A05 +:10017000262085276F3A27208C27672226202100FA +:1001800000222220CDAE10C93A1F20A7C83A052070 +:10019000FE25DAB5093E013200203E0A3203203E38 +:1001A0001632042021100E2215203E01321020327A +:1001B0002320C3D209322C2001070921500E3A0511 +:1001C00020B8DACE0923040404040DC2C1097E322A +:1001D0002220AF321F20C362093A2820A7C83A194B +:1001E000203D321920C02A2920EBCDAD06AF3A05BB +:1001F00020471FCE003600233DC2F50932282032A9 +:100200000220CD38073A2B2090322B203A33202F72 +:10021000C69B473A2E208027322E20AF322F20C98E +:100220003A3320C60127323320C93A3320C69927F2 +:10023000323320C93A0820C34B0A21372035C03653 +:10024000200FDA590A21392036FFC93A0820FE3832 +:10025000DA3A0A3E01323820C92139203601C92153 +:1002600000002224202226202245203A8A0E321A1B +:1002700020321B2021002011700E1A7713237DFEDF +:100280001ACAA10AFE24CAA80AFE34CAAF0A7DFE11 +:1002900040C27A0A3A3620A7CAA00A3E24321B205E +:1002A000C92E1C1E8CC37A0A2E281E98C37A0A2EC9 +:1002B000371EA7C37A0A3E0232A0212A2420E5C1B4 +:1002C0002A26207CB8CACE0ADAD60AC3DB0A7DB950 +:1002D000DAD60AC3DB0AC5D1C3DD0AE5D13AA021CB +:1002E0003D32A021CAEF0A2A3420424BC3C30A7A06 +:1002F0003235207B323420C93A4D22E601C2820BCE +:10030000CD610C3A3422A7CA630B3A3222A7CA6ED7 +:100310000B3A4A22A7C2380B213C227EA7C27E0B91 +:100320003A4322210A2086E67F323C220FDA5A0B1A +:100330003A5E0C2F3C324C223A3622A7214A227ECA +:10034000CA490BF60177C3F70CE6FE773A4122E67D +:100350000F323622C3F70CC3450B3A5E0C324C22E7 +:10036000C3380B3A2B20FE30D27C0CC3180B3A401A +:1003700022E60F3232223E01324B22C3F70C35C344 +:10038000F70C213C2235C2970B34214D227EE6FE2C +:10039000772BAF77C3000B21332235C2AB0B360866 +:1003A000CD240C21322235F2AB0B3421352235C25B +:1003B000BF0B3607CD240C21342235F2BF0B34217C +:1003C000372235C2D30B3608CD240C21362235F224 +:1003D000D30B3421312235C2E90B3607CD240C2151 +:1003E000302235C2E90BC3140D214F2234C9060750 +:1003F0002147227E172B7E177705C2F50B21472256 +:100400007E1777C9060821590C1147227E122B1B33 +:1004100005C20C0C3E023233223E053235223E012B +:10042000323622C93A2520FE01DA510C35FE02DAB5 +:10043000510C35FE04DA510C35FE10DA510C35FE44 +:1004400020DA510C35FE40DA510C35FE80DA510CC1 +:1004500035C9D44B8CADB5195DE60205010001002C +:10046000023A0A2021132096213F22DA730C772BBF +:10047000AF77C92F3C772B3EFFC3710CDB01E64001 +:10048000C2900CDB01E620C29B0CCDD00CC3E20C69 +:100490003A3E22E680C2DF0CC3A60C3A3E22E6803A +:1004A000C2A60CC3DF0C3A3F22A7CAEC0C3A3E228C +:1004B000E680C2CB0C3E01324C22214C2277CDD0BB +:1004C0000C3A3F22BEDAEC0CC3F70C3EFFC3B70C6C +:1004D000213D2236003A4F22E60786323D22C9CD21 +:1004E000D00C3A3F22213D2296D2A60C3A4122E678 +:1004F0000F323422C3760B214922360FCD240C3A19 +:100500004F22E60FBE00DA970B2101207EA7C21F03 +:100510000DC3970B3A4422E60F323022C3E90B2178 +:100520003F227EFE09D2970B2B7EA7214C2236015B +:10053000C2350D36FF214D227EF601773A4522E67F +:100540000FC60A323C22C3970B0685050B094D5591 +:100550004003060C8F2D511189041512450DC50459 +:10056000A340A14E2008E21925160D192606040500 +:10057000A209515BC5098D05250540449A04010374 +:10058000870B712114002503A79D0309C209633657 +:10059000E102C40D809003840D87880955512E0017 +:1005A000821098C84904260C078BCC0860130709F1 +:1005B000898239435B0530029D808F4283180C4D40 +:1005C00055186048000E938D869480CA70188A046E +:1005D000C90052603E00C84A8982FF80481C8AAC2C +:1005E0004D028804410BDC0B06126DA0800E4F08F3 +:1005F00081001ACACD121D8A62C81C082501454D0A +:10060000001F070F0E153FE53F150E0F071F004A8D +:100610001184404B0B27270F5B030AA305084000FA +:10062000000401130307A30F2F032F4904030C0831 +:1006300000C02092F4C0F4F0CDE0C0C880200000DB +:100640000210A0C550C0DAF0E4E4D0D2022188152F +:1006500001020304050607010011E0170423202905 +:1006600000F8E0F070A8FCA7FCA870F0E0F80082A9 +:10067000000000000000000000303000000000001A +:100680000000C8E000000E600E0005050500000037 +:10069000000000000000000000C8E00000060000AC +:1006A0000403080000000000000025092AC8081CF7 +:1006B000640414041C000000E70546703F4000027B +:1006C0008D086000169064650E210500892E410D8D +:1006D000860F27078B0B2A297C010D03040005498F +:1006E0003C0810414400960B4512470910082C04A1 +:1006F0006A004723690185003F08892BCF04021255 +:10070000AF320122C30C0FAF3C320122AF02CD4405 +:100710000F02CD440F02CD440F210022868686862B +:10072000866F26003A01221E00BBC2330F112D1125 +:10073000C3360F11FF111916057E0223CD440F1584 +:10074000C2390FC9E521200009444DE1C9D11A473A +:10075000131A4F131A13D516FFBACA760F1630BAEA +:10076000C26C0F21000109444DC3720F320022CD2B +:100770000C0FD1C3540FE1E93A0222E60F320022F6 +:10078000011E3DCD000F3A0222E6F00F0F0F0F328F +:100790000022011E3CCD000FC9DB01E601CABA0FE1 +:1007A0003A032247AFB8C2B90F3A02223C273202BD +:1007B00022CD780FAF3C320322C9AF320322C93AAF +:1007C0000E20E60F320022011C37CD000F01032C52 +:1007D000CD070F3A0E20E6F00F0F0F0F3200220167 +:1007E0001C36CD000F01032DCD070F3A0F20FE0060 +:1007F000CAF80F3E01C3FA0F3E24320022011C3515 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/la03.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/la03.hex new file mode 100644 index 00000000..3d5b3e4a --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/la03.hex @@ -0,0 +1,129 @@ +:10000000CD000F01032ECD070FC93A2E20E60F3287 +:100010000022011B37CD000F01042CCD070F3A2E13 +:1000200020E6F00F0F0F0F320022011B36CD000F1C +:1000300001042DCD070F3A2F20FE00CA43103E01C8 +:10004000C345103E24320022011B35CD000F0104B0 +:100050002ECD070FC93A2520E6F00F0F0F0F320003 +:1000600022011C2ECD000F010335CD070F3A2520AC +:10007000E60F320022011C2FCD000F010334CD0703 +:100080000F3A2420E6F00F0F0F0F320022011C3030 +:10009000CD000F010333CD070F3A2420E60F3200C5 +:1000A00022011C31CD000F010332CD070FC93A27C1 +:1000B00020E6F00F0F0F0F320022011B2ECD000F94 +:1000C000010435CD070F3A2720E60F320022011B2D +:1000D0002FCD000F010434CD070F3A2620E6F00F94 +:1000E0000F0F0F320022011B30CD000F010433CD62 +:1000F000070F3A2620E60F320022011B31CD000FF8 +:10010000010432CD070FC9011C3C3A1A20320022EB +:10011000CD000F010327CD070FC9011B3C3A1B205F +:10012000320022CD000F010427CD070FC93E414107 +:10013000413E00217F010031434549312241494977 +:10014000360C14247F0479494949463E49494926D9 +:1001500040474850303649494936304949493E1FA1 +:100160002444241F7F494949363E414141227F4171 +:1001700041221C7F494949417F484848403E414906 +:10018000492F7F0808087F00417F41000201417E1E +:10019000403F081422417F010101017F2018207F88 +:1001A0007F1008047F3E4141413E7F484848303E31 +:1001B0004145423D7F484C4A3132494949264040F9 +:1001C0007F40407E0101017E7C0201027C7E0106AF +:1001D000017E631408146360100F10604345495199 +:1001E0006100000000000408040800081422410017 +:1001F000004122140822147F142214141414140031 +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000000CE +:10023000001F2444241F7F494949363E4141412241 +:100240007F4141221C7F494949417F484848403EFF +:100250004149492F7F0808087F00417F4100020182 +:10026000417E403F081422417F010101017F201897 +:10027000207F7F1008047F3E4141413E7F4848482F +:10028000303E4145423D7F484C4A3132494949263A +:1002900040407F40407E0101017E7C0201027C7E65 +:1002A0000106017E22147F142260100F10600000EE +:1002B00003030000000000003E00320122CD4D0F7C +:1002C000261E11121C0C181B0E30000000000030FE +:1002D000300C1B0E0D121D300000FFCD4D0F2E1DDA +:1002E0001C0C181B0E300F1E0E15301C111219FF9E +:1002F000CD4D0F261C2619150A220E1B27000000C3 +:10030000000030303000003030303000FFCD4D0F75 +:10031000261B3030303030303030303030303030FC +:10032000303030303030303030FF3E01320122CDBD +:100330004D0F2E0230211D0A121D18300C181B19EA +:10034000232130FFCD4D0F27033030303030303097 +:10035000303030303030303030303030303030309D +:10036000FFCD4D0F27043030303030303030211C7D +:10037000190A0C0E30150A1C0E1B213030FFAF324B +:100380000122C93A3520E6F00F0F0F0F320022018B +:100390001E2ECD000F3A3520E60F320022011E2F0F +:1003A000CD000F3A3420E6F00F0F0F0F320022017C +:1003B0001E30CD000F3A3420E60F320022011E31EC +:1003C000CD000FC90D1231363536202053484C442C +:1003D0002032314134480D123136363020204C481D +:1003E0004C442032314132480D0F31363634202012 +:1003F0004D4F5620412C4D0D0F31363638202053AD +:100400003A5720A7C27B153A5020E601C286003A2F +:100410000222E6FFC232143A5120FE00CA09163AFF +:100420005120FE02C28600CD62153E03325120C328 +:100430008600DB02E680C2BE143A5520E601C249BE +:1004400014CD17153E01325520DB01E604CA6614AF +:100450003A022206998027320222AF321B203E0147 +:10046000323620C38B14DB01E602C8DB02E680C211 +:100470007A143A02220699C382143A02223DC83CF9 +:1004800006988027320222AF323620AF3252203215 +:100490005C2032552032CC213C325020325B20CDC2 +:1004A0004B15CD481CCD5F0ACD8313CD780FCD07FA +:1004B00011CD1A113E20324E20D303C386003A5587 +:1004C00020A7C2D014CDEB143E01325520C34914ED +:1004D0003A0222FE01CA49143A5520FE01C24914CB +:1004E000CD17153E02325520C34914CD6215AF32E7 +:1004F0000122CD4D0F3014191E1C11FFCD4D0F28B8 +:1005000011303030281C1D0A1B1D300B1E1D1D18FC +:100510001728303030FFC9AF320122DB02E680C23B +:100520002F15CD6215CD4D0F3014191E1C11FFCDA6 +:100530004D0F281124242424281C1D0A1B1D240BC4 +:100540001E1D1D181728242424FFC93E4021002405 +:10055000360023BCC25015C93A1A20A7C83A1B203E +:10056000A7C8110B002106243600237DE61FFE1BC1 +:10057000C26815197CFE40C26815C93A58203D3240 +:100580005820C03A5A20FE01C29D15AF325A20327F +:100590005120324E20D303C620325820C9FE00C25B +:1005A000BE153A5920A7CABE153A59203D325920E6 +:1005B000C2C8153E01325A203E30325820C9AF32EF +:1005C00057203E09325920C93D4787805F160021D8 +:1005D000F115197E2332002246230E08E5CD000FC7 +:1005E000E1460E170000003E09325820AF320122CA +:1005F000C91B362D0E352E1F342F1833300E3033D5 +:10060000162F340A2E35102D363A5220FE00CA78A5 +:10061000183A5B203D325B20C03A5220FE01C239BD +:1006200016CD6215CD4D0F301619150A22FF3E204A +:10063000325B203E02325220C9FE02C25616CD8CD9 +:1006400017A7CA4B163E09325B20C93E20325B20F9 +:100650003E03325220C9FE03C2AE16CD4D0F280F05 +:10066000281C0C181B0E300A0D1F0A170C0E301D0B +:100670000A0B150E28FF3E0A325F20113201010CD1 +:100680002ACD64183E0F325F2011000E01CA29CD19 +:100690006418010C2C3E29320022CD000F010A2CD7 +:1006A000CD000F3E20325B203E04325220C9FE04B2 +:1006B000C2CB16CD8C17A7C2C5163E20325B203E9A +:1006C00005325220C93E09325B20C9FE05C2E81638 +:1006D000CD8C17A7C2E2163E60325B203E06325236 +:1006E00020C93E09325B20C9FE06C20C17CD621537 +:1006F000CD4D0F2C1512171C0E1B1D300C18121788 +:10070000FF3E60325B203E07325220C9FE07C229FD +:1007100017CD8C17A7C223173E20325B203E08322C +:100720005220C93E09325B20C9FE08C24617CD8C53 +:1007300017A7C240173E20325B203E09325220C923 +:100740003E09325B20C9FE09C27C17CD8C17A7C2B7 +:1007500076173A5C20A7CA6B17DB02E680C27617D1 +:100760003A5C20C60B325C20C376173E40325B20D9 +:100770003E0A325220C93E09325B20C9AF325220B4 +:10078000325C203E02325120325B20C921ED171627 +:10079000003A5C205F197EFEFFCAEA17FEFECAAC73 +:1007A00017473A5C203C325C20C3C017237E325E80 +:1007B00020237E325D2023463A5C20C604325C2032 +:1007C000783200222A5D20444D24225D20CD000F86 +:1007D00021ED1716003A5C205F197EFEFECAE8176D +:1007E000FEFFCAEA173EFFC9AFC9C3501CFE2C1357 +:1007F0001C190A0C0E24150A1C0E1BFE2E0C0100DF +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/la04.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/la04.hex new file mode 100644 index 00000000..acef86ea --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/roms/la04.hex @@ -0,0 +1,129 @@ +:1000000025070024191812171D1CFE2E0A010000D6 +:10001000002424191812171D1CFE2A112618171562 +:100020002224012419150A220E1B2724FE290E283A +:1000300028282828240109080024282828282824DA +:10004000FE290B281D0A121D18240C181B19181B39 +:100050000A1D121817282424FFFE340B01240C1843 +:10006000121724FF1A023A5F203DC8325F20132185 +:10007000200009444DC364183ACC21A7CA88183D12 +:10008000CA76193DCA7619C9110B0021062436001B +:10009000237DE61FFE1BC28E18197CFE40C28E18FF +:1000A0003E0132CC213E5432B0213EC832B121AFA4 +:1000B00032BF21C3C8183E5532B0213EC932B121EA +:1000C000AF32BF21C3C818C921D81922B2212AB220 +:1000D000217EFE00CAC61BFE07CAB01932B5212A0E +:1000E000B2212322B2217E32B6213AB621A7CACE4E +:1000F000193D32B6213AB52121B021FE00CA23199B +:10010000FE01CA2919FE02CA2F19FE03CA3319FEBD +:1001100004CA3719FE05CA3C19FE09CA4119FE0A6C +:10012000CA4719342334C34D19352335C34D193407 +:10013000C34D1935C34D192334C34D192335C34D50 +:1001400019352334C34D19342335C34D193ACC2105 +:10015000FE02CA6419003ABF21FE02C26F19AF3213 +:10016000BF21FBC93ABF21FE60C26F19C35E193CB3 +:1001700032BF21C376193AB0216F260029292929D7 +:1001800029010020093AB1210F0F0F57E61F060081 +:100190004F097AE6E00F0F0F0F0F4FA7CAA9193EBC +:1001A00001070DC2A119C3AB193E01B677C3EA1806 +:1001B0002AB221237E4F237E572322B2213AB02137 +:1001C0008132B0213AB1218232B121C3CE182AB294 +:1001D000212322B221C3CE180028021C00100308DC +:1001E0000108030C0020030807FCD80220001803B4 +:1001F00008011003180108071414020C0004030C72 +:100200000104070C0C020C0004030C01040710008D +:1002100002040008030401080708000204000803A0 +:1002200004010807F8E002080008020401040204BF +:10023000000803080004030801040308010402087D +:100240000108071800021800100308010C03100130 +:100250000407080802040008030401080708000254 +:10026000040008030401080710F802100028032006 +:10027000011002080008021001180308010807987D +:10028000E005040204051402040414020404040337 +:100290000C070CF80510020A040303060403020607 +:1002A00004040306040302060403030A070D000501 +:1002B00010020804030304040D030407D0E0030242 +:1002C000010405040A0402020904040400040704EA +:1002D000040514020C0414030C0704FC050C0204AE +:1002E000040C0304070C040514020C040C0308049A +:1002F0000402080404030C0704F4050402040404C3 +:100300000304070C080A04050401040202000404A3 +:100310000409040302070C080504020C0506030C7B +:100320000504020C0506030C050402100418031052 +:1003300007140005180210041803100704FC051028 +:10034000020804100308071004050C020C0508033A +:100350000C050402100410030C0404020C04040332 +:10036000100714F60504020404040304070C0A0130 +:10037000040504000405140204041803040708001B +:100380000504020C0506030C0504020C0506030C0B +:1003900005040210041803100714000504020C05DC +:1003A00006030C0504020C0506030C0504021004E8 +:1003B00018031007180001040504000405140204C2 +:1003C0000418030408083ACC21FE02CAD61B3E02D8 +:1003D00032CC21C3B6183E0032CC213E013252202D +:1003E0003E40325B20FBC9F51C352334C3F51C3479 +:1003F0002335C3F51C3ACC21FE02CA0C1D003ABFBE +:10040000F5C5D5E500210524060036BA0023047899 +:10041000FE20C20D1C7CFE40C2081CE1D1C1F1C906 +:1004200000FF00FF00FF00FF00FF00FF00FF00FFD4 +:1004300000FF00FF00FF00FF00FF00FF00FF00FFC4 +:10044000CD001CCDB812C9FFCD001CCDB812C9FF1C +:10045000AF325C20C9FF00FF00FF00FF00FF00FF7C +:1004600000FF00FF00FF00FF00FF00FF00FF00FF94 +:1004700000FF00FF00FF00FF00FF00FF00FF00FF84 +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A0007777336655666666661111555522224484 +:1004B00044222255551111555555555566227777C9 +:1004C0007777336655666666661111555522224464 +:1004D00044222255551111555555555566227777A9 +:1004E0007777336655666666661111555522224444 +:1004F0004422225555111155555555556622777789 +:100500007777336655666666661111555522224423 +:100510004422225555111155555555556622777768 +:100520007777336655666666661111555522224403 +:100530004422225555111155555555556622777748 +:1005400077773366556666666611115555222244E3 +:100550004422225555111155555555556622777728 +:1005600077773366556666666611115555222244C3 +:100570004422225555111155555555556622777708 +:1005800077771166556666666611115555222244C5 +:1005900044222255551111555555555566227777E8 +:1005A00077771166556666666611115555222244A5 +:1005B00044222255551111555555555566227777C8 +:1005C0007777116655666666661111555522224485 +:1005D00044222255551111555555555566227777A8 +:1005E0007777116655666666661111555522224465 +:1005F0004422225555111155555555556622777788 +:100600007777116655666666661111555522224444 +:100610004422225555111155555555556622777767 +:100620007777226655666666661111555522224413 +:100630004422225555111155555555556622777747 +:1006400077772266556666666611115555222244F3 +:100650004422225555111155555555556622777727 +:1006600077772266556666666611115555222244D3 +:100670004422225555111155555555556611777718 +:1006800077772266556666666611115555222244B3 +:1006900044222255551111555555555566117777F8 +:1006A0007777226655666666661111555522224493 +:1006B00044222255551111555555555566117777D8 +:1006C0007777226655666666661111555522224473 +:1006D00044222255551111555555555566117777B8 +:1006E0007777226655666666661111555522224453 +:1006F0004422225555111155555555556611777798 +:100700007777226655666666661111555522224432 +:100710004422225555111155555555556633777755 +:100720007777226655666666661111555522224412 +:100730004422225555111155555555556633777735 +:1007400077772266556666666611115555222244F2 +:100750004422225555111155555555556633777715 +:1007600077772266556666666611115555222244D2 +:1007700044222255551111555555555566337777F5 +:1007800077772266556666666611115555222244B2 +:1007900044222255551111555555555566337777D5 +:1007A0007777226655666666661111555522224492 +:1007B00044222255551111555555555566337777B5 +:1007C0007777226655666666661111555522224472 +:1007D0004422225555111155555555556633777795 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000FFFF00FB +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/spacelaser_memory.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/spacelaser_memory.sv new file mode 100644 index 00000000..eb503e87 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/spacelaser_memory.sv @@ -0,0 +1,81 @@ +module spacelaser_memory( +input Clock, +input RW_n, +input [15:0]Addr, +input [15:0]Ram_Addr, +output [7:0]Ram_out, +input [7:0]Ram_in, +output [7:0]Rom_out +); + +wire [7:0]rom_data_0; +wire [7:0]rom_data_1; +wire [7:0]rom_data_2; +wire [7:0]rom_data_3; +wire [7:0]rom_data_4; +wire [7:0]rom_data_5; + + +sprom #( + .init_file("./roms/la01.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_h ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_0) + ); + +sprom #( + .init_file("./roms/la02.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_g ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_1) + ); + +sprom #( + .init_file("./roms/la03.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_f ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_2) + ); + +sprom #( + .init_file("./roms/la04.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_e ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_3) + ); + +always @(Addr, rom_data_0, rom_data_1, rom_data_2, rom_data_3) begin + Rom_out = 8'b00000000; + case (Addr[15:11]) + 5'b00000 : Rom_out = rom_data_0; + 5'b00001 : Rom_out = rom_data_1; + 5'b00010 : Rom_out = rom_data_2; + 5'b00011 : Rom_out = rom_data_3; + default : Rom_out = 8'b00000000; + endcase +end + +spram #( + .addr_width_g(13), + .data_width_g(8)) +u_ram0( + .address(Ram_Addr[12:0]), + .clken(1'b1), + .clock(Clock), + .data(Ram_in), + .wren(~RW_n), + .q(Ram_out) + ); +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/spacelaser_mist.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/spacelaser_mist.sv new file mode 100644 index 00000000..2f80be68 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/spacelaser_mist.sv @@ -0,0 +1,208 @@ +module SpaceLaser_mist( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "SpaceLaser;;", + "O2,Rotate Controls,Off,On;", + "O34,Scanlines,Off,25%,50%,75%;", + "O5,Overlay, On, Off;", + "T6,Reset;", + "V,v1.20.",`BUILD_DATE +}; + +assign LED = 1; +assign AUDIO_R = AUDIO_L; + + +wire clk_core, clk_sys; +wire pll_locked; +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_core), + .c1(clk_sys) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0,joystick_1; +wire scandoublerD; +wire ypbpr; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; +wire [7:0] audio; +wire hsync,vsync; +wire hs, vs; +wire r,g,b; + +wire [15:0]RAB; +wire [15:0]AD; +wire [7:0]RDB; +wire [7:0]CAB; +wire [7:0]RWD; +wire [7:0]IB; +wire [5:0]SoundCtrl3; +wire [5:0]SoundCtrl5; +wire Rst_n_s; +wire RWE_n; +wire Video; +wire HSync; +wire VSync; + +invaderst invaderst( + .Rst_n(~(status[0] | status[6] | buttons[1])), + .Clk(clk_core), + .ENA(), + .Coin(btn_coin), + .Sel1Player(~btn_one_player), + .Sel2Player(~btn_two_players), + .Fire(~m_fire), + .MoveLeft(~m_left), + .MoveRight(~m_right), + .RDB(RDB), + .IB(IB), + .RWD(RWD), + .RAB(RAB), + .AD(AD), + .SoundCtrl3(SoundCtrl3), + .SoundCtrl5(SoundCtrl5), + .Rst_n_s(Rst_n_s), + .RWE_n(RWE_n), + .Video(Video), + .CAB(CAB), + .HSync(HSync), + .VSync(VSync) + ); + +spacelaser_memory spacelaser_memory ( + .Clock(clk_core), + .RW_n(RWE_n), + .Addr(AD), + .Ram_Addr(RAB), + .Ram_out(RDB), + .Ram_in(RWD), + .Rom_out(IB) + ); + +invaders_audio invaders_audio ( + .Clk(clk_core), + .S1(SoundCtrl3), + .S2(SoundCtrl5), + .Aud(audio) + ); + +spacelaser_overlay spacelaser_overlay ( + .Video(Video), + .Overlay(~status[5]), + .CLK(clk_core), + .Rst_n_s(Rst_n_s), + .HSync(HSync), + .VSync(VSync), + .CAB(CAB), + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs) + ); + +mist_video #(.COLOR_DEPTH(3)) mist_video( + .clk_sys(clk_sys), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r,r}), + .G({g,g,g}), + .B({b,b,b}), + .HSync(hs), + .VSync(vs), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .rotate({1'b0,status[2]}), + .scandoubler_disable(scandoublerD), + .scanlines(status[4:3]), + .ce_divider(0), + .ypbpr(ypbpr) + ); + +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac dac ( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + + +wire m_left = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_left | joystick_0[1] | joystick_1[1]; +wire m_right = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_right | joystick_0[0] | joystick_1[0]; +wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_left = 0; +reg btn_right = 0; +reg btn_down = 0; +reg btn_up = 0; +reg btn_fire1 = 0; +reg btn_coin = 0; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h75: btn_up <= key_pressed; // up + 'h72: btn_down <= key_pressed; // down + 'h6B: btn_left <= key_pressed; // left + 'h74: btn_right <= key_pressed; // right + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h29: btn_fire1 <= key_pressed; // Space + endcase + end +end + +endmodule diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/spacelaser_overlay.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/spacelaser_overlay.vhd new file mode 100644 index 00000000..05c20798 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/spacelaser_overlay.vhd @@ -0,0 +1,228 @@ +-- 2019 by Gehstock +-- needs some cleanup i´m to Lazy for this +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + + +entity spacelaser_overlay is + port( + Video : in std_logic; + Overlay : in std_logic; + CLK : in std_logic; + Rst_n_s : in std_logic; + HSync : in std_logic; + VSync : in std_logic; + CAB : in std_logic_vector(7 downto 0); + O_VIDEO_R : out std_logic; + O_VIDEO_G : out std_logic; + O_VIDEO_B : out std_logic; + O_HSYNC : out std_logic; + O_VSYNC : out std_logic + ); +end spacelaser_overlay; + +architecture rtl of spacelaser_overlay is + + signal HCnt : std_logic_vector(11 downto 0); + signal VCnt : std_logic_vector(11 downto 0); + signal HSync_t1 : std_logic; + + signal Overlay_A1 : boolean; + signal Overlay_A2 : boolean; + signal Overlay_A3 : boolean; + signal Overlay_A3_VCnt : boolean; + + signal Overlay_B1 : boolean; + signal Overlay_B2 : boolean; + signal Overlay_B2_VCnt : boolean; + + signal Overlay_G1 : boolean; + + signal Overlay_P1 : boolean; + + signal Overlay_R1 : boolean; + signal Overlay_R2 : boolean; + + signal Overlay_Y1 : boolean; + signal Overlay_Y2 : boolean; + signal Overlay_Y2_VCnt : boolean; + + signal VideoRGB : std_logic_vector(2 downto 0); + signal col_data : std_logic_vector(3 downto 0); + +begin + process (Rst_n_s, Clk) + variable cnt : unsigned(3 downto 0); + begin + if Rst_n_s = '0' then + cnt := "0000"; + elsif Clk'event and Clk = '1' then + if cnt = 9 then + cnt := "0000"; + else + cnt := cnt + 1; + end if; + end if; + end process; + + p_overlay : process(Rst_n_s, Clk) + variable HStart : boolean; + begin + if Rst_n_s = '0' then + HCnt <= (others => '0'); + VCnt <= (others => '0'); + HSync_t1 <= '0'; + + Overlay_A1 <= false; + Overlay_A2 <= false; + Overlay_A3 <= false; + Overlay_A3_VCnt <= false; + + Overlay_B1 <= false; + Overlay_B2 <= false; + Overlay_B2_VCnt <= false; + + Overlay_G1 <= false; + + Overlay_P1 <= false; + + Overlay_R1 <= false; + Overlay_R2 <= false; + + Overlay_Y1 <= false; + Overlay_Y2 <= false; + Overlay_Y2_VCnt <= false; + + + elsif Clk'event and Clk = '1' then + HSync_t1 <= HSync; + HStart := (HSync_t1 = '0') and (HSync = '1'); + + if HStart then + HCnt <= (others => '0'); + else + HCnt <= HCnt + "1"; + end if; + + if (VSync = '0') then + VCnt <= (others => '0'); + elsif HStart then + VCnt <= VCnt + "1"; + end if; + + if HStart then + if (Vcnt = 0) then + Overlay_A3_VCnt <= true; + elsif (Vcnt = 98) then + Overlay_B2_VCnt <= true; + Overlay_A3_VCnt <= false; + elsif (Vcnt = 140) then + Overlay_Y2_VCnt <= true; + Overlay_B2_VCnt <= false; + elsif (Vcnt = 232) then + Overlay_Y2_VCnt <= false; + end if; + end if; + + if (HCnt = 500) and Overlay_A3_VCnt then + Overlay_A3 <= true; + elsif (HCnt = 540) then + Overlay_A3 <= false; + end if; + + if (HCnt = 486) and Overlay_B2_VCnt then + Overlay_B2 <= true; + elsif (HCnt = 540) then + Overlay_B2 <= false; + end if; + + if (HCnt = 486) and Overlay_Y2_VCnt then + Overlay_Y2 <= true; + elsif (HCnt = 540) then + Overlay_Y2 <= false; + end if; + + if (HCnt = 64) then + Overlay_R2 <= true; + elsif (HCnt = 96) then + Overlay_A2 <= true; + Overlay_R2 <= false; + elsif (HCnt = 120) then + Overlay_A2 <= false; + Overlay_R1 <= true; + elsif (HCnt = 166) then + Overlay_R1 <= false; + Overlay_Y1 <= true; + elsif (HCnt = 228) then + Overlay_Y1 <= false; + Overlay_P1 <= true; + elsif (HCnt = 292) then + Overlay_P1 <= false; + Overlay_A1 <= true; + elsif (HCnt = 358) then + Overlay_G1 <= true; + Overlay_A1 <= false; + elsif (HCnt = 430) then + Overlay_G1 <= false; + Overlay_B1 <= true; + elsif (HCnt = 486) then + Overlay_B1 <= false; +-- if Overlay_A3_VCnt then +-- Overlay_A2 <= true; +-- if Overlay_B2_VCnt then +-- Overlay_B2 <= true; +-- if Overlay_Y2_VCnt then +-- Overlay_Y2 <= true; +-- elsif (HCnt = 500) then +-- Overlay_A3 <= false; +-- elsif (HCnt = 540) then +-- Overlay_B2 <= false; +-- Overlay_Y2 <= false; + end if; + end if; + end process; + + p_video_out_comb : process(Video, Overlay_G1, Overlay_B1, Overlay_B2, Overlay_A1, Overlay_A2, Overlay_A3, Overlay_P1, Overlay_Y1, Overlay_Y2, Overlay_R1, Overlay_R2) + begin + if (Video = '0') then + VideoRGB <= "000"; + else + if Overlay_A1 or Overlay_A2 or Overlay_A3 then--AQUA + VideoRGB <= "011"; + elsif Overlay_B1 or Overlay_B2 then--BLUE + VideoRGB <= "001"; + elsif Overlay_G1 then--GREEN + VideoRGB <= "010"; + elsif Overlay_P1 then--PINK + VideoRGB <= "101"; + elsif Overlay_R1 or Overlay_R2 then--RED + VideoRGB <= "100"; + elsif Overlay_Y1 or Overlay_Y2 then--YELLOW + VideoRGB <= "110"; + else + VideoRGB <= "111";--WHITE + end if; + end if; + end process; + + colPROM: entity work.clr +port map( + clk => Clk, + addr => CAB, --should be Video Counters + data => col_data +); + +-- O_VIDEO_R <= col_data(2); +-- O_VIDEO_G <= col_data(1); +-- O_VIDEO_B <= col_data(0); + + O_VIDEO_R <= VideoRGB(2) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_G <= VideoRGB(1) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_B <= VideoRGB(0) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_HSYNC <= HSync; + O_VSYNC <= VSync; + + +end; \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/spram.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/sprom.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/sprom.vhd new file mode 100644 index 00000000..a81ac959 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceLaser_MiST/rtl/sprom.vhd @@ -0,0 +1,82 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_aclr_a : STRING; + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/README.txt b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/README.txt new file mode 100644 index 00000000..ffd0e157 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/README.txt @@ -0,0 +1,26 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Space Walk port to MiST by Gehstock +-- 05 June 2019 +-- +--------------------------------------------------------------------------------- +-- +-- Midway 8080 Hardware +-- Audio based on work by Paul Walsh. +-- Audio and scan converter by MikeJ. +--------------------------------------------------------------------------------- +-- +-- +-- Keyboard inputs : +-- +-- F1 : Start +-- SPACE : Fire +-- RIGHT/LEFT : Movement +-- +-- Joystick support. +-- +-- +--------------------------------------------------------------------------------- +ToDo: Color Prom + Controls + DIP + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/SpaceWalk.qpf b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/SpaceWalk.qpf new file mode 100644 index 00000000..31bfde3e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/SpaceWalk.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 16:15:41 June 05, 2019 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "16:15:41 June 05, 2019" + +# Revisions + +PROJECT_REVISION = "SpaceWalk" diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/SpaceWalk.qsf b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/SpaceWalk.qsf new file mode 100644 index 00000000..224648a1 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/SpaceWalk.qsf @@ -0,0 +1,172 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 20:00:37 August 10, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# SpaceWalk_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/SpaceWalk.sv +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Spacewalk_memory.sv +set_global_assignment -name VHDL_FILE rtl/Spacewalk_overlay.vhd +set_global_assignment -name VHDL_FILE rtl/sprom.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name QIP_FILE ../../../common/mist/mist.qip + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY SpaceWalk +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== +set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# ----------------------- +# start ENTITY(SpaceWalk) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(SpaceWalk) +# --------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/SpaceWalk.sdc b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/SpaceWalk.sdc new file mode 100644 index 00000000..f91c127c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/SpaceWalk.sdc @@ -0,0 +1,126 @@ +## Generated SDC file "vectrex_MiST.out.sdc" + +## Copyright (C) 1991-2013 Altera Corporation +## Your use of Altera Corporation's design tools, logic functions +## and other software and tools, and its AMPP partner logic +## functions, and any output files from any of the foregoing +## (including device programming or simulation files), and any +## associated documentation or information are expressly subject +## to the terms and conditions of the Altera Program License +## Subscription Agreement, Altera MegaCore Function License +## Agreement, or other applicable license agreement, including, +## without limitation, that your use is for the sole purpose of +## programming logic devices manufactured by Altera and sold by +## Altera or its authorized distributors. Please refer to the +## applicable agreement for further details. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition" + +## DATE "Sun Jun 24 12:53:00 2018" + +## +## DEVICE "EP3C25E144C8" +## + +# Clock constraints + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty + +# tsu/th constraints + +# tco constraints + +# tpd constraints + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + + + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] + +#************************************************************** +# Create Generated Clock +#************************************************************** + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + +#************************************************************** +# Set Input Delay +#************************************************************** + +set_input_delay -add_delay -clock_fall -clock [get_clocks {CLOCK_27}] 1.000 [get_ports {CLOCK_27}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {CONF_DATA0}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DI}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SCK}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}] + +#************************************************************** +# Set Output Delay +#************************************************************** + +set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_L}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_R}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {LED}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {VGA_*}] + +#************************************************************** +# Set Clock Groups +#************************************************************** + +set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}] + +#************************************************************** +# Set False Path +#************************************************************** + + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + +set_multicycle_path -to {VGA_*[*]} -setup 2 +set_multicycle_path -to {VGA_*[*]} -hold 1 + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/clean.bat b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/SpaceWalk.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/SpaceWalk.sv new file mode 100644 index 00000000..708187bd --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/SpaceWalk.sv @@ -0,0 +1,187 @@ +module SpaceWalk( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Spacewalk;;", + "O34,Scanlines,Off,25%,50%,75%;", +// "O5,Overlay, On, Off;", + "T6,Reset;", + "V,v1.20.",`BUILD_DATE +}; + +assign LED = 1; +assign AUDIO_R = AUDIO_L; + + +wire clk_core, clk_sys; +wire pll_locked; +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_core), + .c1(clk_sys) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0,joystick_1; +wire scandoublerD; +wire ypbpr; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; +wire [7:0] audio; +wire hsync,vsync; +wire hs, vs; +wire r,g,b; + +wire [15:0]RAB; +wire [15:0]AD; +wire [7:0]RDB; +wire [7:0]RWD; +wire [7:0]IB; +wire [5:0]SoundCtrl3; +wire [5:0]SoundCtrl5; +wire Rst_n_s; +wire RWE_n; +wire Video; +wire HSync; +wire VSync; + +invaders invaders( + .Rst_n(~(status[0] | status[6] | buttons[1])), + .Clk(clk_core), + .ENA(), + .Coin(btn_coin), + .Sel1Player(btn_one_player), + .Fire(~joystick_0[4]), + .MoveLeft(~joystick_0[1]), + .MoveRight(~joystick_0[0]), +// .DIP(dip), + .RDB(RDB), + .IB(IB), + .RWD(RWD), + .RAB(RAB), + .AD(AD), + .SoundCtrl3(SoundCtrl3), + .SoundCtrl5(SoundCtrl5), + .Rst_n_s(Rst_n_s), + .RWE_n(RWE_n), + .Video(Video), + .HSync(hs), + .VSync(vs) + ); + +Spacewalk_memory Spacewalk_memory ( + .Clock(clk_core), + .RW_n(RWE_n), + .Addr(AD), + .Ram_Addr(RAB), + .Ram_out(RDB), + .Ram_in(RWD), + .Rom_out(IB) + ); + +invaders_audio invaders_audio ( + .Clk(clk_core), + .S1(SoundCtrl3), + .S2(SoundCtrl5), + .Aud(audio) + ); + +mist_video #(.COLOR_DEPTH(3)) mist_video( + .clk_sys(clk_sys), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({Video,Video,Video}), + .G({Video,Video,Video}), + .B({Video,Video,Video}), + .HSync(hs), + .VSync(vs), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .scandoubler_disable(scandoublerD), + .ce_divider(0), + .scanlines(status[4:3]), + .ypbpr(ypbpr) + ); + +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac #( + .c_bits(8)) +dac ( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + + +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_coin = 0; + +reg gun1_up = 0; +reg gun1_dw = 0; +reg gun2_up = 0; +reg gun2_dw = 0; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h15: gun1_up <= key_pressed; // Q + 'h35: gun1_dw <= key_pressed; // Y + 'h75: gun2_up <= key_pressed; // Arrow up + 'h72: gun2_dw <= key_pressed; // Arrow down + endcase + end +end + +endmodule diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/Spacewalk_memory.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/Spacewalk_memory.sv new file mode 100644 index 00000000..0d77837a --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/Spacewalk_memory.sv @@ -0,0 +1,132 @@ + +module Spacewalk_memory( +input Clock, +input RW_n, +input [15:0]Addr, +input [15:0]Ram_Addr, +output [7:0]Ram_out, +input [7:0]Ram_in, +output [7:0]Rom_out +); + +wire [7:0]rom_data_0; +wire [7:0]rom_data_1; +wire [7:0]rom_data_2; +wire [7:0]rom_data_3; +wire [7:0]rom_data_4; +wire [7:0]rom_data_5; +wire [7:0]rom_data_6; +wire [7:0]rom_data_7; + + +sprom #( + .init_file("./roms/sw.h.hex"), + .widthad_a(10), + .width_a(8)) +u_rom_h ( + .clock(Clock), + .Address(Addr[9:0]), + .q(rom_data_0) + ); + +sprom #( + .init_file("./roms/sw.g.hex"), + .widthad_a(10), + .width_a(8)) +u_rom_g ( + .clock(Clock), + .Address(Addr[9:0]), + .q(rom_data_1) + ); + +sprom #( + .init_file("./roms/sw.f.hex"), + .widthad_a(10), + .width_a(8)) +u_rom_f ( + .clock(Clock), + .Address(Addr[9:0]), + .q(rom_data_2) + ); + +sprom #( + .init_file("./roms/sw.e.hex"), + .widthad_a(10), + .width_a(8)) +u_rom_e ( + .clock(Clock), + .Address(Addr[9:0]), + .q(rom_data_3) + ); + + + + + sprom #( + .init_file("./roms/sw.d.hex"), + .widthad_a(10), + .width_a(8)) +u_rom_d ( + .clock(Clock), + .Address(Addr[9:0]), + .q(rom_data_4) + ); + +sprom #( + .init_file("./roms/sw.c.hex"), + .widthad_a(10), + .width_a(8)) +u_rom_c ( + .clock(Clock), + .Address(Addr[9:0]), + .q(rom_data_5) + ); + +sprom #( + .init_file("./roms/sw.b.hex"), + .widthad_a(10), + .width_a(8)) +u_rom_b ( + .clock(Clock), + .Address(Addr[9:0]), + .q(rom_data_6) + ); + +sprom #( + .init_file("./roms/sw.a.hex"), + .widthad_a(10), + .width_a(8)) +u_rom_a ( + .clock(Clock), + .Address(Addr[9:0]), + .q(rom_data_7) + ); + +always @(Addr, rom_data_0, rom_data_1, rom_data_2, rom_data_3, rom_data_4, rom_data_5, rom_data_6, rom_data_7) begin + Rom_out = 8'b00000000; + case (Addr[13:10]) + 4'b0000 : Rom_out = rom_data_0; + 4'b0001 : Rom_out = rom_data_1;// 0100 0000 0000 + 4'b0010 : Rom_out = rom_data_2;// 1000 0000 0000 + 4'b0011 : Rom_out = rom_data_3; + + 4'b0100 : Rom_out = rom_data_4; + 4'b0101 : Rom_out = rom_data_5; + 4'b0110 : Rom_out = rom_data_6; + 4'b0111 : Rom_out = rom_data_7; + default : Rom_out = 8'b00000000; + endcase +end + +spram #( + .addr_width_g(13), + .data_width_g(8)) +u_ram0( + .address(Ram_Addr[12:0]), + .clken(1'b1), + .clock(Clock), + .data(Ram_in), + .wren(~RW_n), + .q(Ram_out) + ); +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/Spacewalk_overlay.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/Spacewalk_overlay.vhd new file mode 100644 index 00000000..c45739e0 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/Spacewalk_overlay.vhd @@ -0,0 +1,127 @@ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + + +entity Spacewalk_overlay is + port( + Video : in std_logic; + Overlay : in std_logic; + CLK : in std_logic; + Rst_n_s : in std_logic; + HSync : in std_logic; + VSync : in std_logic; + O_VIDEO_R : out std_logic; + O_VIDEO_G : out std_logic; + O_VIDEO_B : out std_logic; + O_HSYNC : out std_logic; + O_VSYNC : out std_logic + ); +end Spacewalk_overlay; + +architecture rtl of Spacewalk_overlay is + + signal HCnt : std_logic_vector(11 downto 0); + signal VCnt : std_logic_vector(11 downto 0); + signal HSync_t1 : std_logic; + signal Overlay_G1 : boolean; + signal Overlay_G2 : boolean; + signal Overlay_R1 : boolean; + signal Overlay_G1_VCnt : boolean; + signal VideoRGB : std_logic_vector(2 downto 0); +begin + process (Rst_n_s, Clk) + variable cnt : unsigned(3 downto 0); + begin + if Rst_n_s = '0' then + cnt := "0000"; + elsif Clk'event and Clk = '1' then + if cnt = 9 then + cnt := "0000"; + else + cnt := cnt + 1; + end if; + end if; + end process; + + p_overlay : process(Rst_n_s, Clk) + variable HStart : boolean; + begin + if Rst_n_s = '0' then + HCnt <= (others => '0'); + VCnt <= (others => '0'); + HSync_t1 <= '0'; + Overlay_G1_VCnt <= false; + Overlay_G1 <= false; + Overlay_G2 <= false; + Overlay_R1 <= false; + elsif Clk'event and Clk = '1' then + HSync_t1 <= HSync; + HStart := (HSync_t1 = '0') and (HSync = '1'); + + if HStart then + HCnt <= (others => '0'); + else + HCnt <= HCnt + "1"; + end if; + + if (VSync = '0') then + VCnt <= (others => '0'); + elsif HStart then + VCnt <= VCnt + "1"; + end if; + + if HStart then + if (Vcnt = x"1F") then + Overlay_G1_VCnt <= true; + elsif (Vcnt = x"95") then + Overlay_G1_VCnt <= false; + end if; + end if; + + if (HCnt = x"027") and Overlay_G1_VCnt then + Overlay_G1 <= true; + elsif (HCnt = x"046") then + Overlay_G1 <= false; + end if; + + if (HCnt = x"046") then + Overlay_G2 <= true; + elsif (HCnt = x"0B6") then + Overlay_G2 <= false; + end if; + + if (HCnt = x"1A6") then + Overlay_R1 <= true; + elsif (HCnt = x"1E6") then + Overlay_R1 <= false; + end if; + + end if; + end process; + + p_video_out_comb : process(Video, Overlay_G1, Overlay_G2, Overlay_R1) + begin + if (Video = '0') then + VideoRGB <= "000"; + else + if Overlay_G1 or Overlay_G2 then + VideoRGB <= "010"; + elsif Overlay_R1 then + VideoRGB <= "100"; + else + VideoRGB <= "111"; + end if; + end if; + end process; + + + O_VIDEO_R <= VideoRGB(2) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_G <= VideoRGB(1) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_B <= VideoRGB(0) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_HSYNC <= not HSync; + O_VSYNC <= not VSync; + + +end; \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T8080se.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T8080se.vhd new file mode 100644 index 00000000..65b92d54 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T8080se.vhd @@ -0,0 +1,194 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80_ALU.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80_ALU.vhd new file mode 100644 index 00000000..e09def1e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80_ALU.vhd @@ -0,0 +1,361 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80_MCode.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80_Pack.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80_Reg.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/T80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/invaders.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/invaders.vhd new file mode 100644 index 00000000..5c95d579 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/invaders.vhd @@ -0,0 +1,281 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaders is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire : in std_logic; + MoveLeft : in std_logic; + MoveRight : in std_logic; + DIP : in std_logic_vector(8 downto 1); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0); + SoundCtrl4 : out std_logic_vector(5 downto 0); + SoundCtrl5 : out std_logic_vector(5 downto 0); + SoundCtrl6 : out std_logic_vector(5 downto 0); + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic + ); +end invaders; + +architecture rtl of invaders is + + component mw8080 + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); + end component; + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(7 downto 0); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; +begin + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; + + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; + if WD_Cnt = 255 then + Rst_n_s_i <= '0'; + end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then + WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then + if Sounds(0) = '1' and Old_S0 = '0' then + WD_Cnt <= WD_Cnt + 1; + end if; + if PortWr(6) = '1' then + WD_Cnt <= (others => '0'); + end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: mw8080 + port map( + Rst_n => Rst_n,--Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + Video => Video, + HSync => HSync, + VSync => VSync); + + with AD_i(9 downto 8) select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + S when others; + + GDB0(0) <= '0';-- + GDB0(1) <= '0';-- + GDB0(2) <= '0';-- + GDB0(3) <= '0';-- + GDB0(4) <= '0';-- + GDB0(5) <= '0';-- + GDB0(6) <= '0';-- + GDB0(7) <= '0';-- + + GDB1(0) <= '1';-- Unused ? + GDB1(1) <= '1';-- Unused ? + GDB1(2) <= '1';-- Unused ? + GDB1(2) <= '1';-- Unused ? + GDB1(4) <= not Sel2Player; + GDB1(5) <= not Sel1Player; + GDB1(6) <= not Coin; + GDB1(7) <= '1';-- Unused ? + + GDB2(0) <= '0';--Game_Time + GDB2(1) <= '0';--Game_Time + GDB2(2) <= '0';--Coinage + GDB2(3) <= '0';--Coinage + GDB2(4) <= '0';--Extended Time At + GDB2(5) <= '0';--Extended Time At + GDB2(6) <= '0';--Springboard Alignment + GDB2(7) <= '0';--unused + + PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; + PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; + PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; + PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; + PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl4 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + SoundCtrl6 <= (others => '0'); + OldSample := '0'; + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0);--audio_1_w + end if; + --if PortWr(4) = '1' and OldSample = '0' then + --D5(15 downto 8) <= DB; + --D5(7 downto 0) <= D5(15 downto 8); + --end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0);--tone_generator_lo_w + end if; + if PortWr(6) = '1' then + SoundCtrl6 <= DB(5 downto 0);--midway_tone_generator_hi_w + end if; + if PortWr(7) = '1' then + SoundCtrl4 <= DB(5 downto 0);--audio_2_w + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/invaders_audio.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/mw8080.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/mw8080.vhd new file mode 100644 index 00000000..b9a88f96 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/mw8080.vhd @@ -0,0 +1,336 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n, Rd_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/pll.qip b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/pll.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/pll.vhd new file mode 100644 index 00000000..f8d0b139 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/pll.vhd @@ -0,0 +1,382 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + sub_wire2 <= sub_wire0(1); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + c1 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 20, + clk1_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire4, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "20.000000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "ps" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "20" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "20.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK1 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "20" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.a.bin b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.a.bin new file mode 100644 index 0000000000000000000000000000000000000000..bd675deceba1cad7515df8db2da07f7993aafd0c GIT binary patch literal 1024 zcmeH@F%H5&3`(MJ<(;} zGU@D!#;}yLs}$Nn$UA=pJQA+Z)gp}kN$&-2J8zQABfan5XL4>brfoWlG@Tz9+9AP-q3SfHQ(Hu_Y29?! z5iFxdr(uv%=%NFP3l}b`xDs?BGFXLSaN!dkLhC{-E?hWZ10pK53vE3&Gp!bUi+jFv z?)lC+_dAc!RIJ=7mM8A-yK)>(iu9e~(RX)oOKO>e&YTp`o#VZR=9gx)SFu{at;a#E zOYzHy7*{<1BzTTJuK93TdzSSSaJLPFjgs_TZZQz=NUB(9Pf%NjqgCpcLRO<{CbTEH zHKN67#S$c!(k}%$t=|$phgFf|`fNb`Sh1SBDhBjD1Ny{(Sml=1ZdcHBDIDH|6>#jU z0?W8x3iN394>eSNh&A?^V$}h+hH2R2SCeS^(`;;#t$m?a-5%uW0LwiZ_>N8?(o2Dh zHm&Ocwf<6Gl_nzP;{<6ly18=nBY~;HFzDY#~M)QrvfA)d$)8vnePqBl9CSwFy`<8L@Bx@V@ zq0OYqn&V;!x6S~gD1gPy^pX+l78{yD|dwx4MVRkhwH5rfBB>N## zAk$Vb-76(FFG}kkyolgU8QruCg)OJei2hh6lh2n<^oszfA@mMmnRP}dKt%%alkz>;!o z8Ru=NXrp(Jywdxde7Mmg+dy-ejPRI>DgxpUl;Ln$n#b$MnvMBqTJ2V2q1issJa(VCADRCEs^;Sk literal 0 HcmV?d00001 diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.b.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.b.hex new file mode 100644 index 00000000..93134886 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.b.hex @@ -0,0 +1,65 @@ +:1000000000040BCD1B0A35061E000AF317160C2040 +:10001000571810F8080F9E170C011A211A162060A5 +:100020003E1A18207B3E0C8041210C8837210E2A75 +:100030000147200C01462018B81A18EE0D18241B91 +:100040000C1E4B200E030224210C0826210E010158 +:100050004C200C0A4F2000060F0010FE0C01062059 +:10006000189A1A041B061C022C0402211C0F3004CF +:1000700014231C0632041B371C02340C010D2118FA +:10008000611B060500160B21741916212194181402 +:100090000C208218160C2168190414CD1B06320A94 +:1000A0008218041B061C02280402211C0F2C041BAE +:1000B000371C02300C0121210A7B180410231C0874 +:1000C0002818611B160C20A2180605000AC418186F +:1000D000611B0412F41B0726041B061C02280402E1 +:1000E000211C0F2C0413BA1B0630041B371C0232D0 +:1000F000060500140C20F01818611B0C010D2104DA +:1001000012CD1B072604012B1C0E30060500160B12 +:10011000215519160C2025191403210B19160C2131 +:1001200070190A0B1916102140190401FC1B0E301E +:100130000405C91B14300C01102118611B0A0B198E +:100140001603211D190412CD1B06300C01032118C2 +:10015000611B0A0B191410217419185C1B1403215C +:100160007419185C1B0A7419162121701918611B67 +:100170000C02062018EA1A10F80E2A0147200C017A +:1001800046200E000016200E0000182018EE0D0C60 +:10019000014D2018F71A10F8146020A41918EE0D5C +:1001A0000C0060200CC837210CC041211A162060B9 +:1001B0003E1A18207B3E18B81A0409E11B0C3506BC +:1001C0003C000409CD1B0C351202EA1B0C35061E3F +:1001D000001202CD1B0C3518241B0C1E4B200E03E5 +:1001E0000224210C0B26210C014C20000C01622062 +:1001F0000604001A1620603E1A18207B3E0413CD18 +:100200001B863E063C000A96190CC837210CC041DB +:1002100021187B1A0E341216200E907818201A1608 +:1002200020603E0402881C8F3E1A18207B3E0C0280 +:1002300006200C010D21140C20471A0404841C0E06 +:100240002618611B0A4D1A0404CD1B0E26140B211F +:100250005B1A0411101C07290A611A0411CD1B072F +:1002600029140C216F1A0411411C072C0A751A0459 +:1002700011CD1B072C0605000A361A210024CD904B +:100280001A06DD111F0036011936802305C2861AB1 +:1002900001FF20712305C2931AC9DB021F1FE60369 +:1002A0004F060021B01A09095E2356EB220020C92F +:1002B0006318A218BB18CF1811322121E51ACDD22C +:1002C0001AB612C911362121E91ACDD21AF604B68E +:1002D00012C906037E2B121B05C2D41ACDBB0DE634 +:1002E00003C9807F0600807B0620AFD305D307219A +:1002F0000E207EE60177C9210E207EF604773A06AD +:10030000203D211B1BCA0B1B211F1BDB02E6032305 +:100310003DF20F1B7E320320326220C970605040D4 +:10032000907560453A1620473A1820B8C2331BCD65 +:10033000BB0D1F114A1BD23C1B11531B21B82006B9 +:10034000091A13772305C2411BC9C080FF007980B9 +:10035000FD00ACC08000007980FD00AC210C203491 +:10036000C9210C2035C92A1820CDA61B3A06203DEC +:10037000C27F1B2A1C20CDB41BD8EB221C20C92A0B +:1003800016207C8227577D8B275F2A1E20CDB41B29 +:10039000DAA31BEB221E202A16202220202A182056 +:1003A0002222202A1620EB2A1A20CDB41BD8EB22B9 +:1003B0001A20EBC97BBDC07ABCC94445504F534994 +:1003C00054403340434F494E5340414E44404040D7 +:1003D000404040404040404040404040404040401D +:1003E00040474554405245414459474F47414D4588 +:1003F0004F5645524445504F534954403140434F66 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.c.bin b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.c.bin new file mode 100644 index 0000000000000000000000000000000000000000..1cfd2e879f8aba465600f5bd3a4b2e9c03c539b8 GIT binary patch literal 1024 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 H-vIpwK7(%$ literal 0 HcmV?d00001 diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.h.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.h.hex new file mode 100644 index 00000000..18ba68e5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/roms/sw.h.hex @@ -0,0 +1,65 @@ +:100000000000310024C31700FBC9000000000000FD +:10001000F5C5D5E5C34C03DB0217DA2000C3660C37 +:100020000601110000210020D304707EA8CA3F0001 +:100030004F7DE60179C23D00B257C33F00B35F2355 +:100040007CFE40C22800D3042B7CFE1FCA7C007EAD +:10005000A8CA63004F7DE60179C26100B257C3634D +:1000600000B35F782F77AECA46004F7DE60179C2B4 +:100070007700B257C37900B35FC34600D304237C33 +:10008000FE40CA9F00782FAECA9A004F7DE60179E4 +:10009000C29800B257C39A00B35FAF77C37C0078B1 +:1000A0000747D225007AB3CACE00EBF9110020062B +:1000B00000210000390E10AF29DABD002F12133EC7 +:1000C0001812130DC2B70005C2B100C308013100F8 +:1000D00024210C36E5210000110D010100041A1342 +:1000E00086D304230DC2E00005C2E0003CCAFA003A +:1000F000E3EB3E01CD1E01EBE31B137CFE20C2DBD4 +:1001000000E17DFE0CCA0000D304C30801004828AA +:10011000477A460F456244BB43F242514137F57E70 +:1001200023D630F2370147137BE61FC23001141487 +:1001300004C22701C31F01E5D5CDC4010E203A65D5 +:1001400020D601F5DA490136FF09F13E0AF51A1306 +:10015000DA54012F7709F13DC24D01DA600136FF13 +:10016000D1E113F13DC21E01326520C9F57ED630C2 +:1001700023E5CDC4013E0AE5F51A13CD9C01CD9CC3 +:1001800001CD9C01CD9C01F1E10E40093DC27701FA +:100190000184FD09EBE1F13DC26C01C91F0E00D2E3 +:1001A000A4010E0F1FF53E00D2AD013EF0B1772342 +:1001B000F1C90603AF7A1F577B1F5F05C2B4017AEE +:1001C000C62457C93CFE0BFACC01D60621CF01014B +:1001D0000A00093DC2D201EBC93C7E6666666666CE +:1001E000667E3C181C1818181818183C3C3C7E6693 +:1001F000607C3E06067E7E3C7E6660387860667E69 +:100200003C666666667E7E606060603E3E06063ED8 +:100210007E60667E3C3C3E06063E7E66667E3C7E9A +:100220007E60703038181C0C0C3C7E66663C7E6626 +:10023000667E3C3C7E66667E7C60607C3C000000A6 +:1002400000000000000000183C7E6666667E7E6648 +:10025000663E7E66663E7E66667E3E3C7E66060640 +:100260000606667E3C3E7E6666666666667E3E7E08 +:100270007E06063E3E06067E7E7E7E06063E3E06E6 +:100280000606063C7E6606067676667E3C666666F2 +:10029000667E7E666666663C3C1818181818183C20 +:1002A0003C60606060606060667E3C6666763E1EB4 +:1002B0001E3E76666606060606060606067E7EC3B1 +:1002C000C3E7E7FFFFDBC3C3C366666E6E7E7E7661 +:1002D0007666663C7E6666666666667E3C3E7E66E2 +:1002E000667E3E06060606081C1C1C1C1C1C1C0800 +:1002F0001C3E7E66667E3E766666663C7E66063E92 +:100300007C60667E3C7E7E181818181818181866CF +:10031000666666666666667E3C66666666667E3CA1 +:100320003C1818C3C3C3DBFFFFE7E7C3C366667EA1 +:100330003C18183C7E666666667E3C1818181818CD +:1003400018181818181899FF7E3C18003A1A21A797 +:10035000C25803DB00321921210E207EEE0277D332 +:10036000033A2221A7C283033AC020FE90DA7D031C +:1003700021B8207EE608C27D037EE6F877CDA10491 +:10038000CDDA08CD300ACD4207216620CD1F0421E9 +:100390006920CD1F04216F20CD2704217220CD2795 +:1003A00004CDBD03CDED03CD89063A2321A7C2B705 +:1003B00003322221321121E1D1C1F1FBC9114020C8 +:1003C0001AA7C04721022035C0363C3A6220A7C296 +:1003D000E3032103207EA7CAE303C6992777C2E37C +:1003E0000306010E01214320CD0B0412C921442034 +:1003F0001141201AA7C0470E08CD0B04121142204C +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/spram.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/sprom.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/sprom.vhd new file mode 100644 index 00000000..a81ac959 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/SpaceWalk_MiST/rtl/sprom.vhd @@ -0,0 +1,82 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_aclr_a : STRING; + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/README SuperEarthInvasion.txt b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/README.txt similarity index 100% rename from Arcade_MiST/Midway-Taito 8080 Hardware/README SuperEarthInvasion.txt rename to Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/README.txt diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/SuperEarthInvasion.qpf b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/SuperEarthInvasion.qpf new file mode 100644 index 00000000..8c553b65 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/SuperEarthInvasion.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2013 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.0 Build 162 10/23/2013 SJ Web Edition +# Date created = 21:27:39 November 20, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "21:27:39 November 20, 2017" + +# Revisions + +PROJECT_REVISION = "SuperEarthInvasion" diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/SuperEarthInvasion.qsf b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/SuperEarthInvasion.qsf new file mode 100644 index 00000000..0ebe06ab --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/SuperEarthInvasion.qsf @@ -0,0 +1,172 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 19:20:51 August 08, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# SuperEarthInvasion_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/SuperEarthInvasion_mist.sv +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/SuperEarthInvasion_memory.sv +set_global_assignment -name VHDL_FILE rtl/SuperEarthInvasion_overlay.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name VHDL_FILE rtl/sprom.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name QIP_FILE ../../../../common/mist/mist.qip + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name TOP_LEVEL_ENTITY SuperEarthInvasion_mist + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== + set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# ------------------------------------- +# start ENTITY(SuperEarthInvasion_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top + set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top + set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(SuperEarthInvasion_mist) +# ----------------------------------- \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/SuperEarthInvasion.sdc b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/SuperEarthInvasion.sdc new file mode 100644 index 00000000..f91c127c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/SuperEarthInvasion.sdc @@ -0,0 +1,126 @@ +## Generated SDC file "vectrex_MiST.out.sdc" + +## Copyright (C) 1991-2013 Altera Corporation +## Your use of Altera Corporation's design tools, logic functions +## and other software and tools, and its AMPP partner logic +## functions, and any output files from any of the foregoing +## (including device programming or simulation files), and any +## associated documentation or information are expressly subject +## to the terms and conditions of the Altera Program License +## Subscription Agreement, Altera MegaCore Function License +## Agreement, or other applicable license agreement, including, +## without limitation, that your use is for the sole purpose of +## programming logic devices manufactured by Altera and sold by +## Altera or its authorized distributors. Please refer to the +## applicable agreement for further details. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition" + +## DATE "Sun Jun 24 12:53:00 2018" + +## +## DEVICE "EP3C25E144C8" +## + +# Clock constraints + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty + +# tsu/th constraints + +# tco constraints + +# tpd constraints + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + + + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] + +#************************************************************** +# Create Generated Clock +#************************************************************** + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + +#************************************************************** +# Set Input Delay +#************************************************************** + +set_input_delay -add_delay -clock_fall -clock [get_clocks {CLOCK_27}] 1.000 [get_ports {CLOCK_27}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {CONF_DATA0}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DI}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SCK}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}] + +#************************************************************** +# Set Output Delay +#************************************************************** + +set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_L}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_R}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {LED}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {VGA_*}] + +#************************************************************** +# Set Clock Groups +#************************************************************** + +set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}] + +#************************************************************** +# Set False Path +#************************************************************** + + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + +set_multicycle_path -to {VGA_*[*]} -setup 2 +set_multicycle_path -to {VGA_*[*]} -hold 1 + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/clean.bat b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/SuperEarthInvasion_memory.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/SuperEarthInvasion_memory.sv new file mode 100644 index 00000000..04687a33 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/SuperEarthInvasion_memory.sv @@ -0,0 +1,81 @@ +module SuperEarthInvasion_memory( +input Clock, +input RW_n, +input [15:0]Addr, +input [15:0]Ram_Addr, +output [7:0]Ram_out, +input [7:0]Ram_in, +output [7:0]Rom_out +); + +wire [7:0]rom_data_0; +wire [7:0]rom_data_1; +wire [7:0]rom_data_2; +wire [7:0]rom_data_3; +wire [7:0]rom_data_4; +wire [7:0]rom_data_5; + + +sprom #( + .init_file("./roms/earthinv_h.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_h ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_0) + ); + +sprom #( + .init_file("./roms/earthinv_g.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_g ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_1) + ); + +sprom #( + .init_file("./roms/earthinv_f.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_f ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_2) + ); + +sprom #( + .init_file("./roms/earthinv_e.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_e ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_3) + ); + +always @(Addr, rom_data_0, rom_data_1, rom_data_2, rom_data_3) begin + Rom_out = 8'b00000000; + case (Addr[15:11]) + 5'b00000 : Rom_out = rom_data_0; + 5'b00001 : Rom_out = rom_data_1; + 5'b00010 : Rom_out = rom_data_2; + 5'b00011 : Rom_out = rom_data_3; + default : Rom_out = 8'b00000000; + endcase +end + +spram #( + .addr_width_g(13), + .data_width_g(8)) +u_ram0( + .address(Ram_Addr[12:0]), + .clken(1'b1), + .clock(Clock), + .data(Ram_in), + .wren(~RW_n), + .q(Ram_out) + ); +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/SuperEarthInvasion_mist.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/SuperEarthInvasion_mist.sv new file mode 100644 index 00000000..0c0853d6 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/SuperEarthInvasion_mist.sv @@ -0,0 +1,212 @@ +module SuperEarthInvasion_mist( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "SEarthInv.;;", + "O2,Rotate Controls,Off,On;", + "O34,Scanlines,Off,25%,50%,75%;", + "O5,Overlay, On, Off;", + "T6,Reset;", + "V,v1.20.",`BUILD_DATE +}; + +assign LED = 1; +assign AUDIO_R = AUDIO_L; + + +wire clk_core, clk_sys; +wire pll_locked; +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_core), + .c1(clk_sys) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0,joystick_1; +wire scandoublerD; +wire ypbpr; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; +wire [7:0] audio; +wire hsync,vsync; +wire hs, vs; +wire r,g,b; + +wire [15:0]RAB; +wire [15:0]AD; +wire [7:0]RDB; +wire [7:0]RWD; +wire [7:0]IB; +wire [5:0]SoundCtrl3; +wire [5:0]SoundCtrl5; +wire Rst_n_s; +wire RWE_n; +wire Video; +wire HSync; +wire VSync; + +invaderst invaderst( + .Rst_n(~(status[0] | status[6] | buttons[1])), + .Clk(clk_core), + .ENA(), + .Coin(btn_coin), + .Sel1Player(~btn_one_player), + .Sel2Player(~btn_two_players), + .Fire(~m_fire), + .MoveLeft(~m_left), + .MoveRight(~m_right), + .DIP(dip), + .RDB(RDB), + .IB(IB), + .RWD(RWD), + .RAB(RAB), + .AD(AD), + .SoundCtrl3(SoundCtrl3), + .SoundCtrl5(SoundCtrl5), + .Rst_n_s(Rst_n_s), + .RWE_n(RWE_n), + .Video(Video), + .HSync(HSync), + .VSync(VSync) + ); + +SuperEarthInvasion_memory SuperEarthInvasion_memory ( + .Clock(clk_core), + .RW_n(RWE_n), + .Addr(AD), + .Ram_Addr(RAB), + .Ram_out(RDB), + .Ram_in(RWD), + .Rom_out(IB) + ); + +invaders_audio invaders_audio ( + .Clk(clk_core), + .S1(SoundCtrl3), + .S2(SoundCtrl5), + .Aud(audio) + ); + +SuperEarthInvasion_overlay SuperEarthInvasion_overlay ( + .Video(Video), + .Overlay(~status[5]), + .CLK(clk_core), + .Rst_n_s(Rst_n_s), + .HSync(HSync), + .VSync(VSync), + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs) + ); + +mist_video #(.COLOR_DEPTH(3)) mist_video( + .clk_sys(clk_sys), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r,r}), + .G({g,g,g}), + .B({b,b,b}), + .HSync(hs), + .VSync(vs), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .rotate({1'b0,status[2]}), + .scandoubler_disable(scandoublerD), + .scanlines(status[4:3]), + .ce_divider(0), + .ypbpr(ypbpr) + ); + +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac dac ( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +wire m_up = ~status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_up | joystick_0[3] | joystick_1[3]; +wire m_down = ~status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_down | joystick_0[2] | joystick_1[2]; +wire m_left = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_left | joystick_0[1] | joystick_1[1]; +wire m_right = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_right | joystick_0[0] | joystick_1[0]; +wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; +wire m_bomb = btn_fire2 | joystick_0[5] | joystick_1[5]; +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_left = 0; +reg btn_right = 0; +reg btn_down = 0; +reg btn_up = 0; +reg btn_fire1 = 0; +reg btn_fire2 = 0; +reg btn_fire3 = 0; +reg btn_coin = 0; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h75: btn_up <= key_pressed; // up + 'h72: btn_down <= key_pressed; // down + 'h6B: btn_left <= key_pressed; // left + 'h74: btn_right <= key_pressed; // right + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h14: btn_fire3 <= key_pressed; // ctrl + 'h11: btn_fire2 <= key_pressed; // alt + 'h29: btn_fire1 <= key_pressed; // Space + endcase + end +end + +endmodule diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/SuperEarthInvasion_overlay.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/SuperEarthInvasion_overlay.vhd new file mode 100644 index 00000000..adbf653b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/SuperEarthInvasion_overlay.vhd @@ -0,0 +1,128 @@ +--2019 by Gehstock +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + + +entity SuperEarthInvasion_overlay is + port( + Video : in std_logic; + Overlay : in std_logic; + CLK : in std_logic; + Rst_n_s : in std_logic; + HSync : in std_logic; + VSync : in std_logic; + O_VIDEO_R : out std_logic; + O_VIDEO_G : out std_logic; + O_VIDEO_B : out std_logic; + O_HSYNC : out std_logic; + O_VSYNC : out std_logic + ); +end SuperEarthInvasion_overlay; + +architecture rtl of SuperEarthInvasion_overlay is + + signal HCnt : std_logic_vector(11 downto 0); + signal VCnt : std_logic_vector(11 downto 0); + signal HSync_t1 : std_logic; + signal Overlay_G1 : boolean; + signal Overlay_G2 : boolean; + signal Overlay_R1 : boolean; + signal Overlay_G1_VCnt : boolean; + signal VideoRGB : std_logic_vector(2 downto 0); +begin + process (Rst_n_s, Clk) + variable cnt : unsigned(3 downto 0); + begin + if Rst_n_s = '0' then + cnt := "0000"; + elsif Clk'event and Clk = '1' then + if cnt = 9 then + cnt := "0000"; + else + cnt := cnt + 1; + end if; + end if; + end process; + + p_overlay : process(Rst_n_s, Clk) + variable HStart : boolean; + begin + if Rst_n_s = '0' then + HCnt <= (others => '0'); + VCnt <= (others => '0'); + HSync_t1 <= '0'; + Overlay_G1_VCnt <= false; + Overlay_G1 <= false; + Overlay_G2 <= false; + Overlay_R1 <= false; + elsif Clk'event and Clk = '1' then + HSync_t1 <= HSync; + HStart := (HSync_t1 = '0') and (HSync = '1'); + + if HStart then + HCnt <= (others => '0'); + else + HCnt <= HCnt + "1"; + end if; + + if (VSync = '0') then + VCnt <= (others => '0'); + elsif HStart then + VCnt <= VCnt + "1"; + end if; + + if HStart then + if (Vcnt = x"1F") then + Overlay_G1_VCnt <= true; + elsif (Vcnt = x"95") then + Overlay_G1_VCnt <= false; + end if; + end if; + + if (HCnt = x"027") and Overlay_G1_VCnt then + Overlay_G1 <= true; + elsif (HCnt = x"046") then + Overlay_G1 <= false; + end if; + + if (HCnt = x"046") then + Overlay_G2 <= true; + elsif (HCnt = x"0B6") then + Overlay_G2 <= false; + end if; + + if (HCnt = x"1A6") then + Overlay_R1 <= true; + elsif (HCnt = x"1E6") then + Overlay_R1 <= false; + end if; + + end if; + end process; + + p_video_out_comb : process(Video, Overlay_G1, Overlay_G2, Overlay_R1) + begin + if (Video = '0') then + VideoRGB <= "000"; + else + if Overlay_G1 or Overlay_G2 then + VideoRGB <= "010"; + elsif Overlay_R1 then + VideoRGB <= "100"; + else + VideoRGB <= "111"; + end if; + end if; + end process; + + + O_VIDEO_R <= VideoRGB(2) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_G <= VideoRGB(1) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_B <= VideoRGB(0) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_HSYNC <= HSync; + O_VSYNC <= VSync; + + +end; \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T8080se.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T8080se.vhd new file mode 100644 index 00000000..65b92d54 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T8080se.vhd @@ -0,0 +1,194 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80_ALU.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80_ALU.vhd new file mode 100644 index 00000000..e09def1e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80_ALU.vhd @@ -0,0 +1,361 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80_MCode.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80_Pack.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80_Reg.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/T80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/dac.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- Refer to Xilinx Application Note XAPP154. +-- +-- This DAC requires an external RC low-pass filter: +-- +-- dac_o 0---XXXXX---+---0 analog audio +-- 3k3 | +-- === 4n7 +-- | +-- GND +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/invaders.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/invaders.vhd new file mode 100644 index 00000000..f089f1f2 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/invaders.vhd @@ -0,0 +1,243 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaderst is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire : in std_logic; + MoveLeft : in std_logic; + MoveRight : in std_logic; + DIP : in std_logic_vector(8 downto 1); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0); + SoundCtrl5 : out std_logic_vector(5 downto 0); + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic + ); +end invaderst; + +architecture rtl of invaderst is + + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(6 downto 2); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; +begin + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; + + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; + if WD_Cnt = 255 then + Rst_n_s_i <= '0'; + end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then + WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then + if Sounds(0) = '1' and Old_S0 = '0' then + WD_Cnt <= WD_Cnt + 1; + end if; + if PortWr(6) = '1' then + WD_Cnt <= (others => '0'); + end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: entity work.mw8080 + port map( + Rst_n => Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + Video => Video, + HSync => HSync, + VSync => VSync); + + with AD_i(9 downto 8) select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + S when others; + + GDB0(0) <= DIP(8); -- Unused ? + GDB0(1) <= DIP(7); + GDB0(2) <= DIP(6); -- Unused ? + GDB0(3) <= '1'; -- Unused ? + GDB0(4) <= not Fire; + GDB0(5) <= not MoveLeft; + GDB0(6) <= not MoveRight; + GDB0(7) <= DIP(5); -- Unused ? + + GDB1(0) <= not Coin;-- Active High ! + GDB1(1) <= not Sel2Player; + GDB1(2) <= not Sel1Player; + GDB1(3) <= '1';-- Unused ? + GDB1(4) <= not Fire; + GDB1(5) <= not MoveLeft; + GDB1(6) <= not MoveRight; + GDB1(7) <= '1';-- Unused ? + + GDB2(0) <= DIP(4); -- LSB Lives 3-6 + GDB2(1) <= DIP(3); -- MSB Lives 3-6 + GDB2(2) <= '0';-- Tilt ? + GDB2(3) <= '0';--DIP(2); -- Bonus life at 1000 or 1500 + GDB2(4) <= not Fire; + GDB2(5) <= not MoveLeft; + GDB2(6) <= not MoveRight; + GDB2(7) <= '1';--DIP(1); -- Coin info + + PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; + PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; + PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; + PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; + PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + OldSample := '0'; + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0); + end if; + if PortWr(4) = '1' and OldSample = '0' then + D5(15 downto 8) <= DB; + D5(7 downto 0) <= D5(15 downto 8); + end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0); + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/invaders_audio.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/mw8080.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/mw8080.vhd new file mode 100644 index 00000000..1d9ad578 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/mw8080.vhd @@ -0,0 +1,335 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n, Rd_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/pll.qip b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/pll.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/pll.vhd new file mode 100644 index 00000000..f8d0b139 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/pll.vhd @@ -0,0 +1,382 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + sub_wire2 <= sub_wire0(1); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + c1 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 20, + clk1_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire4, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "20.000000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "ps" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "20" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "20.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK1 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "20" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/roms/earthinv_e.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/roms/earthinv_e.hex new file mode 100644 index 00000000..9d3a7323 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/roms/earthinv_e.hex @@ -0,0 +1,129 @@ +:10000000FE6EC8002184207EA7CA0707237EA7C0F2 +:100010000601C3FA18F5CDD609F121A21D06072362 +:1000200005C83DC21F18C91631001C1131401C0CF7 +:1000300031201C0731681DFF0000CD5618D8CD4C6B +:1000400018C33A18C50610CD3914C1C9C50E12CD52 +:10005000930AC1C900000AFEFF37C86F030A67038D +:100060000A5F030A5703A7C921C22034234ECDD902 +:1000700001473ACA20B8CA98183AC220E6042ACCE6 +:1000800020C288181130001922C72021C520CD3B7D +:100090001AEBC369140000003E0132CB20C9215085 +:1000A0002011C01B0610CD321A3E023280203EFFC6 +:1000B000327E203E0432C1203A5520E601CAB818EB +:1000C0003A5520E601C2C0182111333E2600CDFF6B +:1000D00008C3B60A3100240600CDE601CD991C3EC6 +:1000E0000832CF20C3EA0A3A672021E7200FD02345 +:1000F000C906023A82203DC004C93A9420B0329425 +:1001000020D303C9210022C3C301CDD814C397153E +:1001100021E7203A67200FD823C90E1C211E241185 +:10012000E41AC3F30821F820C3311921FC20C3319C +:10013000195E2356237E23666FC3CE130E0721015B +:100140003511A91FC3F3083AEB2021013CC3B209C2 +:1001500021F420C33119CD5C1ACD630CCD2519CD06 +:100160002B19CD5019CD3C19C34719CDDC19C371DA +:10017000163E01326D20C3E616CDD719CD4719C3FF +:100180003C1932C120C92AA51F7EFECD3E40CAD7E8 +:100190000A0000000000000000003A1E20A7C2ACC8 +:1001A00019DB01E676D672C03C321E20DB01E67612 +:1001B000FE34C9F5E53E31D303CDEC1001DA17CD9D +:1001C0003A18CDB10AAFD303D306E1F1C90000005C +:1001D000003E0132E920C9AFC3D319003A9420A0F0 +:1001E000329420D303C9210127CAFA1911601C06D1 +:1001F000104FCD3914793DC2EC190610CDCB147CCB +:10020000FE35C2FA19C9217220461AE680A8C03705 +:10021000C9322B241C16110D0A0807060504030217 +:1002200001342E27221C181513100E0D0C0B090774 +:1002300005FF1A77231305C30011005E2356237EA2 +:10024000234E2346616FC9C506037C1F677D1F6F60 +:1002500005C24A1A7CE63FF62067C1C92100243650 +:1002600000237CFE40C25F1AC9C5E51AB677132386 +:100270000DC26B1AE101200009C105C2691AC9CD7E +:100280002E09A7C8F53D77CDE619F1210125E60F26 +:10029000C3C50900000000FFB8FE201C109E00200E +:1002A0001C30100B080706000C04260E150411263E +:1002B000260F0B001804112426251B260E11261CC0 +:1002C0000F0B001804111226011413130E0D260E25 +:1002D0000D0B18261B0F0B001804112626011413F2 +:1002E000130E0D262612020E1104241B25260708C4 +:1002F0003F12020E11042612020E1104241C2526A0 +:100300000100001000000000027838783800F80082 +:100310000080008E02FF050C601C203010010000E0 +:10032000000000BB030010901C2830010400FFFFF8 +:100330000000027604000000000004EE1C00000330 +:10034000000000B604000001001D04E21C000003D0 +:100350000000008206000001061D04D01C000003FE +:10036000FF00C01C0000102101003000120000003E +:100370000F0B0018260F0B00180411241B25FC007E +:1003800001FFFF00000020641DD0291802541D0049 +:100390000800060000014000010000109E00201C23 +:1003A0000003047814130821217E5C7E21C1000023 +:1003B000000001B898A01B10FF00A01B0000000067 +:1003C0000010000E05000000000007D01CC89B03B1 +:1003D0000000030478140B202344B8A8B844330069 +:1003E00000000000000000000001000001741F0078 +:1003F0008000000000001C2F00001C2600001C389C +:100400000000030458E1B6E8E8B6E1580403000030 +:1004100000000030481A2DB8FCB82D1A48300000F2 +:1004200000000000003344B8A8B8443300000000C6 +:100430000000E01051A3B4E8E8B4A35110E00000BC +:100440000000000C10193F94FE943F19100C00009E +:100450000000000000C1217E5C7E21C10000000080 +:1004600000000F1F1F1F1F7FFF7F1F1F1F1F0F0079 +:10047000000401130307B30F2F032F4904030001E6 +:10048000400805A30A035B0F27270B4B4084114844 +:1004900007993C7E3DBC3E7C992139230647C3DE4B +:1004A000122626040011130726080D150012080E47 +:1004B0000D2626C43FC400000210203000000000BA +:1004C0000008492214814200428114224908000098 +:1004D00044AA1A88542210AA442254884A15BE3FBE +:1004E0005E2504FC0410FC1020FC2080FC8000FE33 +:1004F0000024FE1200FE0048FE900F0B00290000B1 +:100500000107010101040B01060301010B090208A7 +:10051000020B04070A050205040607080A060A0377 +:10052000000000008000FF01FF03FF07330F330FBF +:10053000330F330FFF0FFF0FFF0FF00FE03FF03FC0 +:100540003F4F3F8FFF07FF03FF01800005020110AF +:1005500094979A9D01020101020101100102050216 +:10056000010501010000000000040E5BF55B0E1C9C +:100570001C0E5BF55B0E0400000000002008021852 +:1005800048E1461B151B0C14620003163D96030040 +:100590000802512019000F0F0E1601000C0E0E0557 +:1005A00001020360504848484040400F0B001809C2 +:1005B0002612130E0F0F080D0626130704261B1212 +:1005C000132626001104260E0D26130704081126F3 +:1005D00016001826115E1F2108310E02CD930A2144 +:1005E0000629115C0F0E12CD930AC3B60A262626E1 +:1005F00026261600110D080D06382626262626006A +:10060000001F2444241F0000007F49494936000090 +:10061000003E414141220000007F4141413E000037 +:10062000007F494949410000007F48484840000098 +:10063000003E414145470000007F0808087F000058 +:100640000000417F4100000000020101017E000026 +:10065000007F081422410000007F01010101000019 +:10066000007F2018207F0000007F1008047F00001A +:10067000003E4141413E0000007F484848300000B4 +:10068000003E4145423D0000007F484C4A31000099 +:1006900000324949492600000040407F40400000A8 +:1006A000007E0101017E0000007C0201027C00004E +:1006B000007F020C027F0000006314081463000036 +:1006C0000060100F106000000043454951610000B8 +:1006D000003E4549513E00000000217F010000001E +:1006E0000023454949310000004241495966000054 +:1006F000000C14247F04000000725151514E000080 +:10070000001E29494946000000404748506000004B +:100710000036494949360000003149494A3C000049 +:1007200000081422410000000000412214080000CB +:100730000000000000000000001414141414000055 +:100740000022147F14220000000304780403000038 +:10075000210A290E1211EE00CD930AC3D41D0118EF +:10076000020E0D06110013140B0013080E0D1226B5 +:100770000E0DD31D01010000010002010002010065 +:1007800060100F1060202344B8A8B8443300000064 +:10079000080D120411132626020E080D11F81ECDA5 +:1007A0003914C32E0FB10B4F1F0211040308132677 +:1007B0000060100F106021217E5C7E21C1000000CE +:1007C00000007D7D00000000000000FFB8FF801FDA +:1007D000109700801F000001D022201C10940020E0 +:1007E0001C020E0C0F041308130815042626150806 +:1007F00003040E05110E0C0000080808080800008C +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/roms/earthinv_f.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/roms/earthinv_f.hex new file mode 100644 index 00000000..a6308ac3 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/roms/earthinv_f.hex @@ -0,0 +1,129 @@ +:10000000131226050E112626262612020E1104268C +:100010001D1A1A260F0E080D131226050E1126267C +:1000200012020E110426000D2604171311002601DA +:100030000E0D141226050E111214020204121205DE +:10004000140B2626000213080E0D26000600080DCC +:10005000121326080D150003041112262608122675 +:100060001104160011030403261608130726000DB9 +:10007000260417131100260B001904112606140D6F +:1000800026050E11261D1A1A1A1A260F0E080D1310 +:100090001226DB02E604C2D4103A213EE60FFE0F20 +:1000A000C03AEB20F5DB0207DACE10F1C6032732A7 +:1000B000EB20CD4719AF32213EC91F1A0F26020E81 +:1000C000080D2627261D2602110403081312F1C667 +:1000D00005C3AE103E0F32213EC912140F041108A1 +:1000E0000E112626080D15000304111201CD17CD9F +:1000F000EC11CD5618D8C50E12CDF308C1C3F210BD +:10010000C2321AC5D5E53A6720672EFE3A7E1B96A5 +:10011000FEF7D217113EF8327E20E1D1C1D306C9D5 +:1001200000003A4023A7CA0001FA84113A9420EE55 +:1001300008329420D3032A44230603CD24142A44EE +:100140002311FCFF19224423CD471A7DE61FFE042C +:10015000C27B11112000197EA7CAFF113E01321582 +:1001600020210000224623AF3240233241233A941B +:1001700020E6F7329420D303C30001FE03C2FF112F +:10018000AF3241233A4623A7C29A112F324023238C +:10019000224423112000192246230608CDFA18AF65 +:1001A0002A4623772A442377214023357EE607CA4F +:1001B00061111120002A4623192246232A442311C3 +:1001C000E0FF19224423EB3A1B20FE30CADF112A3C +:1001D0001A20CD471A01E00109CD3000CA5C112A6E +:1001E000442336FF2A462336FFC30001C50E1A2AD0 +:1001F000A71F237EFEC9CC5F070DC2F211C1C92A19 +:100200004423CD501411B31C0603CD3914C300018F +:100210003A4323A7C230123241233A8C20A7FA2650 +:10022000123E01C328123EFF3248233E01324323CF +:100230003DC25512CD7212CA82123A41233C32415C +:1002400023FE04C23C073E02324323AF3242233234 +:100250004123C33C07CD7212CA8912AF3241233AFF +:1002600042233C324223FE04C23C07AF324223C346 +:100270003C072A8920CD471A7DD6116F0610CDC7BD +:1002800015C9AF324123C33C07AF3242233A412361 +:100290003C324123D607C23C073241233A4023A7D0 +:1002A000C23C073A6520B72A892011F70219224477 +:1002B000233E01324023C33C07C50E0F2A721FC3E1 +:1002C000F2112A8D202C7DFE63DACE122E54228D5F +:1002D00020C9AF324323C342072140230640AF77F2 +:1002E0002305C2DF12C35619C53A8220FE01CA9FF8 +:1002F000134FE5CDCA097EE1814F3A642081B7E210 +:100300009F13E53A6720672EFE7EFE04FA11133E26 +:1003100003074F060021A313094E2346C52A642074 +:10032000CD471A7CC1E1B9FA9F13B8F29F137DA79C +:10033000FA9F13FE37F29F132BF5FE00CA6C13FED3 +:100340000BCA6C13FE16CA6C13FE21CA6C13FE2C6A +:10035000CA6C137E3601FE00C26C13E52A642011BC +:1003600000F01911AB130610CD6914E1F12323FE3F +:100370000ACA9F13FE15CA9F13FE20CA9F13FE2BA5 +:10038000CA9F13FE36CA9F137E3601FE00C29F131A +:100390002A64201100101911AB130610CD6914C185 +:1003A000C35F0A33312C372A39283B000000000094 +:1003B000000972DC72090000000000CDC113C313F4 +:1003C00017CDCA097E23666F292929297CC9E5D55D +:1003D000110004193E1ACDFF08D1E1C3AD09EB6E3F +:1003E000260079B7CAEC13293DC2E713EBC9CD50FB +:1003F0001479F50E00F1F5D5C54FCDDE13C17BA6FE +:10040000CA05140E017BB677237AA6CA10140E0112 +:100410007AB677111F0019D11305C2F513F179329D +:100420006120C900CD5014C5E5AF77237723E101E2 +:10043000200009C105C22714C9C51A77130120007D +:1004400009C105C23914C9CDB60ACDD609C3DF1812 +:100450007DE6074FC506037C1F677D1F6F05C257EA +:10046000147CE63FF62067C1C9CD5414C5011F00B6 +:100470001A7723137009C105C26C14C9C5E57E1231 +:1004800013230DC27E14E101200009C105C27C14B2 +:10049000C9CD5014D5CDDE137BB677237AB677114C +:1004A0001F0019D11305C29414C9CD5014D5CDDE47 +:1004B000137B2FA677237A2FA677111F0019D1134C +:1004C00005C2AD14C9000000000000AFC5770120CF +:1004D0000009C105C2CC14C93A2520FE05C8FE0298 +:1004E000C03A2920FED847D230153A0220A7C87852 +:1004F000FECED27915C606473A0920FE90D20415E1 +:10050000B8D2301568CD62153A2A2067CD6F152212 +:1005100064203E05322520CD81157EA7CA301536D0 +:1005200000CDE812CD3B1ACD69143E10320320C92C +:100530003E03322520C34A1521032035C02A6420FA +:100540000610CD24143E04322520AF32022006F7D7 +:10055000C3DC19000E00BCD49015BCD0C6100CC36F +:100560005A153A092065CD54154105DE106FC93A78 +:100570000A20CD5415DE1067C93E01328520C345DF +:100580001578070707808080813D6F3A672067C92B +:100590000CC610FA9015C93A0D20A7C2B71521A4B0 +:1005A0003ECDC515D006FE3E01320D207832082022 +:1005B0003A0E20320720C9212425CDC515D0CDF112 +:1005C00018AFC3A91506177EA7C26B162305C2C7AD +:1005D00015C900000000000000000000000000003D +:1005E000000000000000000000000000000000000B +:1005F000000000CD11160100377EA7CAFF150C239D +:1006000005C2F91579328220FE01C0216B20360126 +:10061000C92E003A672067C93A1520FEFFC0211095 +:10062000207E2346B0C03A2520A7C03AEF20A7CAB3 +:1006300052163A2D20A7C24816CDC017E610C83E64 +:1006400001322520322D20C9CDC017E610C0322D31 +:1006500020C921252036012AED20237DFE7EDA6384 +:10066000162E7422ED207E321D20C937C9AFCD8BE6 +:100670001ACD10193600CDCA092311F5201ABE1B58 +:100680002B1ACA8B16D29816C38F16BED298167E16 +:100690001213237E12CD50193ACE20A7CAC91621B3 +:1006A000032811A61A0E14CD930A2525061B3A67B6 +:1006B000200FDAB716061C78CDFF08CDB10ACDE7BA +:1006C000187EA7CAC916C3ED0221182D11A61A0E4D +:1006D0000ACD930ACDB60ACDD609AF32EF20D305A5 +:1006E000CDD119C3890B310024FBAF321520CDD8F1 +:1006F000140604CDFA18CD590AC2EE16CDD7192129 +:100700000127CDFA19AFCD8B1A06FBC36B19CDCAE1 +:1007100009237E11B81C21A11A0E04471AB8D2274A +:100720001723130DC21C177E32CF20C93A2520FE95 +:1007300000C2391706FDC3DC190602C3FA1800000F +:10074000219B2035CC6D173A6820A7CA6D172196DA +:100750002035C02198207ED3053A8220A7CA6D1784 +:100760002B7E2B772B36013E04329B20C93A9820F2 +:10077000E630D305C93A9520A7CAAA1721111A1144 +:10078000211A3A8220BED28E172313C385171A323C +:1007900097202198207EE630477EE60F07FE10C2A4 +:1007A000A4173E01B077AF32952021992035C006BD +:1007B000EFC3DC1906EF2198207EA077D305C9008E +:1007C0003A67200FD2CA17DB01C9DB02C9182960BA +:1007D0001F1629B01D1429A11CFF0E29ED1D0C297F +:1007E000DA100A29C21DFFC602F5DB0207DAF41788 +:1007F000F1C602C9F1C9AF32E02132E022C3D60905 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/roms/earthinv_g.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/roms/earthinv_g.hex new file mode 100644 index 00000000..cf7f462f --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/roms/earthinv_g.hex @@ -0,0 +1,129 @@ +:10000000AF32C120CDCF013A67200FDA7208CD138D +:1000100002CDCF01CDB100CDD1190620CDFA18CD3A +:100020001816CD0A19CDF315CD88093A8220A7CA32 +:10003000EF09CDBB13CD3509CDD808CD2C17CD593F +:100040000ACA49080604CDFA18CD7517D306CD049F +:1000500018C31F0800000011BA1ACDF3080698DB78 +:10006000010F0FDA6D080FDA9807C37F073E01C34F +:100070009B07CD1A02C314083A0820472A0920EB2F +:10008000C386080000003A6720672EFCC921112BA7 +:1000900011701B0E0ECDF3083A67200F3E1C211184 +:1000A00037D4FF083EB032C0203AC020A7C8E604CB +:1000B000C2BC08CDCA09CD3119C3BD0B0630211C05 +:1000C000263A67200FDACB08211C38CDCB14C3A900 +:1000D00008DB02E601C3E7173A8220FE0CD03EF9A6 +:1000E000327E20C93ACE20A7C0211C380630C3CBAF +:1000F000140E031AD5CDFF08D1130DC2F308C91190 +:10010000001EE526006F29292919EBE10608D30610 +:10011000C339143A0920FE78D02A91207DB4C2292F +:10012000092100063E013283202B229120C9CD11E6 +:10013000162EFF7EC9CD10192B2B7EA7C80650DBCB +:10014000020700D248090630CDC1130000B8D8CD4F +:100150002E09347EF521012524243DC258090610BC +:1001600011601CCD3914F13CCD8B1ACD10192B2BFD +:1001700036003EFF3299200610C3FA1821A01DFE5A +:1001800002D823FE04D823C9CDCA093AF120A7C852 +:10019000AF32F120E52AF220EBE17E8327775F235F +:1001A0007E8A277757237E23666FC3AD097ACDB247 +:1001B000097BD5F50F0F0F0FE60FCDC509F1E60F3F +:1001C000CDC509D1C9C61AC3FF083A67200F21F867 +:1001D00020D821FC20C92102243600237DE61FFE01 +:1001E0001CDAE809110600197CFE40DAD909C9CDEC +:1001F0003C0AAF32E920CDD6093A6720F5CDE401BB +:10020000F13267203A672067E52EFE7E3C77FE01DB +:10021000CCB319CD151800007EE12EFC77233638BB +:100220007C0FDA330A3E21329820CDF501CD041936 +:10023000C30408CDEF01CDC001C30408CD590AC2E3 +:10024000520A3E3032C0203AC020A7C8CD590ACA4F +:10025000470ACD590AC2520AC93A1520FEFFC93AC7 +:10026000EF20A7CA7C0A480608CDFA184178CD7C51 +:10027000097E21F32036002B772B3601216220C91D +:100280003E0232C120D3063ACB20A7CA850AAF323C +:10029000C120C9D51ACDFF08D13E0732C0203AC0CF +:1002A000203DC29E0A130DC2930AC9215020C34BA0 +:1002B000023E40C386193E80C3D70AE1C372003AAA +:1002C000C1200FDABB0A0FDA68180FDAAB0AC900CF +:1002D0000000000000000032C0203AC020A7C2DAAF +:1002E0000AC921C220060CC3321AAFD303D305CDED +:1002F0008219FBCDB10A3AEC20A72117300E04C2B7 +:10030000E80B11FA1CCD930ACDB10ACD7F0C3A90BF +:100310001FCD640E0000003AEC20A7C24A0B1195D5 +:100320001ACDE20ACD800A11B01BCDE20ACD800AB7 +:10033000CDB10A11C91FCDE20ACD800ACDB10A2183 +:10034000B733060ACDCB14CDB60ACDDD0E3AFF2168 +:10035000A7C25D0BCDD10832FF21CD7F1ACDE401BC +:10036000CDC001CDEF01CD1A023E0132C120CDCF6B +:1003700001CD1816CDF10BD306CD590ACA710BAFBA +:10038000322520CD590AC2830BAF32C120CDB10A2C +:10039000CDD6090E0C21112C11901FCDF3083AEC8B +:1003A00020FE00C2AE0B2111333E02CDFF08CD2C42 +:1003B0000CCD501FC3C60BC5CDF308C1C9CD630C0E +:1003C000CDE408C3A9083AEC20FE00C2DA0B11D52F +:1003D0001FCDE20ACD800ACD9E1821EC207E3CE69E +:1003E0000177CDD609C3340F11AB1DCD930AC308D5 +:1003F0000BCD0A19C39A193EC0C3D70A01183AEBAC +:1004000020FE99CA3E00F5DB0207D2140CF1C601AA +:1004100027C338003A013EFE07C2230CAF32013E2B +:10042000C30D0C3E0732013EF1C33E00DB0207D292 +:10043000380C116E0FC33B0C117E0F210F2A0E10CA +:10044000CDF308DB020F0FD8210D2811BA100E14BE +:10045000CDF308DB0207D0210D3311F81E0608C3C7 +:10046000391498CD1A19211C3DCD750C211C34CDA1 +:10047000750C211C2B11D01E0608D306C33914118C +:10048000F80C21152E0640CD3914D30611380D2154 +:10049000142E0640CD3914CDB10A11780D21122E3B +:1004A0000640CD391411B80D21112E0640CD391456 +:1004B000CDB10A11FA0D210F2B066ACD3914D306DE +:1004C00011730E210E2B066ACD3914CDB10A11F32A +:1004D0001F210B300E04CD930A21092911E11F0EB3 +:1004E00012CD930AC3B60A1826D80F1326F00F0EA2 +:1004F00026081009262010FF003C7EC3C3C3C3C3D7 +:10050000C37130000000FFFF000000000000FFFF8B +:10051000000000FFFFC3C3C3C3C3C37E3C00000091 +:10052000FFFFC3C3C3C3C3C3C0C0000000FFFFC3FA +:10053000C3C3C3C3C37E3C000030380C0C0C0C0C8E +:100540000CF8F0000000F0F81C0C0C0C0C1CF8F07F +:10055000000000FCFC0000000000000000000000A3 +:10056000FCFC0C0C0C0C0C0C0C0C000000FCFC003B +:1005700000C0C030300C0C0000FFFFC3C3C3C3C3B6 +:10058000C3C0C0000000071F3870C0C070381F070C +:10059000000000FFFFC3C3C3C3C3C37E3C00000011 +:1005A000C0C0C0C0FFFFC0C0C0C0000000FFFF034C +:1005B0000303030303FFFF0000FCFC0C0C0C0C0CFA +:1005C0000C0C0C000000FCFCC0C0C0C0C0C0FCFC97 +:1005D000000000FCFC0000C0C030300C0C0000002B +:1005E00000000000FCFC00000000000000FCFC001B +:1005F0000000000000FCFC005E0F0000000000C0D6 +:10060000C0C0C0FFFFC0C0C0C0000000FFFF0C0C96 +:1006100003030000FFFF000000FFFF0000000000D8 +:1006200000FFFF000000071F3870C0C070381F07B0 +:100630000000003C7EC3C3C3C3C3C37130000000CD +:10064000C0C0C0C0FFFFC0C0C0C00000003F7FC02E +:10065000C0C0C0C0C07F3F000000FFFF0C0C030300 +:100660000000FFFF1E0A2AF80D4E1DCA0018812344 +:10067000C3690E00000000000C0C0C0CFCFC0C0C00 +:100680000C0C000000FCFC00000000C0C0FCFC00E2 +:100690000000C0C030300C0C3030C0C0000000FC86 +:1006A000FCC0C0C0C0C0C0FCFC00000030380C0C56 +:1006B0000C0C0C0CF8F00000000C0C0C0CFCFC0CEE +:1006C0000C0C0C000000F0F80C0C0C0C0C0CF8F0EE +:1006D000000000FCFC00000000C0C0FCFCCDD609FE +:1006E0002116280E14118E0FCD560F0E122114292B +:1006F000CD560F211229CD560F211029CD560F218D +:100700000D291138100E12CDB70B210B29CDB70BC7 +:10071000210929CDB70B210729CDB70B210529CDFB +:10072000B70B21052E0608DB020700D29C1FCDF770 +:100730000BC3D609012718CD5618DA430FCD44183C +:10074000C3370F01E70CCD5618DA4714C50E18CD84 +:10075000930AC1C3460FC5CD930AC1C9020E0C0F3F +:10076000041308130815042626150803040E1B2677 +:10077000020E080D26261B260211040308131C0274 +:100780000E080D122627261B02110403081313005E +:100790000A04260E15041126020E0C0C000D032669 +:1007A0000E050400111307260100120426000D0394 +:1007B00026141204180E141126120A080B0B261305 +:1007C0000E2612130E0F130704260400111307261A +:1007D000080D150012080E0D262612020E11042611 +:1007E0001B1A1A260F0E080D131226050E112626A7 +:1007F000262612020E1104261C1A1A260F0E080DA8 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/roms/earthinv_h.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/roms/earthinv_h.hex new file mode 100644 index 00000000..d334786f --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/roms/earthinv_h.hex @@ -0,0 +1,129 @@ +:1000000000C3D4180F141207F5C5D5E5C38C000042 +:10001000F5C5D5E53E8032722021C02035CD921045 +:10002000DB010FDA67003AEA20A7CA4200C3FE0BE1 +:100030007CBAC07DBBC9000032EB20CD4719AF327E +:10004000EA203AE920A7CA82003AEF20A7C26F004F +:100050003AEB20A7C25D00CDBF0AC382003A9320CD +:10006000A7C28200C365073E0132EA20C33F00CD2C +:1000700040173A3220328020CD2211CD4802CD13D4 +:100080000900CDC212E1D1C1F1FBC900AF3272202B +:100090003AE920A7CA82003AEF20A7C2A5003AC1D8 +:1000A000200FD28200212020CD4B02CD4101C382FE +:1000B00000CD8608E57E23666F220920220B20E111 +:1000C0002B7EFE03C2C8003D320820FEFE3E00C269 +:1000D000D3003C320D20C93E0232FB2132FB22C349 +:1000E000E4082A132011651B2319EBC3321A0308F5 +:1000F000120F0B00182626020E0F18110806071300 +:100100002102207EA7C23815E53A06206F3A672003 +:10011000677EA7E1CA360123237E2346E6FE070752 +:10012000075F160021001C19EB78A7C43B012A0BBE +:10013000200610CD6914AF320020C921300019EB20 +:10014000C93A6820A7C83A0020A7C03A6720673A92 +:10015000062016023CFE37CCA1016F4605C25401B1 +:10016000320620CD7A0161220B207DFE28DA71193A +:100170007A3204203E01320020C916007D21092078 +:1001800046234EFE0BFA9401DE0B5F78C610477BC8 +:1001900014C3830168A7C85F79C6104F7B3DC39520 +:1001A0000115CACD012106203600234E3600CDD9D7 +:1001B000012105207E3CE60177AF21672066C9005A +:1001C000210021063736012305C2C501C9E1C93E18 +:1001D0000106E0210224C3CC142346237986772329 +:1001E000788677C906C011001B210020C3321A216E +:1001F0004221C3F8012142220E0411201DD5062CF4 +:10020000CD321AD10DC2FD01C93E01C31B023E0110 +:10021000C31402AF114222C31E02AF114221328128 +:10022000200102162106283E04F5C53A8120A7C206 +:100230004202CD691AC1F13DC8D511E00219D1C3FE +:100240002902CD7C14C335022110207EFEFFC8FE9A +:10025000FECA810223464FB079C27702237EA7C22D +:100260008802235E2356E5EBE5216F02E3D5E9E141 +:10027000110C0019C34B020504C27D023D05702B11 +:100280007711100019C34B02352B2BC38102E123D8 +:100290007EFEFFCA3B032335C047AF326820326978 +:1002A000203E30326A207836052335C29B032A1A55 +:1002B000200610CD241421102011101B0610CD3261 +:1002C0001A0600CDDC193A6D20A7C03AEF20A7C866 +:1002D000310024FBCDD719CD2E09A7CA6D16CDE765 +:1002E000187EA7CA2C033ACE20A7CA2C033A67204F +:1002F000F50FDA3203CD0E02CD78087323722B2B63 +:100300007000CDE401F10F3E210600D21203062059 +:100310003E22326720CDB60AAF32112078D3053C99 +:10032000329820CDD609CD7F1AC3F907CD7F1AC3E5 +:100330001708CD0902C3F802000000216820360129 +:10034000237EA7C3B003002B36013A1B20473AEFA8 +:1003500020A7C263033A1D200FDA81030FDA8E0350 +:10036000C36F03CDC0170707DA810307DA8E0321B5 +:100370001820CD3B1ACD471ACD39143E0032122039 +:10038000C978FED9CA6F033C321B20C36F0378FEC5 +:1003900030CA6F033D321B20C36F033CE6013215A8 +:1003A000200707070721701C856F221820C36F03E1 +:1003B000C24A032335C24A03C34603112A20CD068D +:1003C0001AE1D0237EA7C8FE01CAFA03FE02CA0AB8 +:1003D0000423FE03C22A0435CA36047EFE0FC0E59C +:1003E000CD3004CDAA14E12334232335352335350C +:1003F00035233608CD3004C391143C773A1B20C610 +:1004000008322A20CD3004C39114CD3004D5E5C57F +:10041000CDAA14C1E1D13A2C20856F322920CDEE2E +:10042000133A6120A7C8320220C9FE05C8C33604AA +:10043000212720C33B1ACD3004CDAA142125201139 +:10044000251B0607CD321A00000000000000000046 +:100450000000000000002A8F202C228F203A8420E8 +:10046000A7C07EE601012902C26E0401E0FE218AD6 +:100470002071232370C9E13A321B3232202A3820FE +:100480007DB4C28A042B223820C91135203EF9CD13 +:1004900050053A46203270203A5620327120CD6302 +:1004A000053A7820A7213520C25B0511301B213089 +:1004B000200610C3321AE13A6E20A7C03A8020FE0F +:1004C00001C01145203EEDCD50053A362032702056 +:1004D0003A5620327120CD63053A7620FE10DAE7D5 +:1004E000043A481B3276203A7820A7214520C25B87 +:1004F0000511401B2140200610CD321A3A82203DC2 +:10050000C208053E01326E202A7620C37E06E11124 +:1005100055203EDBCD50053A46203270203A362039 +:10052000327120CD63053A7620FE15DA34053A584B +:100530001B3276203A7820A7215520C25B05115046 +:100540001B2150200610CD321A2A7620225820C9AD +:10055000327F20217320060BC3321A117320060B41 +:10056000C3321A2173207EE680C2C1053AC120FE43 +:10057000043A6920CAB705A7C82336003A7020A7F5 +:10058000CA8905473ACF20B8D03A7120A7CA960544 +:10059000473ACF20B8D0237EA7CA1B062A76204E22 +:1005A0002300227620CD2F06D0CD7A0179C60767A9 +:1005B0007DD60A6F227B202173207EF6807723343C +:1005C000C9117C20CD061AD0237EE601C244062341 +:1005D00034CD75063A7920C603217F20BEDAE205C4 +:1005E000D60C3279203A7B20473A7E2080327B201D +:1005F000CD6C063A7B20FE15DA12063A6120A7C8B8 +:100600003A7B20FE1EDA1206FE2700D2120697322F +:1006100015203A7320F601327320C93A1B20C60810 +:1006200067CD6F1579FE0CDAA5050E0BC3A5050D78 +:100630003A6720676916057EA737C07DC60B6F1520 +:10064000C23706C9217820357EFE03C26706CD7504 +:100650000621DC1C227920217C2035352B35353EC6 +:1006600006327D20C36C06A7C0C37506217920CD54 +:100670003B1AC3EE13217920CD3B1AC3AA1422489A +:1006800020C9E13A8020FE02C02183207EA7CA0F44 +:10069000053A5620A7C20F05237EA7C2AB063A82B1 +:1006A00020FE02DA0F053601CD3C07118A20CD0667 +:1006B0001AD02185207EA7C2D606218A207E232338 +:1006C00086328A20CD1012218A207EFE28DAF90691 +:1006D000FEE1D2F906C906FECDDC1923357EFE1FE8 +:1006E000CA4B07FE18CA0C07A7C006EF2198207E48 +:1006F000A077E620D305000000CDD212CDCB142187 +:100700008320060ACD5F0706FEC3DC193E0132F1E5 +:10071000202A8D20460E0421501D114C1D1AB8CAE6 +:10072000280723130DC21D077E3287202600682963 +:1007300029292922F220CDD212C3F108CD4207C3C4 +:100740003914218720CD3B1AC3471A06102198205F +:100750007EB077CD7017217C1D228720C33C071106 +:10076000831BC3321A3E01329320310024FBCD7922 +:1007700019CDF6172113301104000E04CDF3083AF9 +:10078000EB203D2110280E14C2570811CF1ACDF3CB +:1007900008DB01E604CA7F070699AF32CE203AEBA8 +:1007A00020802732EB20CD471921000022F820229B +:1007B000FC20CD2519CD2B19CDD7192101017C3273 +:1007C000EF2022E72022E520CDD912CDEF01CDF593 +:1007D00001CDD10832FF2132FF22CDD700AF32FE4A +:1007E0002132FE22CDC001CD041921783822FC210E +:1007F00022FC22CDE401CD7F1ACD8D08CDD6090093 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/spram.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/sprom.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/sprom.vhd new file mode 100644 index 00000000..a81ac959 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Super Earth Invasion_MiST/rtl/sprom.vhd @@ -0,0 +1,82 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_aclr_a : STRING; + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/README.txt b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/README.txt new file mode 100644 index 00000000..04cbfbca --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/README.txt @@ -0,0 +1,26 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Vortex port to MiST by Gehstock +-- 08 June 2019 +-- +--------------------------------------------------------------------------------- +-- +-- Midway 8080 Hardware +-- Audio based on work by Paul Walsh. +-- Audio and scan converter by MikeJ. +--------------------------------------------------------------------------------- +-- +-- +-- Keyboard inputs : +-- +-- F1 : Start +-- SPACE : Fire +-- RIGHT/LEFT : Movement +-- +-- Joystick support. +-- +-- +--------------------------------------------------------------------------------- + +ToDo Sound + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/Vortex.qpf b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/Vortex.qpf new file mode 100644 index 00000000..8bec1592 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/Vortex.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 16:15:41 June 05, 2019 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "16:15:41 June 05, 2019" + +# Revisions + +PROJECT_REVISION = "Vortex" diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/Vortex.qsf b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/Vortex.qsf new file mode 100644 index 00000000..b86690cb --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/Vortex.qsf @@ -0,0 +1,176 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 18:00:39 August 08, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Vortex_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Vortex_mist.sv +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Vortex_memory.sv +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name VHDL_FILE rtl/roms/1.t36.vhd +set_global_assignment -name VHDL_FILE rtl/roms/2.t35.vhd +set_global_assignment -name VHDL_FILE rtl/roms/3.t34.vhd +set_global_assignment -name VHDL_FILE rtl/roms/4.t33.vhd +set_global_assignment -name VHDL_FILE rtl/roms/5.t32.vhd +set_global_assignment -name VHDL_FILE rtl/roms/6.t31.vhd +set_global_assignment -name QIP_FILE ../../../common/mist/mist.qip + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name TOP_LEVEL_ENTITY Vortex_mist + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== + set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# ------------------------- +# start ENTITY(Vortex_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top + set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top + set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Vortex_mist) +# ----------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/clean.bat b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/clean.bat new file mode 100644 index 00000000..ac9bf0a8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/clean.bat @@ -0,0 +1,16 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +del /s build_id.v +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T8080se.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T8080se.vhd new file mode 100644 index 00000000..65b92d54 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T8080se.vhd @@ -0,0 +1,194 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80_ALU.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80_ALU.vhd new file mode 100644 index 00000000..e09def1e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80_ALU.vhd @@ -0,0 +1,361 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80_MCode.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80_Pack.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80_Reg.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/T80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/Vortex_memory.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/Vortex_memory.sv new file mode 100644 index 00000000..46ef1be8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/Vortex_memory.sv @@ -0,0 +1,80 @@ + +module Vortex_memory( +input Clock, +input RW_n, +input [15:0]Addr, +input [15:0]Ram_Addr, +output [7:0]Ram_out, +input [7:0]Ram_in, +output [7:0]Rom_out +); + +wire [7:0]rom_data_0; +wire [7:0]rom_data_1; +wire [7:0]rom_data_2; +wire [7:0]rom_data_3; +wire [7:0]rom_data_4; +wire [7:0]rom_data_5; +wire [10:0]rom_addr = {Addr[11:10],~Addr[9],Addr[8:4],~Addr[3],Addr[2:1],~Addr[0]}; + +rom1t36 rom1t36 ( + .clk(Clock), + .addr(rom_addr), + .data(rom_data_0) +); + +rom2t35 rom2t35 ( + .clk(Clock), + .addr(rom_addr), + .data(rom_data_1) +); + +rom3t34 rom3t34 ( + .clk(Clock), + .addr(rom_addr), + .data(rom_data_2) +); + +rom4t33 rom4t33 ( + .clk(Clock), + .addr(rom_addr), + .data(rom_data_3) +); + +rom5t32 rom5t32 ( + .clk(Clock), + .addr(rom_addr), + .data(rom_data_4) +); + +rom6t31 rom6t31 ( + .clk(Clock), + .addr(rom_addr), + .data(rom_data_5) +); + +always @(Addr, rom_data_0, rom_data_1, rom_data_2, rom_data_3, rom_data_4, rom_data_5) begin + Rom_out = 8'b00000000; + case (Addr[15:11]) + 5'b00000 : Rom_out = rom_data_0; + 5'b00001 : Rom_out = rom_data_1; + 5'b00010 : Rom_out = rom_data_2; + 5'b00011 : Rom_out = rom_data_3; + 5'b01000 : Rom_out = rom_data_4; + 5'b01001 : Rom_out = rom_data_5; + default : Rom_out = 8'b00000000; + endcase +end + +spram #( + .addr_width_g(13), + .data_width_g(8)) +u_ram0( + .address(Ram_Addr[12:0]), + .clken(1'b1), + .clock(Clock), + .data(Ram_in), + .wren(~RW_n), + .q(Ram_out) + ); +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/Vortex_mist.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/Vortex_mist.sv new file mode 100644 index 00000000..a2b52c05 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/Vortex_mist.sv @@ -0,0 +1,191 @@ +module Vortex_mist( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Vortex;;", + "O2,Rotate Controls,Off,On;", + "O34,Scanlines,Off,25%,50%,75%;", + "T6,Reset;", + "V,v1.20.",`BUILD_DATE +}; + +assign LED = 1; +assign AUDIO_R = AUDIO_L; + + +wire clk_core, clk_sys; +wire pll_locked; +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_core), + .c1(clk_sys) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0,joystick_1; +wire scandoublerD; +wire ypbpr; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; +wire [7:0] audio; +wire hs, vs; + +wire [15:0]RAB; +wire [15:0]AD; +wire [7:0]RDB; +wire [7:0]RWD; +wire [7:0]IB; +wire [5:0]SoundCtrl3; +wire [5:0]SoundCtrl5; +wire Rst_n_s; +wire RWE_n; +wire Video; + +invaderst invaderst( + .Rst_n(~(status[0] | status[6] | buttons[1])), + .Clk(clk_core), + .ENA(), + .Coin(btn_coin), + .Sel1Player(~btn_one_player), + .Sel2Player(~btn_two_players), + .Fire(~m_fire), + .MoveLeft(~m_left), + .MoveRight(~m_right), + .MoveUp(~m_up), + .MoveDown(~m_down), + .RDB(RDB), + .IB(IB), + .RWD(RWD), + .RAB(RAB), + .AD(AD), + .SoundCtrl3(SoundCtrl3), + .SoundCtrl5(SoundCtrl5), + .Rst_n_s(Rst_n_s), + .RWE_n(RWE_n), + .Video(Video), + .HSync(hs), + .VSync(vs) + ); + +Vortex_memory Vortex_memory ( + .Clock(clk_core), + .RW_n(RWE_n), + .Addr(AD), + .Ram_Addr(RAB), + .Ram_out(RDB), + .Ram_in(RWD), + .Rom_out(IB) + ); + +invaders_audio invaders_audio ( + .Clk(clk_core), + .S1(SoundCtrl3), + .S2(SoundCtrl5), + .Aud(audio) + ); + +mist_video #(.COLOR_DEPTH(3)) mist_video( + .clk_sys(clk_sys), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({Video,Video,Video}), + .G({Video,Video,Video}), + .B({Video,Video,Video}), + .HSync(hs), + .VSync(vs), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .rotate({1'b0,status[2]}), + .scandoubler_disable(scandoublerD), + .ce_divider(0), + .scanlines(status[4:3]), + .ypbpr(ypbpr) + ); + +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac dac ( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +wire m_up = status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_up | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_down | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_left | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_right | joystick_0[0] | joystick_1[0]; +wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; + + +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_left = 0; +reg btn_right = 0; +reg btn_down = 0; +reg btn_up = 0; +reg btn_fire1 = 0; +reg btn_coin = 0; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h75: btn_up <= key_pressed; // up + 'h72: btn_down <= key_pressed; // down + 'h6B: btn_left <= key_pressed; // left + 'h74: btn_right <= key_pressed; // right + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h29: btn_fire1 <= key_pressed; // Space + endcase + end +end + +endmodule diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/invaders.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/invaders.vhd new file mode 100644 index 00000000..40003ea4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/invaders.vhd @@ -0,0 +1,283 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaderst is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire : in std_logic; + MoveLeft : in std_logic; + MoveRight : in std_logic; + MoveUp : in std_logic; + MoveDown : in std_logic; + DIP : in std_logic_vector(8 downto 1); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0); + SoundCtrl5 : out std_logic_vector(5 downto 0); + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic + ); +end invaderst; + +architecture rtl of invaderst is + + component mw8080 + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); + end component; + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(6 downto 2); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; + signal GDB_A : unsigned(1 downto 0); +begin + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; + + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; + if WD_Cnt = 255 then + Rst_n_s_i <= '0'; + end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then + WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then + if Sounds(0) = '1' and Old_S0 = '0' then + WD_Cnt <= WD_Cnt + 1; + end if; + if PortWr(6) = '1' then + WD_Cnt <= (others => '0'); + end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: mw8080 + port map( + Rst_n => Rst_n,--Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + Video => Video, + HSync => HSync, + VSync => VSync); + +-- with AD_i(9 downto 8) select +-- GDB <= GDB0 when "00", +-- GDB1 when "01", +-- GDB2 when "10", +-- S when others; + + GDB_A <= not AD_i(9) & AD_i(8); + + with GDB_A select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + S when others; + + + GDB0(0) <= '1';--IPT_UNKNOWN + GDB0(1) <= '1';--IPT_UNKNOWN + GDB0(2) <= '1';--IPT_UNKNOWN + GDB0(3) <= '1';--IPT_UNKNOWN + GDB0(4) <= '1';--IPT_UNKNOWN + GDB0(5) <= '1';--IPT_UNKNOWN + GDB0(6) <= '1';--IPT_UNKNOWN + GDB0(7) <= '1';--IPT_UNKNOWN + + GDB1(0) <= Coin; + GDB1(1) <= not Sel2Player; + GDB1(2) <= not Sel1Player; + GDB1(3) <= '1'; + GDB1(4) <= not Fire;--controller + GDB1(5) <= not MoveLeft;--controller + GDB1(6) <= not MoveRight;--controller + GDB1(7) <= '1'; + + GDB2(0) <= '0';--active high + GDB2(1) <= '0';--active high + GDB2(2) <= '0';--active high + GDB2(3) <= '0';--active high + GDB2(4) <= not Fire;--controller 2 + GDB2(5) <= not MoveLeft;--controller 2 + GDB2(6) <= not MoveRight;--controller 2 + GDB2(7) <= '0';--active low + + PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; + PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; + PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; + PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; + PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + OldSample := '0'; + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0); + end if; + if PortWr(4) = '1' and OldSample = '0' then + D5(15 downto 8) <= DB; + D5(7 downto 0) <= D5(15 downto 8); + end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0); + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/invaders_audio.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/mw8080.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/mw8080.vhd new file mode 100644 index 00000000..b9a88f96 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/mw8080.vhd @@ -0,0 +1,336 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n, Rd_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/pll.qip b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/pll.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/pll.vhd new file mode 100644 index 00000000..97a42db7 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/pll.vhd @@ -0,0 +1,382 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + sub_wire2 <= sub_wire0(1); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + c1 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 20, + clk1_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire4, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "20.000000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "ps" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "40" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "20.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK1 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "20" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/1.t36.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/1.t36.vhd new file mode 100644 index 00000000..5cd19142 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/1.t36.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom1t36 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom1t36 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"C2",X"27",X"19",X"2A",X"A7",X"7D",X"2A",X"C2",X"41",X"CD",X"C3",X"40",X"01",X"81",X"FE",X"7C", + X"13",X"20",X"44",X"23",X"E1",X"4D",X"00",X"C9",X"C3",X"19",X"1B",X"C6",X"01",X"3E",X"D6",X"32", + X"23",X"13",X"C2",X"0D",X"02",X"22",X"F3",X"C9",X"00",X"00",X"47",X"7E",X"77",X"1A",X"12",X"78", + X"20",X"F5",X"CA",X"A7",X"17",X"E4",X"A6",X"C3",X"CA",X"76",X"03",X"3D",X"93",X"C3",X"3A",X"02", + X"ED",X"C2",X"CD",X"1E",X"1F",X"92",X"1E",X"C3",X"C2",X"40",X"1F",X"54",X"92",X"CD",X"C9",X"1F", + X"20",X"E6",X"32",X"3C",X"20",X"E6",X"51",X"C3",X"CD",X"1F",X"15",X"D2",X"D2",X"C3",X"3A",X"1D", + X"51",X"C3",X"3A",X"02",X"20",X"E4",X"32",X"3C",X"3A",X"02",X"20",X"E5",X"32",X"3C",X"20",X"E5", + X"32",X"3C",X"20",X"E3",X"51",X"C3",X"21",X"02",X"20",X"E4",X"51",X"C3",X"3A",X"02",X"20",X"E3", + X"E4",X"32",X"21",X"20",X"21",X"C0",X"00",X"C9",X"21",X"00",X"32",X"97",X"20",X"E3",X"97",X"C9", + X"E5",X"20",X"CD",X"D5",X"15",X"B4",X"E1",X"D1",X"00",X"00",X"11",X"00",X"20",X"B0",X"D3",X"2A", + X"15",X"96",X"DE",X"C3",X"3A",X"15",X"20",X"E1",X"D6",X"3A",X"A7",X"20",X"D9",X"C2",X"CD",X"03", + X"20",X"E0",X"CA",X"A7",X"04",X"EE",X"CC",X"C3",X"CA",X"A7",X"04",X"EE",X"A1",X"C3",X"3A",X"01", + X"11",X"06",X"14",X"00",X"06",X"CD",X"11",X"15",X"3A",X"01",X"20",X"F6",X"0A",X"FE",X"D6",X"DA", + X"B4",X"CD",X"3A",X"15",X"20",X"D6",X"01",X"FE",X"20",X"B0",X"F0",X"21",X"22",X"32",X"20",X"D3", + X"15",X"96",X"32",X"97",X"20",X"D1",X"DA",X"32",X"1C",X"CA",X"C3",X"03",X"03",X"78",X"CD",X"00", + X"20",X"E8",X"02",X"3E",X"32",X"00",X"20",X"F5",X"32",X"20",X"20",X"D7",X"D9",X"32",X"32",X"20", + X"20",X"D2",X"02",X"3E",X"DD",X"32",X"32",X"20",X"05",X"3E",X"00",X"32",X"3E",X"20",X"32",X"10", + X"32",X"01",X"20",X"D8",X"32",X"97",X"20",X"D6",X"20",X"CF",X"10",X"3E",X"D5",X"32",X"3E",X"20", + X"97",X"13",X"F6",X"32",X"C3",X"20",X"08",X"EE",X"D0",X"32",X"00",X"20",X"00",X"00",X"66",X"C3", + X"03",X"1C",X"9E",X"C3",X"D5",X"03",X"C3",X"C5",X"12",X"FE",X"94",X"C2",X"78",X"03",X"C2",X"A7", + X"4E",X"CA",X"3E",X"03",X"47",X"20",X"E8",X"3A",X"02",X"C1",X"00",X"06",X"03",X"DB",X"08",X"E6", + X"3E",X"20",X"C3",X"22",X"03",X"60",X"20",X"3E",X"A7",X"20",X"5E",X"CA",X"3D",X"03",X"E8",X"32", + X"00",X"20",X"02",X"3E",X"E8",X"32",X"21",X"20",X"D3",X"B0",X"C3",X"01",X"05",X"89",X"DA",X"32", + X"60",X"01",X"C3",X"00",X"03",X"8E",X"48",X"CD",X"20",X"EA",X"C3",X"34",X"16",X"41",X"00",X"00", + X"D3",X"20",X"C3",X"01",X"00",X"C3",X"8D",X"21",X"C3",X"0B",X"00",X"F7",X"33",X"CA",X"3E",X"13", + X"E6",X"7D",X"C3",X"1F",X"03",X"30",X"09",X"EB",X"5D",X"31",X"46",X"54",X"7E",X"23",X"47",X"B0", + X"11",X"32",X"20",X"B0",X"E7",X"C3",X"21",X"02",X"FE",X"7C",X"C2",X"34",X"03",X"91",X"F0",X"21", + X"0C",X"11",X"21",X"01",X"22",X"C0",X"0C",X"06",X"00",X"00",X"EB",X"22",X"22",X"20",X"20",X"DB", + X"00",X"21",X"36",X"24",X"23",X"00",X"FE",X"7C",X"97",X"EF",X"CE",X"32",X"C9",X"22",X"04",X"D3", + X"3E",X"00",X"D3",X"24",X"3A",X"01",X"20",X"AF",X"C2",X"40",X"03",X"CB",X"00",X"C9",X"00",X"00", + X"C3",X"20",X"13",X"AE",X"32",X"97",X"20",X"AF",X"FF",X"FE",X"96",X"CA",X"3C",X"13",X"AF",X"32", + X"E6",X"7B",X"5F",X"E0",X"C3",X"19",X"17",X"B3",X"00",X"3E",X"01",X"D3",X"50",X"C3",X"57",X"4A", + X"C5",X"F3",X"E5",X"D5",X"C3",X"F5",X"02",X"37",X"31",X"F3",X"20",X"A0",X"C3",X"97",X"48",X"00", + X"06",X"C5",X"0E",X"A0",X"0D",X"A0",X"1D",X"C2",X"1F",X"C3",X"C2",X"40",X"00",X"28",X"00",X"C9", + X"77",X"1A",X"23",X"13",X"C3",X"05",X"00",X"13",X"05",X"00",X"04",X"D3",X"C5",X"C3",X"00",X"47", + X"06",X"20",X"21",X"0C",X"20",X"A4",X"00",X"11",X"A1",X"32",X"32",X"20",X"20",X"A2",X"A3",X"32", + X"CD",X"FB",X"09",X"43",X"00",X"00",X"D0",X"C3",X"EF",X"01",X"50",X"C3",X"CD",X"01",X"09",X"CB", + X"21",X"40",X"08",X"06",X"21",X"EF",X"21",X"80",X"11",X"06",X"01",X"18",X"08",X"06",X"21",X"EF", + X"06",X"EF",X"21",X"05",X"20",X"F6",X"21",X"EF",X"08",X"06",X"21",X"EF",X"21",X"C0",X"08",X"06", + X"22",X"00",X"01",X"21",X"36",X"20",X"23",X"00",X"00",X"00",X"ED",X"22",X"3E",X"20",X"32",X"05", + X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"7D",X"DA",X"24",X"00",X"7D",X"C6",X"CD", + X"04",X"D3",X"AE",X"CD",X"3A",X"1E",X"20",X"F5",X"00",X"00",X"27",X"21",X"22",X"00",X"20",X"03", + X"C2",X"02",X"00",X"98",X"39",X"C3",X"32",X"00",X"C2",X"A7",X"03",X"42",X"EF",X"3A",X"FE",X"20", + X"C3",X"20",X"00",X"30",X"F5",X"3A",X"A7",X"20",X"20",X"E8",X"B9",X"C3",X"00",X"06",X"F5",X"32", + X"A7",X"20",X"D3",X"C2",X"2A",X"00",X"20",X"A5",X"84",X"C3",X"C5",X"03",X"E5",X"D5",X"E2",X"3A", + X"00",X"20",X"11",X"FE",X"EA",X"D2",X"01",X"00",X"D6",X"C3",X"2A",X"00",X"20",X"A9",X"01",X"78", + X"01",X"00",X"2A",X"CD",X"A7",X"13",X"4A",X"C2",X"00",X"50",X"0E",X"FE",X"EA",X"D2",X"01",X"00", + X"C1",X"D1",X"28",X"3E",X"31",X"C3",X"00",X"13",X"22",X"01",X"20",X"A5",X"40",X"CD",X"E1",X"0B", + X"00",X"38",X"00",X"00",X"30",X"5D",X"18",X"00",X"00",X"2F",X"00",X"00",X"00",X"25",X"00",X"00", + X"3E",X"82",X"13",X"00",X"2F",X"87",X"13",X"00",X"27",X"41",X"1A",X"00",X"35",X"01",X"1A",X"00", + X"3E",X"FC",X"12",X"00",X"2F",X"95",X"12",X"00",X"28",X"FC",X"12",X"00",X"36",X"92",X"12",X"00", + X"08",X"00",X"88",X"48",X"00",X"C8",X"01",X"00",X"28",X"F9",X"11",X"00",X"2F",X"92",X"11",X"00", + X"C9",X"C1",X"A9",X"22",X"C3",X"20",X"03",X"7E",X"00",X"FE",X"FF",X"00",X"C2",X"FF",X"00",X"1B", + X"C3",X"EF",X"00",X"45",X"75",X"21",X"C3",X"00",X"ED",X"21",X"11",X"20",X"01",X"3D",X"08",X"06", + X"FE",X"20",X"C2",X"01",X"01",X"FF",X"E0",X"3A",X"09",X"03",X"00",X"00",X"00",X"00",X"F1",X"3A", + X"3E",X"20",X"32",X"01",X"20",X"F5",X"C9",X"E1",X"A7",X"20",X"0C",X"CA",X"3D",X"06",X"E0",X"32", + X"E0",X"3A",X"A7",X"20",X"95",X"C2",X"CD",X"01",X"3A",X"00",X"20",X"E2",X"C2",X"A7",X"01",X"B2", + X"C3",X"20",X"01",X"A1",X"03",X"3E",X"8F",X"C3",X"05",X"DE",X"A1",X"C3",X"3D",X"01",X"E0",X"32", + X"11",X"40",X"0B",X"98",X"17",X"21",X"C3",X"2F",X"3E",X"04",X"32",X"01",X"20",X"E2",X"08",X"CD", + X"A7",X"20",X"F8",X"C2",X"CD",X"01",X"05",X"EC",X"01",X"D5",X"32",X"97",X"20",X"E2",X"E1",X"3A", + X"02",X"AD",X"00",X"00",X"0D",X"CD",X"11",X"40",X"E0",X"3A",X"A7",X"20",X"CC",X"C2",X"C3",X"01", + X"09",X"F1",X"73",X"CD",X"11",X"04",X"22",X"ED",X"0B",X"90",X"17",X"21",X"0E",X"2F",X"CD",X"08", + X"08",X"11",X"0E",X"23",X"CD",X"F7",X"05",X"CF",X"50",X"0E",X"22",X"CD",X"21",X"02",X"21",X"08", + X"32",X"3D",X"20",X"E1",X"CC",X"C3",X"00",X"01",X"01",X"3E",X"F5",X"32",X"C3",X"20",X"03",X"29", + X"15",X"0E",X"11",X"04",X"DE",X"CD",X"C3",X"05",X"06",X"18",X"06",X"C9",X"0C",X"00",X"26",X"04", + X"F1",X"CD",X"06",X"09",X"DF",X"06",X"C2",X"05",X"04",X"EE",X"00",X"21",X"C3",X"21",X"00",X"51", + X"15",X"21",X"0E",X"2A",X"C3",X"0F",X"05",X"44",X"06",X"1D",X"0E",X"C9",X"C3",X"15",X"05",X"44", + X"32",X"97",X"20",X"F5",X"53",X"C3",X"C2",X"05",X"01",X"3E",X"F5",X"32",X"C3",X"20",X"08",X"3F", + X"C3",X"06",X"05",X"27",X"41",X"CD",X"D3",X"40",X"05",X"1E",X"AD",X"3A",X"A7",X"20",X"38",X"CA", + X"40",X"CD",X"CD",X"0B",X"0B",X"48",X"22",X"C9",X"00",X"01",X"00",X"00",X"CD",X"00",X"0B",X"20", + X"3E",X"20",X"32",X"01",X"20",X"CD",X"C9",X"E1",X"20",X"D3",X"CE",X"3A",X"3C",X"20",X"CE",X"32", + X"06",X"12",X"CD",X"3A",X"A7",X"20",X"87",X"C2",X"32",X"00",X"22",X"CE",X"CD",X"32",X"C3",X"20", + X"E6",X"01",X"CA",X"80",X"06",X"6E",X"32",X"97",X"3A",X"06",X"20",X"CE",X"61",X"C3",X"DB",X"05", + X"77",X"FC",X"A5",X"C3",X"BC",X"18",X"B1",X"D2",X"20",X"CD",X"6E",X"C3",X"EB",X"06",X"E6",X"7E", + X"B5",X"D2",X"2F",X"06",X"85",X"3C",X"E0",X"FE",X"2F",X"06",X"84",X"3C",X"02",X"FE",X"BD",X"C9", + X"11",X"06",X"01",X"0C",X"C0",X"21",X"06",X"20",X"94",X"C9",X"A4",X"C3",X"95",X"06",X"AE",X"C3", + X"E6",X"20",X"A7",X"01",X"C3",X"C0",X"19",X"5C",X"EF",X"0C",X"C8",X"C3",X"3D",X"05",X"EE",X"32", + X"8F",X"CD",X"67",X"04",X"8D",X"CD",X"84",X"04",X"CB",X"CD",X"C3",X"09",X"04",X"BB",X"23",X"3E", + X"3F",X"C3",X"00",X"08",X"1C",X"00",X"FF",X"38",X"C3",X"67",X"0C",X"AA",X"CD",X"0A",X"09",X"CB", + X"FF",X"46",X"00",X"00",X"20",X"04",X"FF",X"FF",X"00",X"00",X"49",X"92",X"00",X"FF",X"62",X"00", + X"07",X"A0",X"07",X"B0",X"07",X"C0",X"07",X"D0",X"07",X"60",X"07",X"76",X"07",X"80",X"07",X"90", + X"40",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"40",X"01",X"00",X"40",X"FF",X"FF",X"40", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"20",X"50",X"88",X"FF",X"FF",X"50",X"88",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7C",X"10",X"10",X"FF",X"FF",X"10",X"10",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"08",X"14",X"22",X"FF",X"FF",X"14",X"22",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"04",X"04",X"FF",X"FF",X"04",X"04",X"00", + X"04",X"FF",X"FF",X"04",X"04",X"04",X"04",X"FF",X"0E",X"1F",X"0E",X"FF",X"FF",X"0E",X"04",X"0E", + X"1C",X"FF",X"FF",X"08",X"00",X"08",X"FF",X"FF",X"FF",X"04",X"00",X"04",X"FF",X"FF",X"1C",X"3E", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"38",X"7C",X"38",X"FF",X"FF",X"10",X"00",X"10", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"70",X"F8",X"70",X"FF",X"FF",X"20",X"00",X"20", + X"00",X"40",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"E0",X"FC",X"00",X"07",X"E0",X"FF",X"FF",X"40", + X"FF",X"00",X"00",X"80",X"FF",X"FF",X"FF",X"FF",X"E0",X"FE",X"03",X"3F",X"E0",X"FF",X"03",X"80", + X"FF",X"01",X"00",X"00",X"00",X"01",X"FF",X"FF",X"80",X"F0",X"03",X"1F",X"80",X"FF",X"03",X"00", + X"FF",X"02",X"00",X"00",X"00",X"02",X"FF",X"FF",X"00",X"80",X"07",X"0F",X"00",X"FF",X"07",X"00", + X"FF",X"12",X"20",X"20",X"11",X"12",X"40",X"FF",X"80",X"40",X"0B",X"07",X"20",X"FF",X"01",X"00", + X"86",X"CD",X"C3",X"0C",X"13",X"17",X"00",X"00",X"0C",X"C0",X"FF",X"08",X"11",X"FF",X"1C",X"B9", + X"14",X"CD",X"3C",X"48",X"F6",X"32",X"C9",X"20",X"48",X"CD",X"C3",X"0B",X"00",X"F7",X"A0",X"FE", + X"20",X"3E",X"EA",X"32",X"CD",X"20",X"40",X"3C",X"EA",X"3A",X"FE",X"20",X"DA",X"10",X"04",X"24", + X"04",X"0B",X"45",X"CD",X"00",X"40",X"00",X"00",X"CD",X"00",X"48",X"14",X"F6",X"3A",X"C3",X"20", + X"A7",X"20",X"40",X"CA",X"2A",X"04",X"20",X"A9",X"C8",X"C3",X"3A",X"18",X"20",X"E2",X"A5",X"2A", + X"4E",X"D2",X"01",X"04",X"03",X"00",X"EB",X"CD",X"EF",X"3A",X"01",X"20",X"02",X"00",X"01",X"FE", + X"A5",X"22",X"CD",X"20",X"0B",X"40",X"67",X"C3",X"3A",X"0B",X"20",X"E2",X"C2",X"A7",X"04",X"61", + X"01",X"0C",X"0C",X"06",X"C0",X"21",X"EF",X"20",X"22",X"04",X"20",X"A9",X"48",X"CD",X"11",X"0B", + X"04",X"75",X"C0",X"21",X"11",X"20",X"22",X"C0",X"C8",X"C3",X"06",X"18",X"DF",X"06",X"C2",X"05", + X"D3",X"C9",X"DB",X"00",X"3E",X"01",X"6F",X"12",X"10",X"0E",X"22",X"CD",X"21",X"02",X"20",X"ED", + X"D5",X"E5",X"80",X"11",X"19",X"00",X"D1",X"7E",X"30",X"E6",X"0F",X"0F",X"E6",X"B5",X"C9",X"0F", + X"20",X"3E",X"01",X"D3",X"41",X"CD",X"C3",X"40",X"A7",X"E1",X"2A",X"C2",X"C3",X"19",X"1B",X"C6", + X"38",X"C3",X"97",X"0B",X"EA",X"32",X"C3",X"20",X"00",X"4E",X"7E",X"23",X"00",X"BA",X"00",X"00", + X"46",X"CD",X"00",X"40",X"3E",X"00",X"32",X"05",X"00",X"AF",X"ED",X"32",X"32",X"20",X"20",X"EE", + X"88",X"CD",X"26",X"17",X"3A",X"20",X"22",X"00",X"22",X"00",X"3E",X"C9",X"32",X"01",X"20",X"DF", + X"88",X"CD",X"C3",X"17",X"01",X"62",X"40",X"C3",X"CD",X"6F",X"18",X"8D",X"32",X"97",X"20",X"DF", + X"46",X"41",X"CD",X"1A",X"41",X"3A",X"1A",X"46",X"11",X"48",X"20",X"A3",X"1A",X"46",X"3A",X"CD", + X"46",X"20",X"CD",X"1A",X"41",X"4A",X"1A",X"46",X"3A",X"CD",X"21",X"41",X"20",X"AB",X"A3",X"11", + X"4C",X"CD",X"CD",X"06",X"03",X"C6",X"06",X"3F",X"4A",X"CD",X"46",X"41",X"CD",X"1A",X"41",X"4A", + X"21",X"04",X"30",X"17",X"70",X"11",X"CD",X"0B",X"00",X"00",X"00",X"00",X"3F",X"C3",X"0E",X"06", + X"05",X"4A",X"CA",X"A7",X"06",X"38",X"2D",X"11",X"09",X"F1",X"AD",X"3A",X"FE",X"20",X"D2",X"02", + X"06",X"30",X"74",X"11",X"21",X"0B",X"28",X"13",X"C3",X"09",X"06",X"28",X"F1",X"CD",X"C3",X"09", + X"22",X"00",X"20",X"9F",X"C9",X"00",X"7A",X"C3",X"23",X"C3",X"31",X"06",X"20",X"9F",X"42",X"21", + X"80",X"E6",X"6E",X"C2",X"11",X"06",X"20",X"B0",X"FE",X"06",X"D2",X"04",X"06",X"6E",X"FF",X"3E", + X"FE",X"20",X"CA",X"01",X"05",X"BC",X"02",X"FE",X"D3",X"2A",X"CD",X"20",X"15",X"B4",X"CE",X"3A", + X"3A",X"06",X"20",X"E3",X"3A",X"47",X"20",X"E4",X"C2",X"CA",X"21",X"05",X"29",X"9A",X"5F",X"C3", + X"20",X"E6",X"A7",X"B0",X"A8",X"CA",X"C3",X"04",X"47",X"B0",X"E5",X"3A",X"B0",X"20",X"3A",X"47", + X"C9",X"21",X"32",X"97",X"20",X"E6",X"80",X"21",X"00",X"98",X"32",X"97",X"20",X"E5",X"40",X"21", + X"08",X"06",X"C9",X"EF",X"42",X"21",X"C3",X"3A",X"C9",X"21",X"A5",X"21",X"11",X"20",X"01",X"01", + X"32",X"97",X"20",X"CE",X"71",X"C3",X"CD",X"06",X"05",X"86",X"83",X"21",X"C3",X"2B",X"05",X"86", + X"01",X"0E",X"22",X"CD",X"C9",X"02",X"17",X"21",X"02",X"22",X"CE",X"21",X"11",X"20",X"22",X"CE", + X"C3",X"09",X"05",X"F7",X"17",X"21",X"11",X"2F",X"11",X"2F",X"0B",X"90",X"08",X"0E",X"F1",X"CD", + X"2E",X"15",X"03",X"11",X"0E",X"06",X"C3",X"09",X"0B",X"98",X"08",X"0E",X"F1",X"CD",X"21",X"09"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/2.t35.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/2.t35.vhd new file mode 100644 index 00000000..4b813941 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/2.t35.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom2t35 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom2t35 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"49",X"7F",X"49",X"49",X"00",X"36",X"00",X"00",X"24",X"1F",X"24",X"44",X"00",X"1F",X"00",X"00", + X"41",X"7F",X"41",X"41",X"00",X"3E",X"00",X"00",X"41",X"3E",X"41",X"41",X"00",X"22",X"00",X"00", + X"70",X"C3",X"FF",X"4A",X"FF",X"FF",X"01",X"FF",X"49",X"7F",X"49",X"49",X"00",X"41",X"00",X"00", + X"08",X"7F",X"08",X"08",X"00",X"7F",X"00",X"00",X"41",X"3E",X"45",X"41",X"00",X"47",X"00",X"00", + X"9C",X"CD",X"57",X"01",X"3D",X"84",X"67",X"3D",X"41",X"00",X"41",X"7F",X"00",X"00",X"00",X"00", + X"01",X"7F",X"01",X"01",X"00",X"01",X"00",X"00",X"3D",X"3D",X"87",X"5F",X"C3",X"87",X"1D",X"FC", + X"10",X"7F",X"04",X"08",X"00",X"7F",X"00",X"00",X"20",X"7F",X"20",X"18",X"00",X"7F",X"00",X"00", + X"48",X"7F",X"48",X"48",X"00",X"30",X"00",X"00",X"41",X"3E",X"41",X"41",X"00",X"3E",X"00",X"00", + X"48",X"7F",X"4A",X"4C",X"00",X"31",X"00",X"00",X"07",X"00",X"7E",X"1E",X"07",X"1E",X"00",X"00", + X"40",X"40",X"40",X"7F",X"00",X"40",X"00",X"00",X"49",X"32",X"49",X"49",X"00",X"26",X"00",X"00", + X"06",X"78",X"06",X"01",X"00",X"78",X"00",X"00",X"01",X"7E",X"01",X"01",X"00",X"7E",X"00",X"00", + X"14",X"63",X"14",X"08",X"00",X"63",X"00",X"00",X"F1",X"CD",X"CD",X"09",X"09",X"CE",X"14",X"C9", + X"45",X"43",X"51",X"49",X"00",X"61",X"00",X"00",X"10",X"60",X"10",X"0F",X"00",X"60",X"00",X"00", + X"00",X"00",X"7F",X"21",X"00",X"01",X"00",X"00",X"3E",X"00",X"49",X"45",X"3E",X"51",X"00",X"00", + X"42",X"00",X"49",X"41",X"66",X"59",X"00",X"00",X"23",X"00",X"49",X"45",X"31",X"49",X"00",X"00", + X"72",X"00",X"51",X"51",X"4E",X"51",X"00",X"00",X"0C",X"00",X"24",X"14",X"04",X"7F",X"00",X"00", + X"40",X"00",X"48",X"47",X"60",X"50",X"00",X"00",X"1E",X"00",X"49",X"29",X"46",X"49",X"00",X"00", + X"31",X"00",X"49",X"49",X"3C",X"4A",X"00",X"00",X"36",X"00",X"49",X"49",X"36",X"49",X"00",X"00", + X"5F",X"20",X"01",X"21",X"C3",X"3C",X"0B",X"D2",X"A1",X"21",X"C3",X"20",X"40",X"FE",X"AD",X"3A", + X"7E",X"23",X"00",X"BB",X"00",X"00",X"E9",X"E1",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"A9",X"21",X"C3",X"20",X"40",X"FE",X"00",X"00",X"A5",X"21",X"C3",X"20",X"40",X"FE",X"00",X"00", + X"26",X"26",X"08",X"07",X"12",X"26",X"0E",X"02",X"12",X"26",X"0E",X"02",X"04",X"11",X"1B",X"26", + X"26",X"04",X"26",X"1C",X"0B",X"0F",X"18",X"00",X"04",X"11",X"26",X"26",X"02",X"12",X"11",X"0E", + X"1C",X"26",X"0F",X"26",X"00",X"0B",X"04",X"18",X"14",X"0F",X"07",X"12",X"26",X"1B",X"11",X"0E", + X"02",X"0D",X"04",X"11",X"08",X"03",X"26",X"13",X"12",X"11",X"01",X"26",X"13",X"14",X"0E",X"13", + X"0B",X"0F",X"18",X"00",X"11",X"04",X"1C",X"26",X"0B",X"0F",X"18",X"00",X"11",X"04",X"1B",X"26", + X"0A",X"00",X"26",X"E5",X"6F",X"00",X"29",X"29",X"0F",X"26",X"08",X"0E",X"13",X"0D",X"11",X"12", + X"1A",X"C5",X"13",X"77",X"20",X"01",X"09",X"00",X"19",X"29",X"E1",X"EB",X"08",X"06",X"04",X"D3", + X"23",X"56",X"23",X"7E",X"6F",X"66",X"CD",X"7A",X"05",X"C1",X"B8",X"C2",X"C9",X"0B",X"23",X"5E", + X"E6",X"0F",X"CD",X"0F",X"0B",X"E6",X"E6",X"F1",X"0B",X"D3",X"D5",X"7B",X"0F",X"F5",X"0F",X"0F", + X"3C",X"C3",X"AF",X"09",X"81",X"7D",X"6F",X"27",X"CD",X"0F",X"0B",X"E6",X"C9",X"D1",X"1A",X"C6", + X"11",X"0E",X"04",X"13",X"26",X"17",X"76",X"F3",X"88",X"7C",X"C3",X"27",X"41",X"1B",X"15",X"26", + X"30",X"17",X"70",X"11",X"CD",X"0B",X"0A",X"B0",X"3F",X"FE",X"F8",X"C2",X"0E",X"17",X"21",X"04", + X"01",X"06",X"05",X"FB",X"1A",X"C2",X"CD",X"08",X"0F",X"0E",X"15",X"21",X"C3",X"2A",X"09",X"0D", + X"20",X"AD",X"0E",X"6F",X"CD",X"01",X"0B",X"EB",X"0A",X"28",X"18",X"C2",X"26",X"08",X"3A",X"00", + X"20",X"AD",X"99",X"FE",X"53",X"D2",X"CD",X"08",X"32",X"7D",X"20",X"AD",X"26",X"CD",X"3A",X"0B", + X"0B",X"74",X"13",X"21",X"CD",X"28",X"09",X"F1",X"0A",X"28",X"53",X"CA",X"0E",X"08",X"11",X"15", + X"62",X"DA",X"DB",X"08",X"E6",X"03",X"C2",X"02",X"18",X"C3",X"3A",X"08",X"20",X"AD",X"02",X"FE", + X"3E",X"09",X"C3",X"01",X"08",X"7B",X"16",X"CD",X"08",X"6E",X"03",X"DB",X"04",X"E6",X"08",X"CA", + X"3E",X"20",X"32",X"02",X"20",X"F1",X"16",X"CD",X"DB",X"09",X"E6",X"02",X"3C",X"03",X"E1",X"32", + X"32",X"3C",X"20",X"E0",X"C6",X"CD",X"00",X"03",X"CD",X"09",X"0B",X"26",X"02",X"DB",X"03",X"E6", + X"08",X"0E",X"17",X"21",X"11",X"2F",X"0B",X"90",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"7D",X"E5",X"DD",X"C6",X"24",X"6F",X"B8",X"7E",X"F1",X"CD",X"C3",X"09",X"08",X"BC",X"44",X"4D", + X"FE",X"81",X"C9",X"81",X"AF",X"CD",X"21",X"03",X"7E",X"23",X"C3",X"B9",X"04",X"B2",X"E6",X"F3", + X"08",X"06",X"21",X"EF",X"23",X"80",X"08",X"06",X"23",X"00",X"08",X"06",X"21",X"EF",X"23",X"40", + X"DF",X"09",X"C2",X"05",X"08",X"D9",X"F6",X"21",X"21",X"EF",X"23",X"C0",X"08",X"06",X"06",X"EF", + X"EF",X"22",X"CD",X"97",X"1C",X"00",X"9F",X"31",X"06",X"22",X"EF",X"05",X"08",X"06",X"ED",X"21", + X"B4",X"7D",X"B2",X"B3",X"C2",X"A7",X"01",X"5C",X"2A",X"20",X"20",X"A5",X"2A",X"EB",X"20",X"A9", + X"04",X"D3",X"37",X"C3",X"11",X"08",X"09",X"2D",X"4E",X"21",X"22",X"00",X"20",X"9F",X"C9",X"FB", + X"3D",X"20",X"E6",X"47",X"FE",X"0F",X"C2",X"0F",X"F1",X"CD",X"C3",X"09",X"08",X"18",X"AD",X"3A", + X"32",X"78",X"20",X"AD",X"1B",X"C9",X"0F",X"26",X"09",X"28",X"E6",X"78",X"F6",X"F0",X"47",X"09", + X"13",X"13",X"0D",X"0E",X"CD",X"00",X"0B",X"A7",X"00",X"0B",X"04",X"18",X"26",X"11",X"14",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CD",X"C9",X"4A",X"C4",X"00",X"00", + X"DF",X"00",X"21",X"DF",X"28",X"10",X"F7",X"CD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"D2",X"CD",X"DF",X"0B",X"10",X"21",X"0E",X"35",X"DF",X"0C",X"10",X"21",X"1E",X"33",X"00",X"20", + X"28",X"0C",X"F5",X"CD",X"DF",X"10",X"0C",X"21",X"11",X"07",X"0B",X"A0",X"BB",X"CD",X"21",X"09", + X"00",X"00",X"0C",X"21",X"0E",X"35",X"11",X"07",X"1E",X"33",X"00",X"50",X"D2",X"CD",X"DF",X"0B", + X"F5",X"CD",X"DF",X"07",X"08",X"21",X"11",X"31",X"0B",X"A0",X"BB",X"CD",X"21",X"09",X"28",X"08", + X"08",X"21",X"0E",X"35",X"11",X"07",X"0B",X"A0",X"C1",X"00",X"CE",X"CD",X"DF",X"0B",X"00",X"00", + X"FF",X"FF",X"1A",X"FF",X"00",X"D5",X"A7",X"CD",X"BB",X"CD",X"CD",X"09",X"40",X"4C",X"FF",X"C9", + X"09",X"BB",X"CD",X"C9",X"1C",X"F3",X"1C",X"0E",X"00",X"0B",X"DF",X"D1",X"00",X"13",X"C2",X"0D", + X"CD",X"09",X"0B",X"40",X"20",X"CD",X"CD",X"0B",X"1E",X"21",X"11",X"24",X"0B",X"50",X"F1",X"CD", + X"0B",X"89",X"F1",X"CD",X"C3",X"09",X"0D",X"DB",X"0B",X"48",X"07",X"0E",X"01",X"21",X"11",X"35", + X"00",X"D1",X"0D",X"13",X"F1",X"C2",X"C9",X"09",X"1A",X"C9",X"00",X"D5",X"A7",X"CD",X"00",X"0B", + X"0C",X"E2",X"0D",X"10",X"0D",X"25",X"0D",X"3A",X"0C",X"8E",X"0C",X"A3",X"0C",X"B8",X"0C",X"CD", + X"FF",X"7F",X"80",X"00",X"E3",X"7F",X"80",X"FF",X"00",X"00",X"3E",X"3E",X"00",X"FF",X"3E",X"00", + X"80",X"C1",X"01",X"01",X"C0",X"FF",X"80",X"20",X"E3",X"C0",X"00",X"C1",X"FF",X"01",X"C0",X"C0", + X"00",X"02",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"01",X"00",X"FF",X"02",X"00",X"20",X"00",X"00", + X"00",X"FF",X"38",X"00",X"FF",X"7C",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"01",X"C6",X"01",X"00",X"00",X"FF",X"EE",X"7C",X"00",X"FF",X"EE",X"00",X"FF",X"C6", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"01",X"00",X"01",X"00",X"FF",X"00",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"FF",X"F8",X"00",X"FF",X"F8",X"00",X"00",X"FF",X"FF",X"00",X"00",X"F8",X"FC",X"00",X"01", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"20",X"F8",X"00",X"FF",X"20",X"00",X"FF",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"00",X"FF",X"FC",X"00",X"07",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"FF",X"F0",X"00",X"01",X"40",X"FF",X"00",X"FF",X"01",X"00",X"00",X"F0",X"F0",X"01",X"01", + X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"40",X"40",X"00",X"FF",X"40",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0C",X"86",X"10",X"21",X"C3",X"2E",X"0F",X"F5",X"FF",X"FF",X"FF",X"FF",X"A6",X"11",X"CD",X"10", + X"0C",X"3A",X"0C",X"4F",X"0C",X"64",X"0C",X"79",X"06",X"EB",X"0C",X"10",X"0C",X"25",X"07",X"E0", + X"DC",X"00",X"0F",X"F4",X"FF",X"0F",X"00",X"00",X"00",X"00",X"EC",X"EC",X"0F",X"0F",X"00",X"FF", + X"12",X"F2",X"FF",X"03",X"00",X"00",X"E3",X"E0",X"FA",X"38",X"07",X"17",X"00",X"FF",X"F0",X"00", + X"FF",X"00",X"00",X"00",X"07",X"00",X"00",X"38",X"01",X"31",X"00",X"FF",X"00",X"00",X"3E",X"1F", + X"00",X"FF",X"EE",X"00",X"06",X"FA",X"FF",X"07",X"FF",X"FF",X"00",X"00",X"F6",X"F6",X"05",X"05", + X"78",X"00",X"09",X"F9",X"FF",X"01",X"80",X"00",X"00",X"00",X"FD",X"9C",X"03",X"0B",X"00",X"FF", + X"1F",X"0F",X"FF",X"00",X"80",X"00",X"03",X"00",X"F1",X"F0",X"00",X"18",X"00",X"FF",X"00",X"80", + X"02",X"02",X"00",X"FF",X"37",X"00",X"03",X"3D",X"00",X"1C",X"FF",X"FF",X"00",X"00",X"1B",X"1B", + X"00",X"FF",X"BC",X"80",X"04",X"FC",X"FF",X"00",X"FF",X"03",X"80",X"00",X"FE",X"CE",X"01",X"05", + X"80",X"C0",X"0F",X"07",X"FF",X"00",X"C0",X"00",X"C0",X"00",X"78",X"78",X"00",X"0C",X"00",X"FF", + X"05",X"0D",X"01",X"01",X"80",X"FF",X"9B",X"80",X"01",X"00",X"00",X"0E",X"FF",X"FF",X"80",X"80", + X"00",X"02",X"00",X"FF",X"5E",X"40",X"02",X"7E",X"01",X"86",X"FF",X"01",X"40",X"00",X"CF",X"E7", + X"00",X"FF",X"C0",X"E0",X"07",X"03",X"FF",X"00",X"FF",X"00",X"60",X"00",X"3C",X"3C",X"00",X"06", + X"80",X"80",X"3F",X"2F",X"80",X"FF",X"3F",X"80",X"E0",X"00",X"00",X"00",X"00",X"07",X"FF",X"FF", + X"0D",X"00",X"FF",X"07",X"00",X"00",X"02",X"07",X"FF",X"0D",X"80",X"80",X"0F",X"0F",X"80",X"FF", + X"86",X"CD",X"C9",X"0C",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"11",X"FF",X"11",X"10", + X"07",X"20",X"07",X"30",X"07",X"40",X"07",X"50",X"1E",X"7A",X"1E",X"8A",X"1E",X"9A",X"07",X"10", + X"FF",X"09",X"00",X"00",X"10",X"02",X"00",X"FF",X"80",X"80",X"4E",X"5C",X"00",X"FF",X"24",X"00", + X"FF",X"27",X"00",X"40",X"24",X"02",X"00",X"FF",X"0C",X"00",X"FF",X"0C",X"40",X"FF",X"1E",X"80", + X"FF",X"FF",X"80",X"C0",X"03",X"01",X"20",X"FF",X"02",X"00",X"FF",X"04",X"00",X"00",X"03",X"0C", + X"40",X"FF",X"00",X"00",X"FF",X"02",X"C8",X"FF",X"09",X"90",X"FF",X"04",X"60",X"20",X"04",X"06", + X"20",X"FF",X"00",X"00",X"FF",X"01",X"C0",X"C0",X"05",X"E8",X"FF",X"04",X"90",X"40",X"00",X"02", + X"12",X"FF",X"00",X"20",X"FF",X"01",X"20",X"10",X"FF",X"FF",X"FF",X"FF",X"3C",X"F2",X"01",X"00", + X"3A",X"FF",X"FF",X"5C",X"90",X"09",X"91",X"FF",X"60",X"FF",X"FF",X"18",X"FF",X"FF",X"FF",X"FF", + X"DF",X"1D",X"C9",X"DF",X"FF",X"FF",X"30",X"30",X"FF",X"89",X"46",X"62",X"FF",X"FF",X"AA",X"CD", + X"C3",X"F1",X"00",X"08",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3E",X"F5",X"32",X"AA",X"22",X"48", + X"FF",X"FF",X"EB",X"CD",X"84",X"19",X"C3",X"67",X"FF",X"FF",X"F0",X"FF",X"FF",X"F0",X"60",X"60", + X"F0",X"F0",X"03",X"03",X"E0",X"FF",X"01",X"E0",X"0A",X"48",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"F0",X"FF",X"0F",X"F0",X"FF",X"01",X"C0",X"C0",X"FF",X"FF",X"FF",X"FF", + X"07",X"E0",X"FF",X"07",X"C0",X"C0",X"03",X"03",X"FF",X"0F",X"F0",X"F0",X"0F",X"0F",X"E0",X"FF", + X"1F",X"E0",X"FF",X"1F",X"C0",X"C0",X"0F",X"0F",X"FF",X"FF",X"E0",X"E0",X"1F",X"1F",X"E0",X"FF", + X"1E",X"41",X"86",X"CD",X"C3",X"0C",X"0D",X"FA",X"80",X"FF",X"07",X"80",X"FF",X"07",X"11",X"FF", + X"1D",X"21",X"1D",X"31",X"1D",X"41",X"1E",X"31",X"1C",X"B9",X"1C",X"C9",X"1C",X"D9",X"1D",X"11", + X"FF",X"0F",X"00",X"00",X"06",X"06",X"FF",X"FF",X"80",X"80",X"1F",X"1F",X"00",X"FF",X"0F",X"00", + X"FF",X"1E",X"00",X"00",X"0C",X"0C",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"1E",X"00", + X"FF",X"FF",X"00",X"00",X"18",X"18",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"C0",X"FF",X"07",X"00",X"00",X"01",X"FF",X"00",X"1F",X"C0",X"FF",X"07",X"C0",X"C0",X"07",X"07", + X"FF",X"00",X"D2",X"FF",X"08",X"53",X"C5",X"F5",X"00",X"00",X"01",X"01",X"00",X"FF",X"01",X"00", + X"86",X"41",X"47",X"23",X"A7",X"7D",X"9D",X"CA",X"26",X"E5",X"2E",X"0B",X"6E",X"DE",X"F3",X"3A", + X"80",X"C0",X"0F",X"1F",X"80",X"FF",X"0F",X"80",X"78",X"0D",X"79",X"C3",X"FF",X"0D",X"FF",X"FF", + X"02",X"00",X"FF",X"00",X"78",X"FF",X"C0",X"A7",X"FF",X"0F",X"00",X"80",X"02",X"0F",X"00",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"C1",X"E1",X"C3",X"F1",X"08",X"3F",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"AA",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3B",X"1F",X"80",X"FF",X"3B",X"80",X"FF",X"31",X"00",X"FF",X"0E",X"00",X"FF",X"1F",X"80",X"00", + X"FF",X"00",X"CD",X"FF",X"0B",X"26",X"03",X"0E",X"40",X"80",X"40",X"31",X"40",X"FF",X"40",X"00", + X"C9",X"48",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"9C",X"21",X"11",X"30",X"22",X"51",X"2C",X"CD", + X"FF",X"FF",X"10",X"21",X"C3",X"2B",X"0E",X"F4",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/3.t34.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/3.t34.vhd new file mode 100644 index 00000000..40698213 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/3.t34.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom3t34 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom3t34 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"10",X"10",X"10",X"42",X"10",X"74",X"10",X"A6",X"0F",X"10",X"0F",X"42",X"0F",X"74",X"0F",X"A6", + X"E3",X"F0",X"07",X"E3",X"FF",X"07",X"E0",X"E0",X"30",X"30",X"7F",X"7F",X"06",X"06",X"F0",X"FF", + X"70",X"2A",X"3E",X"12",X"86",X"00",X"CA",X"A7",X"C1",X"C1",X"03",X"03",X"FF",X"FF",X"E5",X"F5", + X"C2",X"C3",X"16",X"41",X"F1",X"E1",X"DC",X"C3",X"12",X"36",X"C3",X"23",X"12",X"2D",X"FE",X"7D", + X"00",X"FF",X"1F",X"00",X"00",X"E0",X"FF",X"03",X"FF",X"13",X"00",X"00",X"F0",X"1E",X"01",X"00", + X"19",X"00",X"00",X"60",X"FF",X"06",X"00",X"00",X"00",X"80",X"60",X"19",X"06",X"00",X"80",X"FF", + X"00",X"80",X"FF",X"01",X"FF",X"FF",X"FF",X"FF",X"C0",X"0F",X"03",X"00",X"00",X"FF",X"06",X"00", + X"00",X"FF",X"18",X"00",X"FF",X"3C",X"00",X"00",X"40",X"8E",X"FF",X"FF",X"00",X"00",X"18",X"18", + X"00",X"00",X"66",X"66",X"00",X"FF",X"66",X"00",X"7E",X"3C",X"00",X"FF",X"7E",X"00",X"FF",X"66", + X"3C",X"00",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"7E",X"00",X"00",X"3C",X"7E",X"00",X"FF", + X"3E",X"F0",X"00",X"01",X"00",X"FF",X"E0",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"00",X"06",X"00",X"FF",X"60",X"80",X"06",X"19",X"03",X"1F",X"FF",X"00",X"80",X"00",X"19",X"60", + X"00",X"FF",X"80",X"00",X"01",X"06",X"FF",X"00",X"FF",X"00",X"00",X"00",X"0F",X"C0",X"00",X"03", + X"E0",X"60",X"0F",X"0B",X"E0",X"FF",X"0F",X"60",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"03",X"C0",X"FF",X"01",X"80",X"C0",X"00",X"01",X"FF",X"03",X"E0",X"60",X"03",X"03",X"E0",X"FF", + X"0B",X"21",X"C3",X"2E",X"13",X"10",X"00",X"00",X"80",X"FF",X"FF",X"00",X"CD",X"FF",X"0C",X"86", + X"0E",X"10",X"0E",X"49",X"0E",X"82",X"0E",X"BB",X"1E",X"41",X"0D",X"4F",X"0D",X"88",X"0D",X"C1", + X"2B",X"08",X"50",X"11",X"CD",X"07",X"0C",X"86",X"10",X"11",X"CD",X"0D",X"0C",X"86",X"21",X"C9", + X"C9",X"0C",X"EB",X"CD",X"3A",X"0B",X"20",X"E2",X"08",X"21",X"11",X"2E",X"07",X"60",X"86",X"CD", + X"97",X"23",X"C3",X"77",X"19",X"67",X"FE",X"78",X"D3",X"C9",X"05",X"01",X"05",X"05",X"C9",X"78", + X"CD",X"20",X"19",X"72",X"77",X"78",X"FE",X"3D",X"C3",X"40",X"11",X"61",X"FF",X"FF",X"FA",X"3A", + X"7B",X"23",X"FA",X"32",X"C3",X"20",X"1F",X"41",X"C2",X"0B",X"13",X"56",X"07",X"3E",X"13",X"12", + X"11",X"26",X"13",X"86",X"E2",X"3A",X"A7",X"20",X"97",X"23",X"C3",X"77",X"1F",X"3E",X"01",X"21", + X"3A",X"12",X"20",X"E0",X"DC",X"C3",X"CD",X"13",X"79",X"CA",X"3A",X"13",X"20",X"E1",X"26",X"C3", + X"10",X"10",X"10",X"10",X"26",X"10",X"26",X"26",X"09",X"F1",X"D1",X"C1",X"C9",X"E1",X"10",X"10", + X"2A",X"13",X"20",X"D3",X"CD",X"2B",X"1D",X"58",X"26",X"26",X"26",X"26",X"26",X"26",X"C7",X"11", + X"F1",X"CD",X"C3",X"09",X"03",X"EC",X"01",X"E6",X"01",X"21",X"0E",X"26",X"11",X"09",X"13",X"8D", + X"C1",X"CA",X"CD",X"13",X"1D",X"58",X"7D",X"C3",X"D3",X"2A",X"2B",X"20",X"C7",X"11",X"A7",X"13", + X"15",X"AA",X"FF",X"2B",X"B4",X"54",X"56",X"6B",X"CD",X"16",X"1D",X"AA",X"7D",X"C3",X"D8",X"16", + X"04",X"01",X"FF",X"FF",X"CA",X"A7",X"13",X"82",X"A8",X"FF",X"14",X"28",X"FF",X"09",X"80",X"10", + X"3E",X"13",X"C3",X"02",X"1F",X"71",X"E2",X"CA",X"A7",X"00",X"82",X"CA",X"4F",X"13",X"7F",X"C3", + X"A7",X"20",X"E2",X"CA",X"C3",X"18",X"04",X"33",X"FE",X"18",X"C2",X"02",X"18",X"57",X"F5",X"3A", + X"1C",X"65",X"1C",X"7A",X"1C",X"8F",X"1C",X"A4",X"1C",X"11",X"1C",X"26",X"1C",X"3B",X"1C",X"50", + X"FF",X"C1",X"A0",X"80",X"61",X"73",X"00",X"01",X"C0",X"C0",X"82",X"86",X"C0",X"FF",X"CD",X"40", + X"30",X"00",X"1E",X"1E",X"00",X"03",X"00",X"FF",X"00",X"FF",X"2F",X"20",X"01",X"33",X"FF",X"00", + X"00",X"80",X"00",X"03",X"FF",X"FF",X"FF",X"FF",X"E0",X"F0",X"03",X"01",X"FF",X"00",X"70",X"00", + X"7E",X"A0",X"FF",X"60",X"D0",X"C0",X"30",X"B9",X"FF",X"FF",X"60",X"60",X"61",X"73",X"E0",X"FF", + X"0F",X"8F",X"00",X"01",X"00",X"FF",X"F0",X"F8",X"80",X"FF",X"97",X"90",X"FF",X"19",X"18",X"00", + X"00",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"01",X"00",X"FF",X"00",X"38",X"00",X"00",X"C0", + X"70",X"FF",X"3F",X"50",X"FF",X"3C",X"68",X"E0",X"FF",X"FF",X"FF",X"FF",X"B0",X"B0",X"3E",X"3F", + X"8C",X"80",X"07",X"C7",X"00",X"FF",X"F8",X"7C",X"18",X"5C",X"C0",X"FF",X"4B",X"C8",X"FF",X"0C", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"1C",X"00",X"00",X"E0",X"FF",X"FF", + X"1F",X"1F",X"B8",X"FF",X"1F",X"E8",X"FF",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"D8",X"D8", + X"FF",X"06",X"C6",X"C0",X"03",X"63",X"00",X"FF",X"B4",X"70",X"0F",X"2E",X"E0",X"FF",X"25",X"64", + X"FF",X"FF",X"E0",X"07",X"FF",X"00",X"FF",X"FF",X"7C",X"3E",X"FF",X"00",X"0E",X"00",X"00",X"70", + X"C0",X"C0",X"1F",X"17",X"C0",X"FF",X"1E",X"C0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"07",X"80",X"FF",X"03",X"00",X"80",X"01",X"03",X"FF",X"07",X"C0",X"C0",X"06",X"07",X"C0",X"FF", + X"86",X"CD",X"C3",X"0C",X"11",X"F6",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"11",X"FF",X"1C",X"11", + X"12",X"10",X"12",X"42",X"12",X"74",X"12",X"A6",X"11",X"10",X"11",X"42",X"11",X"74",X"11",X"A6", + X"FF",X"7E",X"1E",X"1E",X"3C",X"3C",X"FF",X"FF",X"F3",X"F3",X"67",X"67",X"3F",X"FF",X"7E",X"3F", + X"32",X"3D",X"22",X"43",X"C3",X"F1",X"03",X"66",X"3A",X"F5",X"22",X"43",X"CA",X"A7",X"11",X"2C", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"FF",X"1F",X"00",X"CC",X"33",X"00",X"FF",X"FF",X"80",X"F0",X"0F",X"01",X"F8",X"FF", + X"1E",X"00",X"30",X"FF",X"00",X"00",X"FF",X"0C",X"CC",X"FF",X"00",X"00",X"FF",X"33",X"00",X"78", + X"FE",X"00",X"DA",X"0C",X"13",X"60",X"46",X"C3",X"DA",X"FF",X"11",X"66",X"0C",X"06",X"BC",X"CD", + X"00",X"FF",X"06",X"00",X"FF",X"0F",X"80",X"00",X"FF",X"13",X"FF",X"FF",X"00",X"00",X"06",X"06", + X"80",X"80",X"19",X"19",X"80",X"FF",X"19",X"80",X"1F",X"0F",X"80",X"FF",X"1F",X"80",X"FF",X"19", + X"0F",X"00",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"00",X"80",X"0F",X"1F",X"00",X"FF", + X"0F",X"7C",X"00",X"FF",X"F8",X"C0",X"FF",X"07",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"80",X"00", + X"98",X"60",X"01",X"06",X"FF",X"00",X"C0",X"00",X"60",X"00",X"06",X"98",X"00",X"01",X"00",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"03",X"F0",X"00",X"FF",X"60",X"80",X"FF",X"01", + X"00",X"00",X"7B",X"5F",X"00",X"FF",X"7F",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"1F",X"00",X"FF",X"0E",X"00",X"00",X"04",X"0E",X"FF",X"1F",X"00",X"00",X"1F",X"1B",X"00",X"FF", + X"11",X"2B",X"0C",X"79",X"F5",X"C3",X"00",X"12",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"0C",X"21", + X"E6",X"3D",X"32",X"1F",X"20",X"D1",X"01",X"3E",X"32",X"10",X"20",X"D0",X"D1",X"3A",X"3D",X"20", + X"E5",X"20",X"CD",X"D5",X"15",X"B4",X"00",X"CD",X"D8",X"32",X"11",X"20",X"20",X"B0",X"D3",X"2A", + X"00",X"00",X"96",X"CD",X"3A",X"15",X"20",X"DA",X"D1",X"15",X"3A",X"E1",X"20",X"D6",X"00",X"A7", + X"CA",X"A7",X"16",X"7D",X"03",X"3E",X"20",X"C3",X"C2",X"A7",X"16",X"87",X"ED",X"CD",X"00",X"40", + X"16",X"5F",X"1A",X"17",X"02",X"32",X"13",X"20",X"97",X"11",X"05",X"32",X"3A",X"20",X"20",X"D1", + X"03",X"32",X"7D",X"20",X"04",X"32",X"CD",X"20",X"32",X"1A",X"20",X"01",X"D3",X"2A",X"7C",X"20", + X"32",X"97",X"20",X"DF",X"00",X"3A",X"6F",X"22",X"17",X"88",X"20",X"26",X"DF",X"3A",X"F5",X"20", + X"17",X"88",X"5E",X"C3",X"3A",X"05",X"20",X"CF",X"8D",X"CD",X"F1",X"18",X"DF",X"32",X"CD",X"20", + X"40",X"ED",X"A7",X"00",X"7D",X"C2",X"21",X"16",X"C2",X"A7",X"1B",X"87",X"12",X"C3",X"CD",X"1B", + X"16",X"AA",X"D0",X"3A",X"C6",X"20",X"32",X"10",X"20",X"DA",X"C3",X"35",X"16",X"7D",X"D2",X"07", + X"16",X"09",X"DD",X"3A",X"47",X"20",X"D5",X"3A",X"20",X"D0",X"D1",X"3A",X"3C",X"20",X"C3",X"3C", + X"20",X"D5",X"ED",X"CD",X"00",X"40",X"C3",X"A7",X"90",X"20",X"96",X"D2",X"3E",X"1B",X"32",X"50", + X"3A",X"17",X"20",X"DD",X"50",X"FE",X"D5",X"D2",X"42",X"20",X"D8",X"3A",X"A7",X"20",X"6F",X"C2", + X"D3",X"2A",X"E5",X"20",X"B4",X"CD",X"00",X"15",X"3C",X"16",X"DD",X"32",X"11",X"20",X"20",X"B0", + X"20",X"D9",X"16",X"5F",X"1A",X"17",X"B7",X"4F",X"33",X"C3",X"00",X"18",X"00",X"00",X"3A",X"E1", + X"17",X"17",X"5F",X"17",X"C3",X"9F",X"03",X"F7",X"13",X"17",X"CE",X"1A",X"B7",X"00",X"17",X"17", + X"FF",X"FE",X"00",X"FE",X"00",X"FF",X"01",X"FF",X"FF",X"00",X"FD",X"FF",X"FE",X"FF",X"FE",X"FE", + X"00",X"02",X"FF",X"02",X"FF",X"01",X"FE",X"01",X"01",X"00",X"02",X"01",X"01",X"01",X"01",X"02", + X"DA",X"03",X"17",X"49",X"3C",X"2F",X"A7",X"4F",X"7B",X"57",X"E0",X"E6",X"3E",X"26",X"FE",X"79", + X"3C",X"20",X"07",X"E6",X"D7",X"32",X"3E",X"20",X"63",X"CA",X"CD",X"17",X"1B",X"9C",X"D7",X"3A", + X"A7",X"17",X"63",X"CA",X"CD",X"17",X"15",X"14",X"32",X"01",X"20",X"D2",X"79",X"0D",X"2F",X"C3", + X"3E",X"20",X"32",X"01",X"20",X"D2",X"79",X"0D",X"D7",X"3A",X"3C",X"20",X"07",X"E6",X"D7",X"32", + X"CD",X"20",X"15",X"96",X"7D",X"C3",X"3A",X"1B",X"49",X"C3",X"22",X"17",X"20",X"D3",X"B0",X"11", + X"D2",X"C3",X"3A",X"16",X"20",X"D7",X"C2",X"A7",X"20",X"DD",X"03",X"FE",X"7B",X"C3",X"3D",X"17", + X"00",X"3A",X"47",X"22",X"00",X"3A",X"32",X"20",X"16",X"D5",X"D1",X"3A",X"C3",X"20",X"1B",X"73", + X"EB",X"20",X"DB",X"2A",X"22",X"20",X"20",X"EB",X"22",X"00",X"32",X"78",X"20",X"00",X"EB",X"2A", + X"AE",X"3A",X"32",X"20",X"20",X"EE",X"32",X"78",X"22",X"EB",X"20",X"DB",X"EE",X"3A",X"47",X"20", + X"7C",X"19",X"25",X"FE",X"24",X"DA",X"FE",X"17",X"20",X"AE",X"79",X"C9",X"C2",X"A7",X"17",X"B9", + X"C3",X"27",X"17",X"26",X"21",X"E5",X"20",X"B1",X"DA",X"3E",X"17",X"26",X"26",X"CA",X"26",X"17", + X"13",X"13",X"23",X"23",X"FE",X"7D",X"C2",X"C1",X"B0",X"11",X"1A",X"20",X"7E",X"47",X"70",X"12", + X"17",X"F0",X"E1",X"F1",X"C1",X"D1",X"C9",X"FB",X"17",X"D3",X"C9",X"E1",X"F0",X"C3",X"C2",X"1A", + X"00",X"00",X"00",X"00",X"05",X"C3",X"00",X"08",X"01",X"3E",X"F5",X"32",X"CD",X"20",X"03",X"C6", + X"C0",X"07",X"00",X"01",X"40",X"04",X"00",X"01",X"80",X"03",X"80",X"03",X"C0",X"07",X"80",X"03", + X"C0",X"00",X"C0",X"00",X"40",X"00",X"40",X"00",X"C0",X"07",X"C0",X"03",X"C0",X"0F",X"C0",X"01", + X"80",X"01",X"60",X"00",X"00",X"01",X"00",X"00",X"C0",X"0F",X"C0",X"07",X"80",X"01",X"E0",X"01", + X"00",X"03",X"00",X"00",X"00",X"02",X"00",X"00",X"C0",X"03",X"E0",X"07",X"80",X"03",X"F0",X"0F", + X"00",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"03",X"E0",X"03",X"E0",X"03",X"00",X"07", + X"F8",X"07",X"00",X"01",X"00",X"00",X"00",X"00",X"E0",X"01",X"C0",X"01",X"F0",X"03",X"80",X"01", + X"F0",X"00",X"80",X"00",X"30",X"00",X"00",X"00",X"E0",X"07",X"C0",X"00",X"E0",X"03",X"C0",X"00", + X"60",X"00",X"60",X"00",X"20",X"00",X"20",X"00",X"E0",X"01",X"E0",X"03",X"E0",X"00",X"E0",X"07", + X"80",X"00",X"E0",X"03",X"80",X"00",X"20",X"02",X"C0",X"01",X"C0",X"01",X"C0",X"01",X"E0",X"03", + X"00",X"03",X"00",X"03",X"00",X"02",X"00",X"02",X"C0",X"03",X"E0",X"03",X"80",X"03",X"F0",X"03", + X"00",X"06",X"80",X"01",X"00",X"00",X"80",X"00",X"E0",X"03",X"F0",X"03",X"80",X"07",X"80",X"01", + X"00",X"00",X"C0",X"00",X"00",X"00",X"40",X"00",X"E0",X"07",X"C0",X"03",X"F0",X"0F",X"C0",X"01", + X"00",X"00",X"E0",X"00",X"00",X"00",X"00",X"00",X"C0",X"07",X"C0",X"1F",X"E0",X"00",X"C0",X"07", + X"20",X"00",X"F8",X"07",X"00",X"00",X"00",X"00",X"E0",X"00",X"E0",X"01",X"60",X"00",X"F0",X"03", + X"40",X"00",X"C0",X"03",X"00",X"00",X"00",X"03",X"C0",X"00",X"F8",X"01",X"C0",X"00",X"F0",X"01", + X"00",X"03",X"00",X"03",X"00",X"02",X"00",X"02",X"E0",X"03",X"C0",X"03",X"F0",X"03",X"80",X"03", + X"1A",X"20",X"7D",X"77",X"BF",X"FE",X"13",X"C8",X"D0",X"3A",X"5F",X"20",X"14",X"16",X"B0",X"21", + X"20",X"B1",X"1A",X"B7",X"12",X"17",X"1B",X"4F",X"C3",X"23",X"15",X"09",X"06",X"C5",X"11",X"00", + X"CA",X"BE",X"15",X"32",X"13",X"13",X"C3",X"13",X"17",X"1A",X"79",X"12",X"47",X"B0",X"FE",X"7B", + X"17",X"CC",X"00",X"00",X"B6",X"1A",X"13",X"77",X"15",X"1A",X"C1",X"78",X"C0",X"A7",X"C3",X"23", + X"69",X"60",X"77",X"B6",X"2B",X"13",X"B6",X"1A",X"1A",X"2B",X"77",X"B6",X"23",X"13",X"E5",X"1A", + X"A6",X"2F",X"E6",X"77",X"CA",X"07",X"15",X"65",X"23",X"77",X"44",X"13",X"E1",X"4D",X"1A",X"C9", + X"A6",X"2F",X"E6",X"77",X"CA",X"E0",X"15",X"75",X"01",X"3E",X"D6",X"32",X"13",X"20",X"1A",X"2B", + X"E5",X"2F",X"69",X"60",X"77",X"A6",X"07",X"E6",X"01",X"3E",X"D6",X"32",X"13",X"20",X"1A",X"23", + X"2B",X"13",X"2F",X"1A",X"77",X"A6",X"E0",X"E6",X"88",X"CA",X"3E",X"15",X"32",X"01",X"20",X"D6", + X"4F",X"20",X"DE",X"7C",X"47",X"00",X"3C",X"CD",X"19",X"CA",X"C3",X"02",X"02",X"14",X"D6",X"7D", + X"1D",X"82",X"3C",X"CD",X"CD",X"15",X"1D",X"82",X"CD",X"15",X"1D",X"82",X"3C",X"CD",X"CD",X"15", + X"DE",X"7C",X"47",X"00",X"57",X"CD",X"CD",X"15",X"3C",X"CD",X"C9",X"15",X"D6",X"7D",X"4F",X"20", + X"57",X"CD",X"CD",X"15",X"1D",X"82",X"57",X"CD",X"1D",X"82",X"57",X"CD",X"CD",X"15",X"1D",X"82", + X"E5",X"01",X"31",X"C3",X"00",X"02",X"D2",X"3A",X"C9",X"15",X"F5",X"3A",X"A7",X"20",X"FE",X"C8", + X"3A",X"16",X"20",X"D7",X"C2",X"A7",X"16",X"AA",X"3D",X"20",X"D2",X"32",X"A7",X"20",X"AA",X"C2", + X"D2",X"00",X"16",X"96",X"D0",X"3A",X"D6",X"20",X"10",X"3E",X"D2",X"32",X"C3",X"20",X"40",X"DA"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/4.t33.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/4.t33.vhd new file mode 100644 index 00000000..f19c46b3 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/4.t33.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom4t33 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom4t33 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"41",X"9F",X"41",X"BE",X"41",X"DD",X"41",X"FC",X"1A",X"A5",X"1A",X"B8",X"1A",X"D3",X"41",X"80", + X"3A",X"1A",X"20",X"DB",X"A7",X"CD",X"D2",X"06",X"DC",X"3A",X"CD",X"20",X"06",X"9D",X"29",X"D2", + X"3A",X"19",X"20",X"FB",X"E6",X"C3",X"00",X"1D",X"1A",X"29",X"1F",X"E6",X"03",X"FE",X"F0",X"DA", + X"01",X"07",X"F0",X"FF",X"01",X"F0",X"FF",X"01",X"F0",X"00",X"05",X"B0",X"FF",X"07",X"F0",X"F0", + X"00",X"40",X"FF",X"FF",X"FF",X"FF",X"F8",X"D8",X"E0",X"B0",X"00",X"01",X"E0",X"FF",X"FF",X"40", + X"F8",X"F8",X"F8",X"FF",X"FF",X"50",X"20",X"70",X"03",X"02",X"F8",X"FF",X"03",X"F8",X"FF",X"00", + X"FF",X"00",X"7C",X"FF",X"01",X"FC",X"FF",X"01",X"20",X"FF",X"FF",X"00",X"7F",X"FF",X"00",X"00", + X"38",X"6C",X"38",X"FF",X"FF",X"10",X"00",X"10",X"7C",X"FC",X"00",X"01",X"7C",X"FF",X"FF",X"7C", + X"FE",X"BE",X"FE",X"FF",X"FF",X"36",X"3E",X"36",X"FF",X"FF",X"00",X"3F",X"00",X"00",X"FF",X"FF", + X"FF",X"00",X"00",X"FF",X"F8",X"FE",X"1F",X"00",X"3E",X"FF",X"FF",X"1C",X"08",X"1C",X"08",X"FF", + X"BD",X"EF",X"BF",X"FF",X"FF",X"EA",X"6C",X"AE",X"00",X"00",X"FF",X"00",X"EF",X"FF",X"FF",X"EF", + X"D2",X"DE",X"01",X"01",X"DE",X"FF",X"01",X"7E",X"6C",X"FF",X"FF",X"28",X"00",X"28",X"FF",X"FF", + X"01",X"D8",X"FF",X"00",X"50",X"D8",X"50",X"FF",X"FF",X"01",X"DC",X"7E",X"01",X"01",X"DC",X"FF", + X"FC",X"A4",X"02",X"02",X"FC",X"FF",X"02",X"B8",X"FF",X"00",X"BC",X"FF",X"03",X"BC",X"FF",X"03", + X"01",X"A0",X"FF",X"00",X"00",X"A0",X"FF",X"FF",X"FF",X"03",X"B0",X"B8",X"01",X"03",X"B0",X"FF", + X"28",X"CD",X"C3",X"0A",X"17",X"E7",X"FF",X"FF",X"A3",X"3A",X"FE",X"20",X"D2",X"01",X"1E",X"5F", + X"32",X"F1",X"20",X"DF",X"88",X"CD",X"C3",X"17",X"FF",X"FF",X"FF",X"FF",X"CD",X"FF",X"18",X"8D", + X"FE",X"1B",X"CA",X"80",X"1B",X"C0",X"8E",X"C3",X"16",X"E6",X"D1",X"3A",X"A7",X"20",X"C0",X"CA", + X"A7",X"E1",X"10",X"CA",X"FE",X"19",X"CA",X"01",X"E5",X"1B",X"7E",X"24",X"B6",X"23",X"B6",X"23", + X"67",X"00",X"49",X"C3",X"EB",X"18",X"C3",X"2B",X"19",X"10",X"D6",X"7D",X"6F",X"20",X"DE",X"7C", + X"18",X"49",X"15",X"FE",X"5C",X"D2",X"FE",X"1B",X"1B",X"DD",X"E6",X"7D",X"FE",X"1F",X"D2",X"19", + X"C3",X"1B",X"18",X"49",X"25",X"E5",X"23",X"7E",X"D2",X"10",X"18",X"49",X"09",X"FE",X"21",X"DA", + X"D6",X"7D",X"6F",X"20",X"DE",X"7C",X"67",X"00",X"23",X"B6",X"E1",X"B6",X"C2",X"A7",X"18",X"81", + X"20",X"D8",X"2D",X"C3",X"3A",X"16",X"20",X"D7",X"49",X"C3",X"32",X"18",X"20",X"D9",X"32",X"97", + X"CF",X"32",X"C3",X"20",X"05",X"5E",X"0F",X"3E",X"CA",X"A7",X"16",X"2D",X"7D",X"C3",X"3D",X"16", + X"C3",X"20",X"1B",X"7D",X"06",X"C5",X"11",X"00",X"CF",X"32",X"C3",X"20",X"16",X"5F",X"D5",X"32", + X"1F",X"1A",X"79",X"12",X"47",X"B0",X"FE",X"7B",X"20",X"B0",X"1A",X"B7",X"12",X"1F",X"13",X"4F", + X"C1",X"78",X"C0",X"A7",X"C3",X"2B",X"17",X"CC",X"CA",X"BF",X"1B",X"B8",X"C3",X"13",X"1B",X"A2", + X"EB",X"77",X"23",X"23",X"23",X"23",X"3C",X"7E",X"08",X"3E",X"90",X"C3",X"00",X"1B",X"03",X"3E", + X"77",X"23",X"D6",X"7D",X"6F",X"0A",X"00",X"00",X"70",X"23",X"71",X"23",X"72",X"23",X"73",X"23", + X"32",X"05",X"22",X"00",X"81",X"C9",X"0F",X"E6",X"C2",X"A7",X"19",X"26",X"00",X"3A",X"C6",X"22", + X"32",X"0F",X"20",X"ED",X"21",X"C3",X"00",X"1B",X"12",X"4F",X"ED",X"3A",X"3C",X"20",X"E6",X"3C", + X"12",X"D8",X"10",X"D8",X"0F",X"D8",X"11",X"D8",X"1A",X"88",X"1A",X"6B",X"1A",X"4E",X"1A",X"31", + X"42",X"C2",X"3A",X"1B",X"20",X"F4",X"00",X"85",X"E6",X"81",X"4F",X"0F",X"1B",X"D1",X"A7",X"12", + X"3D",X"20",X"ED",X"C3",X"D1",X"1B",X"24",X"24",X"3A",X"6F",X"20",X"F3",X"67",X"8C",X"F4",X"3A", + X"DF",X"3A",X"F5",X"20",X"32",X"97",X"20",X"DF",X"D2",X"C3",X"CD",X"1F",X"17",X"88",X"20",X"26", + X"1B",X"00",X"12",X"7C",X"7D",X"1B",X"3A",X"12",X"00",X"3A",X"6F",X"22",X"05",X"C3",X"00",X"1B", + X"1D",X"A5",X"EE",X"3A",X"A7",X"20",X"C5",X"C2",X"20",X"DF",X"01",X"FE",X"EE",X"C3",X"CD",X"13", + X"22",X"05",X"ED",X"3A",X"5F",X"20",X"19",X"16",X"3E",X"06",X"32",X"0C",X"20",X"EE",X"32",X"97", + X"FE",X"22",X"D2",X"02",X"19",X"1B",X"54",X"C3",X"32",X"1A",X"22",X"02",X"1A",X"13",X"01",X"32", + X"00",X"18",X"26",X"6F",X"7E",X"22",X"FE",X"2B",X"FE",X"19",X"CA",X"01",X"1B",X"68",X"49",X"C3", + X"F9",X"CA",X"57",X"1F",X"77",X"97",X"4E",X"2B",X"CA",X"0C",X"1F",X"7A",X"2B",X"5E",X"A7",X"7E", + X"A7",X"00",X"F8",X"C2",X"09",X"18",X"FE",X"7C",X"46",X"2B",X"95",X"C3",X"3A",X"06",X"20",X"DF", + X"26",X"18",X"7E",X"27",X"C2",X"A7",X"02",X"06",X"DA",X"25",X"18",X"C3",X"3E",X"FE",X"BB",X"DA", + X"01",X"3E",X"DF",X"32",X"3A",X"20",X"20",X"EF",X"98",X"C3",X"26",X"04",X"C3",X"3E",X"18",X"BB", + X"01",X"3E",X"F4",X"32",X"3E",X"20",X"32",X"02",X"32",X"3C",X"20",X"EF",X"32",X"97",X"20",X"F3", + X"18",X"ED",X"8A",X"CD",X"97",X"18",X"F6",X"32",X"20",X"F0",X"00",X"3A",X"FE",X"22",X"CA",X"05", + X"2B",X"EB",X"C3",X"7D",X"1B",X"E0",X"00",X"00",X"32",X"20",X"20",X"DF",X"C2",X"C3",X"C9",X"04", + X"00",X"01",X"FF",X"01",X"FF",X"00",X"FE",X"FF",X"FF",X"FF",X"FF",X"00",X"01",X"00",X"01",X"01", + X"49",X"C3",X"79",X"18",X"04",X"32",X"78",X"22",X"C6",X"7D",X"6F",X"20",X"CE",X"7C",X"67",X"00", + X"18",X"94",X"EB",X"22",X"C3",X"20",X"1B",X"C6",X"03",X"32",X"C3",X"22",X"19",X"5C",X"C3",X"2B", + X"06",X"9D",X"10",X"D2",X"3A",X"1A",X"20",X"EB",X"32",X"97",X"20",X"DF",X"EC",X"3A",X"CD",X"20", + X"03",X"FE",X"F0",X"DA",X"00",X"19",X"10",X"C3",X"A7",X"CD",X"D2",X"06",X"1A",X"10",X"1F",X"E6", + X"32",X"7C",X"22",X"03",X"00",X"3A",X"CD",X"22",X"C3",X"1A",X"1D",X"E6",X"32",X"7D",X"22",X"04", + X"23",X"23",X"F9",X"3A",X"BD",X"20",X"41",X"C3",X"18",X"8A",X"CA",X"C9",X"19",X"D0",X"23",X"23", + X"7E",X"23",X"13",X"12",X"7E",X"23",X"13",X"12",X"00",X"02",X"16",X"5F",X"7E",X"21",X"13",X"12", + X"19",X"9D",X"F9",X"3A",X"CD",X"20",X"19",X"72",X"C9",X"23",X"BC",X"CD",X"FE",X"00",X"DA",X"0D", + X"20",X"F9",X"D9",X"C3",X"23",X"1E",X"77",X"97",X"77",X"78",X"12",X"3D",X"23",X"13",X"32",X"7B", + X"CA",X"DA",X"3A",X"19",X"20",X"F8",X"72",X"CD",X"D6",X"C3",X"CD",X"1E",X"00",X"BC",X"07",X"FE", + X"43",X"60",X"FF",X"FF",X"FF",X"FF",X"3C",X"77",X"78",X"19",X"0B",X"FE",X"BE",X"C2",X"C3",X"19", + X"1F",X"17",X"97",X"23",X"C3",X"77",X"1F",X"14",X"13",X"12",X"7B",X"23",X"F8",X"32",X"C3",X"20", + X"F7",X"3A",X"CD",X"20",X"19",X"72",X"77",X"78",X"BC",X"CD",X"FE",X"00",X"DA",X"0C",X"13",X"38", + X"6A",X"C3",X"3E",X"19",X"C3",X"30",X"04",X"8F",X"12",X"3C",X"23",X"13",X"32",X"7B",X"20",X"F7", + X"DB",X"32",X"32",X"20",X"20",X"DC",X"00",X"C9",X"57",X"97",X"EB",X"32",X"32",X"20",X"20",X"EC", + X"20",X"FE",X"67",X"8C",X"25",X"FE",X"25",X"DA",X"1C",X"0A",X"FF",X"3A",X"85",X"20",X"3A",X"6F", + X"26",X"1E",X"1B",X"25",X"12",X"7C",X"7D",X"1B",X"FE",X"1E",X"DA",X"3E",X"1E",X"1B",X"1B",X"CA", + X"1E",X"1B",X"5F",X"1A",X"B3",X"0A",X"BC",X"C3",X"CD",X"12",X"1D",X"A5",X"26",X"C9",X"C3",X"3E", + X"0F",X"07",X"00",X"FF",X"00",X"00",X"FF",X"07",X"80",X"1D",X"09",X"80",X"FF",X"0B",X"80",X"00", + X"01",X"07",X"C0",X"FF",X"01",X"C0",X"FF",X"01",X"FE",X"FF",X"3F",X"F0",X"FF",X"07",X"C0",X"F0", + X"80",X"80",X"80",X"FF",X"FF",X"00",X"21",X"FF",X"80",X"C0",X"00",X"01",X"80",X"FF",X"FF",X"80", + X"C2",X"19",X"18",X"49",X"23",X"23",X"FE",X"7E",X"40",X"7F",X"11",X"3E",X"6F",X"85",X"FE",X"7E", + X"FF",X"FF",X"00",X"00",X"02",X"05",X"80",X"FF",X"C2",X"08",X"06",X"A7",X"F8",X"C3",X"FF",X"1A", + X"FF",X"FF",X"C0",X"00",X"07",X"01",X"00",X"FF",X"08",X"00",X"FF",X"05",X"80",X"00",X"08",X"00", + X"FF",X"FF",X"80",X"40",X"00",X"01",X"20",X"FF",X"01",X"00",X"FF",X"01",X"00",X"00",X"01",X"00", + X"FF",X"FF",X"EB",X"97",X"00",X"E9",X"02",X"3E",X"02",X"40",X"FF",X"01",X"20",X"00",X"02",X"00", + X"21",X"20",X"E0",X"FF",X"FE",X"22",X"CD",X"20",X"FB",X"32",X"21",X"20",X"01",X"00",X"FC",X"22", + X"00",X"1E",X"E5",X"2B",X"75",X"CD",X"E1",X"02",X"02",X"7F",X"23",X"00",X"A7",X"7E",X"D6",X"CA", + X"3A",X"23",X"20",X"F7",X"C2",X"BD",X"1E",X"C2",X"A7",X"7A",X"82",X"CA",X"23",X"19",X"23",X"23", + X"20",X"FE",X"87",X"CD",X"23",X"02",X"A7",X"7E",X"CD",X"00",X"1F",X"92",X"00",X"21",X"22",X"20", + X"7A",X"E1",X"C3",X"A7",X"1F",X"10",X"00",X"00",X"14",X"CA",X"2B",X"1F",X"CD",X"E5",X"02",X"6B", + X"FF",X"01",X"00",X"00",X"00",X"01",X"FF",X"FF",X"80",X"80",X"03",X"07",X"80",X"FF",X"03",X"00", + X"20",X"FA",X"C3",X"BD",X"02",X"48",X"02",X"3E",X"A3",X"CA",X"23",X"19",X"23",X"23",X"3A",X"23", + X"CD",X"20",X"05",X"A2",X"7E",X"23",X"CA",X"A7",X"FB",X"32",X"21",X"20",X"FF",X"FF",X"FC",X"22", + X"A7",X"7A",X"3E",X"CA",X"23",X"13",X"23",X"23",X"1F",X"3E",X"E5",X"2B",X"61",X"CD",X"E1",X"02", + X"92",X"CD",X"21",X"1F",X"E0",X"FF",X"FE",X"22",X"3A",X"23",X"20",X"F8",X"C2",X"BD",X"1F",X"2C", + X"19",X"67",X"E5",X"2B",X"57",X"CD",X"E1",X"02",X"CD",X"20",X"05",X"AA",X"7E",X"23",X"CA",X"A7", + X"1F",X"74",X"03",X"FE",X"E9",X"CA",X"3E",X"13",X"A7",X"7A",X"63",X"C3",X"00",X"19",X"CA",X"A7", + X"1D",X"70",X"2B",X"5E",X"97",X"56",X"CA",X"BA",X"32",X"01",X"20",X"DF",X"13",X"03",X"C3",X"23", + X"03",X"AA",X"2B",X"1C",X"2B",X"2B",X"C3",X"7D",X"1F",X"8B",X"77",X"12",X"8B",X"C3",X"1E",X"1F", + X"3A",X"04",X"20",X"F6",X"06",X"C3",X"3A",X"04",X"1F",X"EA",X"F5",X"3A",X"A7",X"20",X"10",X"C2", + X"CA",X"02",X"1F",X"B8",X"C8",X"21",X"C3",X"20",X"20",X"EF",X"01",X"FE",X"B2",X"CA",X"FE",X"1F", + X"C4",X"21",X"5E",X"20",X"56",X"23",X"4E",X"23",X"1F",X"BB",X"C0",X"21",X"C3",X"20",X"1F",X"BB", + X"E1",X"1D",X"C1",X"D1",X"E6",X"7D",X"CA",X"1F",X"46",X"23",X"C5",X"EB",X"E5",X"D5",X"53",X"CD", + X"5F",X"8B",X"F3",X"3A",X"8A",X"20",X"1A",X"57",X"04",X"2A",X"54",X"D5",X"3A",X"5D",X"20",X"F4", + X"18",X"10",X"00",X"32",X"C3",X"22",X"1B",X"DE",X"C2",X"A7",X"18",X"2D",X"F0",X"3A",X"C3",X"20", + X"2B",X"1D",X"2B",X"2B",X"C3",X"7D",X"1B",X"DE",X"FE",X"79",X"DA",X"20",X"1D",X"A1",X"97",X"C3", + X"C9",X"09",X"00",X"D3",X"02",X"D3",X"A6",X"C3",X"00",X"CD",X"CD",X"40",X"05",X"B2",X"CB",X"CD", + X"FF",X"0F",X"0F",X"F0",X"FF",X"FF",X"FF",X"FF",X"F0",X"08",X"FF",X"0F",X"0F",X"F0",X"F0",X"FF", + X"60",X"FF",X"FF",X"18",X"18",X"60",X"60",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"18",X"60", + X"FF",X"FF",X"30",X"FF",X"FF",X"C0",X"C0",X"30",X"FF",X"18",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"30",X"FF",X"FF",X"C0",X"C0",X"30",X"FF",X"FF", + X"FF",X"07",X"80",X"78",X"07",X"00",X"78",X"FF",X"80",X"78",X"07",X"00",X"78",X"FF",X"00",X"80", + X"FF",X"0F",X"00",X"F0",X"0F",X"00",X"F0",X"FF",X"00",X"80",X"FF",X"07",X"F0",X"FF",X"00",X"00", + X"FF",X"FF",X"00",X"E0",X"1E",X"01",X"E0",X"FF",X"00",X"00",X"FF",X"0F",X"00",X"F0",X"0F",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"01",X"00",X"FF",X"1E",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3C",X"C0",X"FF",X"03",X"C0",X"00",X"03",X"3C", + X"00",X"FF",X"78",X"80",X"FF",X"07",X"80",X"00",X"FF",X"FF",X"FF",X"FF",X"80",X"00",X"07",X"78", + X"11",X"FF",X"FF",X"1F",X"1F",X"0E",X"00",X"FF",X"07",X"78",X"00",X"FF",X"78",X"80",X"FF",X"07", + X"32",X"FF",X"FF",X"3A",X"3E",X"1C",X"00",X"FF",X"FF",X"0E",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"74",X"FF",X"FF",X"74",X"74",X"38",X"00",X"FF",X"FF",X"1C",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"02",X"FF",X"D1",X"B6",X"66",X"C3",X"00",X"1F",X"FF",X"38",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"7C",X"23",X"40",X"FE",X"F6",X"C2",X"C9",X"1C",X"00",X"00",X"21",X"00",X"24",X"00",X"00",X"36", + X"FF",X"00",X"00",X"80",X"FF",X"FF",X"FF",X"FF",X"C0",X"C0",X"01",X"03",X"C0",X"FF",X"01",X"80", + X"FF",X"70",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F8",X"00",X"FF",X"E8",X"C8",X"70",X"00",X"FF", + X"01",X"00",X"00",X"FF",X"FF",X"E0",X"FF",X"FF",X"F0",X"FF",X"01",X"F0",X"FF",X"01",X"10",X"E0", + X"02",X"01",X"00",X"FF",X"00",X"C0",X"FF",X"01",X"E0",X"FF",X"03",X"E0",X"FF",X"02",X"60",X"C0", + X"05",X"03",X"00",X"FF",X"00",X"80",X"FF",X"03",X"C0",X"FF",X"05",X"C0",X"FF",X"05",X"C0",X"80", + X"D6",X"7D",X"4F",X"20",X"DE",X"7C",X"47",X"00",X"00",X"FF",X"0A",X"00",X"03",X"5F",X"57",X"0A", + X"2F",X"1A",X"0A",X"5F",X"C3",X"A3",X"1C",X"E9",X"C5",X"E5",X"2F",X"1A",X"77",X"A6",X"D5",X"13", + X"81",X"CD",X"FE",X"1D",X"C2",X"FF",X"1D",X"60",X"FE",X"1A",X"C2",X"FF",X"1D",X"63",X"E1",X"C1", + X"67",X"00",X"D6",X"79",X"4F",X"20",X"DE",X"78",X"13",X"C9",X"C6",X"7D",X"6F",X"20",X"CE",X"7C", + X"40",X"FE",X"9F",X"DA",X"26",X"1D",X"1A",X"25",X"47",X"00",X"25",X"FE",X"F0",X"DA",X"7C",X"1F", + X"57",X"0A",X"D6",X"7D",X"4F",X"20",X"DE",X"7C",X"06",X"C9",X"1A",X"3E",X"0A",X"C9",X"03",X"5F", + X"C3",X"D5",X"1E",X"2A",X"D1",X"02",X"13",X"03",X"47",X"00",X"C5",X"E5",X"B6",X"1A",X"13",X"77", + X"CD",X"E1",X"1D",X"81",X"FF",X"FE",X"B2",X"C2",X"1A",X"23",X"FF",X"FE",X"B5",X"C2",X"C1",X"1D", + X"EB",X"46",X"D5",X"C5",X"CD",X"E5",X"1D",X"53",X"C9",X"1D",X"23",X"5E",X"23",X"56",X"23",X"4E", + X"1B",X"0F",X"4F",X"12",X"02",X"C2",X"3A",X"1E",X"D1",X"E1",X"C3",X"C1",X"19",X"30",X"E6",X"81", + X"C3",X"67",X"1E",X"02",X"3A",X"C6",X"C3",X"6F",X"20",X"FD",X"6F",X"85",X"FC",X"3A",X"8C",X"20"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/5.t32.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/5.t32.vhd new file mode 100644 index 00000000..db8a803b --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/5.t32.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom5t32 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom5t32 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"77",X"5E",X"00",X"FF",X"75",X"00",X"FF",X"36",X"80",X"FF",X"77",X"80",X"FF",X"5F",X"00",X"80", + X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"14",X"36",X"00",X"FF",X"14",X"00", + X"16",X"C2",X"32",X"3D",X"22",X"42",X"6F",X"C3",X"31",X"CA",X"3A",X"42",X"22",X"42",X"CA",X"A7", + X"DD",X"32",X"C3",X"20",X"17",X"6F",X"FF",X"FF",X"3E",X"17",X"32",X"05",X"22",X"42",X"06",X"3E", + X"26",X"1D",X"CA",X"A7",X"42",X"55",X"43",X"3A",X"43",X"3A",X"A7",X"22",X"F2",X"CA",X"3A",X"45", + X"33",X"FE",X"65",X"DA",X"3E",X"42",X"32",X"01",X"3D",X"22",X"43",X"32",X"3A",X"22",X"20",X"D4", + X"00",X"22",X"00",X"00",X"D3",X"2A",X"3E",X"20",X"22",X"49",X"7B",X"C3",X"AF",X"42",X"49",X"32", + X"86",X"C3",X"2A",X"42",X"20",X"D3",X"26",X"7C",X"94",X"3D",X"D6",X"85",X"6F",X"01",X"3D",X"26", + X"3E",X"22",X"32",X"00",X"22",X"46",X"3A",X"C9",X"94",X"25",X"D6",X"85",X"6F",X"02",X"44",X"22", + X"A7",X"42",X"B2",X"CA",X"AF",X"42",X"48",X"32",X"20",X"E2",X"3A",X"A7",X"22",X"48",X"AA",X"CA", + X"C9",X"42",X"CA",X"A7",X"42",X"A1",X"32",X"AF",X"3A",X"22",X"22",X"45",X"33",X"FE",X"BB",X"D2", + X"42",X"BB",X"3A",X"C9",X"22",X"47",X"CA",X"A7",X"22",X"48",X"45",X"3A",X"FE",X"22",X"DA",X"33", + X"32",X"01",X"22",X"47",X"49",X"3A",X"A7",X"22",X"42",X"C7",X"32",X"3D",X"22",X"47",X"3E",X"C9", + X"17",X"D2",X"CD",X"43",X"42",X"E9",X"58",X"CD",X"78",X"C2",X"3A",X"47",X"22",X"45",X"26",X"FE", + X"2A",X"47",X"22",X"44",X"43",X"06",X"46",X"3A",X"3E",X"1D",X"32",X"A0",X"22",X"43",X"F2",X"C3", + X"57",X"0A",X"FF",X"C9",X"FF",X"FF",X"FF",X"FF",X"E6",X"22",X"87",X"03",X"0A",X"4F",X"03",X"5F", + X"44",X"2A",X"06",X"22",X"C3",X"47",X"42",X"EE",X"45",X"05",X"44",X"4F",X"44",X"AC",X"44",X"00", + X"42",X"E9",X"58",X"CD",X"3A",X"1D",X"22",X"46",X"49",X"3A",X"A7",X"22",X"8E",X"C2",X"CD",X"47", + X"22",X"44",X"D6",X"7D",X"6F",X"40",X"DE",X"7C",X"32",X"3C",X"22",X"46",X"03",X"E6",X"2A",X"F5", + X"2A",X"43",X"22",X"44",X"C6",X"7D",X"6F",X"1F",X"67",X"00",X"44",X"22",X"F1",X"22",X"47",X"C2", + X"42",X"E9",X"AA",X"CD",X"C9",X"1D",X"40",X"CD",X"CE",X"7C",X"67",X"00",X"44",X"22",X"CD",X"22", + X"40",X"A9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CD",X"42",X"46",X"D6",X"28",X"CD",X"C3",X"0A", + X"20",X"AB",X"01",X"FE",X"7A",X"DA",X"3E",X"43",X"E2",X"3A",X"A7",X"20",X"74",X"CA",X"3A",X"43", + X"43",X"6A",X"0C",X"3E",X"07",X"36",X"C0",X"C3",X"C3",X"46",X"43",X"7C",X"A7",X"3A",X"C3",X"20", + X"0F",X"07",X"00",X"FF",X"07",X"00",X"FF",X"07",X"80",X"19",X"0F",X"C0",X"FF",X"1F",X"80",X"00", + X"FF",X"07",X"00",X"00",X"07",X"07",X"00",X"FF",X"00",X"00",X"07",X"07",X"00",X"FF",X"07",X"00", + X"00",X"FF",X"02",X"00",X"FF",X"07",X"00",X"00",X"07",X"00",X"FF",X"07",X"00",X"00",X"07",X"07", + X"00",X"00",X"02",X"02",X"00",X"FF",X"02",X"00",X"02",X"02",X"00",X"FF",X"02",X"00",X"FF",X"02", + X"00",X"00",X"04",X"0E",X"00",X"FF",X"04",X"00",X"FF",X"02",X"00",X"00",X"02",X"00",X"FF",X"FF", + X"00",X"00",X"00",X"08",X"FF",X"FF",X"00",X"C0",X"FF",X"00",X"00",X"FF",X"1C",X"00",X"FF",X"08", + X"FF",X"10",X"00",X"00",X"00",X"10",X"FF",X"FF",X"38",X"EF",X"00",X"07",X"00",X"FF",X"38",X"00", + X"00",X"00",X"01",X"00",X"FF",X"00",X"FF",X"FF",X"00",X"00",X"00",X"80",X"01",X"03",X"00",X"FF", + X"20",X"3E",X"0F",X"C3",X"3E",X"40",X"D3",X"00",X"E2",X"32",X"3E",X"20",X"D3",X"20",X"C9",X"01", + X"40",X"FE",X"14",X"C2",X"DF",X"40",X"C3",X"C9",X"21",X"07",X"24",X"00",X"00",X"36",X"7C",X"23", + X"E2",X"3A",X"A7",X"20",X"35",X"CA",X"F1",X"40",X"0C",X"92",X"FF",X"FF",X"FF",X"FF",X"F5",X"FF", + X"3B",X"3B",X"C9",X"F1",X"10",X"3E",X"27",X"C3",X"20",X"F6",X"36",X"C3",X"F1",X"40",X"07",X"D3", + X"C3",X"20",X"40",X"27",X"04",X"21",X"11",X"3E",X"97",X"40",X"27",X"C3",X"97",X"40",X"EA",X"32", + X"CD",X"D5",X"09",X"F1",X"11",X"00",X"FD",X"E0",X"40",X"90",X"00",X"06",X"02",X"0E",X"C5",X"E5", + X"C2",X"D5",X"40",X"59",X"C1",X"D1",X"04",X"E1",X"7C",X"19",X"C1",X"D1",X"FE",X"90",X"C5",X"2C", + X"13",X"13",X"DF",X"D5",X"59",X"C3",X"DF",X"40",X"FE",X"78",X"CA",X"0B",X"40",X"7F",X"C5",X"E5", + X"20",X"C3",X"FF",X"4E",X"FF",X"FF",X"EA",X"3B",X"DF",X"DF",X"DF",X"DF",X"DF",X"DF",X"DF",X"DF", + X"26",X"02",X"26",X"26",X"26",X"06",X"26",X"00",X"26",X"19",X"26",X"08",X"26",X"0B",X"26",X"04", + X"CA",X"43",X"17",X"EA",X"28",X"CD",X"C2",X"0A",X"26",X"0C",X"26",X"04",X"26",X"12",X"4E",X"C3", + X"17",X"EA",X"3C",X"A7",X"32",X"27",X"20",X"AD",X"40",X"AC",X"AD",X"3A",X"FE",X"20",X"CA",X"99", + X"F3",X"08",X"45",X"C3",X"3E",X"08",X"D3",X"00",X"E2",X"CD",X"C3",X"09",X"17",X"EA",X"53",X"D2", + X"41",X"76",X"E2",X"3A",X"A7",X"20",X"E8",X"CA",X"D3",X"01",X"D3",X"06",X"D3",X"07",X"C3",X"04", + X"03",X"DB",X"E3",X"C3",X"3A",X"40",X"20",X"E2",X"DB",X"40",X"07",X"00",X"C3",X"07",X"15",X"F9", + X"DB",X"C9",X"E6",X"03",X"C9",X"10",X"23",X"23",X"CA",X"A7",X"40",X"F9",X"00",X"DB",X"10",X"E6", + X"CD",X"C5",X"0B",X"D3",X"0A",X"C1",X"C5",X"0B",X"23",X"E5",X"2E",X"66",X"C1",X"1D",X"0B",X"0A", + X"D3",X"C3",X"67",X"0B",X"3A",X"F5",X"20",X"E2",X"D3",X"CD",X"C1",X"0B",X"0B",X"0A",X"C1",X"C5", + X"00",X"CE",X"32",X"27",X"20",X"AB",X"F1",X"C9",X"CA",X"A7",X"41",X"2F",X"3A",X"F1",X"20",X"AB", + X"C9",X"20",X"1B",X"2B",X"DA",X"B8",X"41",X"5A",X"A7",X"3A",X"CE",X"20",X"27",X"00",X"A7",X"32", + X"FF",X"FF",X"1B",X"2B",X"DA",X"B8",X"41",X"6A",X"33",X"C8",X"C3",X"33",X"05",X"03",X"FF",X"FF", + X"FF",X"FF",X"A5",X"11",X"21",X"20",X"20",X"A1",X"33",X"C8",X"C3",X"33",X"05",X"18",X"FF",X"FF", + X"FF",X"FF",X"A9",X"11",X"21",X"20",X"20",X"A1",X"03",X"06",X"C3",X"EF",X"05",X"03",X"FF",X"FF", + X"E2",X"32",X"C3",X"20",X"00",X"B6",X"FF",X"FF",X"03",X"06",X"C3",X"EF",X"05",X"18",X"00",X"3E", + X"FF",X"05",X"70",X"E8",X"07",X"05",X"50",X"FF",X"78",X"78",X"07",X"05",X"78",X"FF",X"07",X"F8", + X"40",X"FF",X"01",X"00",X"FF",X"00",X"F0",X"FF",X"07",X"60",X"FF",X"03",X"40",X"60",X"01",X"03", + X"F0",X"FF",X"0B",X"A0",X"FF",X"0E",X"C0",X"E0",X"0E",X"F0",X"FF",X"0A",X"D0",X"F0",X"0B",X"0E", + X"00",X"80",X"00",X"02",X"FF",X"FF",X"20",X"E0",X"06",X"0E",X"C0",X"FF",X"06",X"80",X"FF",X"02", + X"C0",X"E0",X"16",X"17",X"C0",X"FF",X"1B",X"80",X"1D",X"1D",X"E0",X"FF",X"1B",X"E0",X"FF",X"17", + X"05",X"00",X"FF",X"00",X"C0",X"FF",X"3B",X"C0",X"FF",X"0B",X"00",X"80",X"05",X"0B",X"00",X"FF", + X"2F",X"80",X"FF",X"2B",X"00",X"80",X"1B",X"3B",X"FF",X"3B",X"C0",X"40",X"2F",X"3A",X"C0",X"FF", + X"00",X"0A",X"FF",X"FF",X"80",X"80",X"77",X"77",X"00",X"FF",X"1B",X"00",X"FF",X"0A",X"00",X"00", + X"43",X"DE",X"43",X"D3",X"43",X"C8",X"43",X"81",X"43",X"F0",X"45",X"91",X"45",X"7F",X"45",X"64", + X"E0",X"FF",X"EC",X"00",X"E1",X"1E",X"00",X"E7",X"80",X"C0",X"FB",X"7F",X"C3",X"C1",X"03",X"01", + X"0E",X"00",X"F0",X"FF",X"E6",X"00",X"3B",X"10",X"FF",X"07",X"00",X"E0",X"00",X"EA",X"7E",X"71", + X"3C",X"13",X"08",X"00",X"F0",X"FF",X"E0",X"00",X"00",X"3C",X"FF",X"1C",X"00",X"D0",X"38",X"BF", + X"27",X"03",X"E0",X"FF",X"EE",X"00",X"01",X"C0",X"03",X"70",X"FF",X"7E",X"00",X"F0",X"E0",X"EA", + X"C0",X"FF",X"FD",X"00",X"00",X"00",X"FF",X"07",X"FF",X"03",X"00",X"E0",X"80",X"BF",X"03",X"01", + X"1E",X"00",X"00",X"00",X"FF",X"1C",X"00",X"00",X"00",X"80",X"00",X"7F",X"0E",X"00",X"00",X"FF", + X"FE",X"5F",X"F0",X"70",X"38",X"FF",X"7B",X"80",X"00",X"00",X"08",X"00",X"FF",X"FF",X"E0",X"F0", + X"80",X"7A",X"9F",X"1C",X"03",X"00",X"BC",X"FF",X"38",X"C7",X"00",X"F9",X"FF",X"01",X"00",X"B8", + X"00",X"F4",X"0E",X"EF",X"0F",X"04",X"02",X"00",X"F9",X"00",X"0E",X"04",X"00",X"0F",X"FF",X"07", + X"00",X"BC",X"F8",X"FA",X"09",X"00",X"B8",X"FF",X"3C",X"FF",X"F8",X"00",X"00",X"9C",X"FF",X"1F", + X"70",X"FF",X"3F",X"00",X"00",X"C0",X"FF",X"01",X"7B",X"00",X"FF",X"F0",X"00",X"F8",X"E0",X"6F", + X"07",X"00",X"00",X"00",X"FF",X"07",X"00",X"00",X"00",X"E0",X"80",X"1F",X"03",X"00",X"80",X"FF", + X"A7",X"22",X"E2",X"CA",X"3D",X"46",X"4A",X"32",X"00",X"00",X"02",X"00",X"FF",X"FF",X"4A",X"3A", + X"4B",X"3A",X"FE",X"22",X"DA",X"02",X"46",X"F9",X"C9",X"22",X"43",X"3A",X"32",X"22",X"22",X"4A", + X"3E",X"C9",X"C3",X"08",X"46",X"F2",X"FF",X"FF",X"1F",X"00",X"4B",X"32",X"CD",X"22",X"40",X"27", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"47",X"10",X"46",X"10",X"46",X"76",X"45",X"9E", + X"80",X"FF",X"B3",X"00",X"87",X"78",X"03",X"9C",X"00",X"00",X"EE",X"FD",X"0F",X"05",X"0F",X"07", + X"39",X"01",X"C0",X"FF",X"9B",X"00",X"EF",X"40",X"FF",X"1F",X"00",X"80",X"00",X"AB",X"F8",X"C7", + X"F0",X"4E",X"20",X"00",X"C0",X"FF",X"83",X"00",X"00",X"F0",X"FF",X"70",X"00",X"C0",X"E0",X"FE", + X"80",X"AB",X"9F",X"0F",X"80",X"FF",X"BB",X"00",X"0F",X"C0",X"00",X"F9",X"FF",X"01",X"00",X"C0", + X"0E",X"06",X"00",X"FF",X"F7",X"00",X"03",X"00",X"07",X"00",X"FF",X"0F",X"00",X"80",X"00",X"FE", + X"00",X"FF",X"78",X"00",X"00",X"00",X"FF",X"70",X"FF",X"1C",X"00",X"00",X"00",X"FE",X"38",X"01", + X"45",X"3A",X"FE",X"22",X"DA",X"3D",X"47",X"8E",X"00",X"00",X"00",X"00",X"20",X"00",X"FF",X"FF", + X"43",X"32",X"C3",X"22",X"47",X"F8",X"08",X"CD",X"08",X"CD",X"CD",X"43",X"1D",X"58",X"A0",X"3E", + X"46",X"32",X"E6",X"22",X"F5",X"03",X"44",X"2A",X"CD",X"43",X"1D",X"58",X"46",X"3A",X"3C",X"22", + X"22",X"67",X"22",X"44",X"C2",X"F1",X"47",X"BE",X"7D",X"22",X"40",X"C6",X"7C",X"6F",X"00",X"CE", + X"00",X"DE",X"22",X"67",X"22",X"44",X"08",X"CD",X"44",X"2A",X"7D",X"22",X"01",X"D6",X"7C",X"6F", + X"A7",X"22",X"D2",X"CA",X"3E",X"47",X"32",X"A0",X"CD",X"43",X"1D",X"AA",X"F5",X"C9",X"43",X"3A", + X"43",X"4A",X"48",X"4F",X"52",X"48",X"49",X"4E",X"22",X"43",X"C3",X"F1",X"01",X"45",X"FF",X"FF", + X"41",X"48",X"4D",X"42",X"50",X"55",X"45",X"52",X"53",X"20",X"20",X"4C",X"53",X"41",X"54",X"54", + X"D3",X"AF",X"C3",X"01",X"42",X"7B",X"FF",X"FF",X"52",X"59",X"D3",X"AF",X"C3",X"01",X"42",X"6C", + X"E0",X"FC",X"E7",X"1F",X"FF",X"1C",X"DC",X"00",X"F8",X"E0",X"3F",X"73",X"3C",X"7E",X"00",X"FF", + X"C3",X"5E",X"83",X"3D",X"00",X"07",X"FF",X"00",X"1D",X"C1",X"0E",X"C3",X"00",X"01",X"80",X"FF", + X"7E",X"FE",X"02",X"3F",X"FF",X"01",X"DE",X"00",X"1E",X"00",X"BC",X"E7",X"03",X"07",X"00",X"FF", + X"9C",X"00",X"1D",X"70",X"00",X"FF",X"E0",X"F8",X"3C",X"3C",X"00",X"FF",X"38",X"5C",X"FF",X"3D", + X"00",X"FF",X"80",X"C0",X"FF",X"03",X"00",X"FF",X"FF",X"1F",X"F0",X"00",X"0F",X"C0",X"00",X"01", + X"C0",X"00",X"7F",X"00",X"C1",X"7E",X"01",X"0E",X"3E",X"80",X"E7",X"F7",X"07",X"C3",X"FF",X"03", + X"FF",X"00",X"E0",X"00",X"D5",X"38",X"73",X"3C",X"00",X"FF",X"10",X"C0",X"3C",X"DD",X"1C",X"E1", + X"FF",X"3B",X"E0",X"00",X"7F",X"E0",X"13",X"27",X"00",X"08",X"00",X"FF",X"70",X"E0",X"7E",X"C1", + X"C0",X"00",X"D5",X"80",X"03",X"03",X"00",X"FF",X"00",X"FF",X"C0",X"E0",X"03",X"CD",X"FF",X"03", + X"7F",X"00",X"01",X"0E",X"00",X"FF",X"00",X"00",X"00",X"C0",X"07",X"D9",X"FF",X"01",X"80",X"00", + X"00",X"08",X"FF",X"FF",X"E0",X"80",X"FD",X"CF",X"1C",X"EF",X"FF",X"00",X"00",X"00",X"3C",X"00", + X"9F",X"5F",X"03",X"70",X"FF",X"00",X"70",X"00",X"F0",X"F9",X"00",X"01",X"00",X"FF",X"80",X"F0", + X"0E",X"78",X"0F",X"F5",X"02",X"1C",X"FF",X"00",X"77",X"04",X"38",X"0F",X"00",X"07",X"00",X"FF", + X"F8",X"F8",X"09",X"DF",X"FF",X"04",X"78",X"00",X"78",X"00",X"F0",X"9C",X"0E",X"1F",X"00",X"FF", + X"70",X"00",X"76",X"C0",X"00",X"01",X"00",X"FF",X"F3",X"F0",X"00",X"FF",X"E0",X"70",X"FF",X"F5", + X"3B",X"00",X"00",X"07",X"00",X"FF",X"00",X"00",X"80",X"E0",X"03",X"5F",X"FF",X"00",X"C0",X"00", + X"9C",X"DE",X"1F",X"0F",X"FF",X"0F",X"00",X"00",X"02",X"0F",X"FF",X"00",X"00",X"FF",X"F8",X"00", + X"40",X"00",X"F0",X"77",X"70",X"87",X"FF",X"03",X"FD",X"00",X"07",X"F8",X"07",X"39",X"00",X"FF", + X"00",X"FF",X"C0",X"80",X"F9",X"07",X"01",X"EF",X"80",X"00",X"57",X"E0",X"CF",X"F0",X"01",X"20", + X"00",X"FF",X"00",X"80",X"0F",X"37",X"FF",X"0F",X"FF",X"00",X"80",X"00",X"FE",X"80",X"4D",X"9F", + X"00",X"00",X"1C",X"67",X"FF",X"07",X"00",X"00",X"00",X"00",X"57",X"00",X"0F",X"0E",X"00",X"FF", + X"70",X"BC",X"FF",X"03",X"00",X"00",X"F0",X"00",X"FE",X"00",X"05",X"38",X"00",X"FF",X"00",X"00", + X"1F",X"F7",X"00",X"07",X"C0",X"FF",X"DF",X"00",X"00",X"20",X"FF",X"FF",X"C0",X"7F",X"DF",X"DF", + X"00",X"FF",X"20",X"00",X"FF",X"00",X"00",X"FF",X"1F",X"F8",X"FF",X"00",X"00",X"00",X"20",X"F8", + X"40",X"E0",X"00",X"FF",X"40",X"00",X"FF",X"00",X"BF",X"00",X"1F",X"E0",X"FF",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"FF",X"FF",X"F8",X"FC",X"00",X"FF",X"C0",X"00",X"01",X"80",X"FF",X"00", + X"0E",X"71",X"FF",X"7E",X"00",X"AE",X"E0",X"1E",X"3F",X"17",X"3C",X"1C",X"CE",X"FF",X"1E",X"E0", + X"00",X"C3",X"FF",X"01",X"80",X"FD",X"C3",X"3F",X"E7",X"07",X"6F",X"FF",X"BE",X"00",X"03",X"C1", + X"FF",X"07",X"00",X"AF",X"7E",X"3E",X"02",X"00",X"83",X"01",X"0F",X"FF",X"3E",X"00",X"00",X"E7", + X"38",X"1F",X"FC",X"FF",X"0F",X"00",X"FF",X"70",X"EE",X"FF",X"1E",X"00",X"FF",X"3C",X"00",X"FE", + X"00",X"C0",X"FF",X"01",X"00",X"00",X"80",X"00",X"00",X"F8",X"E0",X"07",X"E0",X"FF",X"01",X"00", + X"FF",X"42",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"21",X"3E",X"01",X"D3",X"8F",X"C3"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/6.t31.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/6.t31.vhd new file mode 100644 index 00000000..bf2ef75f --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/roms/6.t31.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom6t31 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom6t31 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"10",X"13",X"03",X"01",X"00",X"05",X"05",X"06",X"08",X"14",X"00",X"05",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"04",X"01",X"12",X"09",X"14",X"0E",X"0F", + X"57",X"21",X"36",X"22",X"21",X"00",X"2E",X"88",X"00",X"1B",X"00",X"1B",X"00",X"1B",X"00",X"00", + X"32",X"00",X"22",X"5B",X"1C",X"C2",X"C3",X"49",X"13",X"C3",X"21",X"49",X"22",X"57",X"3E",X"34", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"05",X"18",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"C2",X"0D",X"4A",X"55",X"18",X"11",X"19",X"00",X"0C",X"21",X"0E",X"2E",X"36",X"08",X"23",X"00", + X"FF",X"04",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"7C",X"C2",X"37",X"4A",X"53",X"D3",X"C3", + X"CA",X"81",X"4A",X"83",X"01",X"3E",X"59",X"32",X"03",X"DB",X"7F",X"EE",X"E6",X"F3",X"FE",X"81", + X"32",X"AF",X"22",X"59",X"00",X"DB",X"80",X"E6",X"AF",X"22",X"3A",X"C9",X"22",X"59",X"C8",X"A7", + X"22",X"5A",X"CA",X"A7",X"4A",X"A5",X"32",X"AF",X"97",X"CA",X"3E",X"4A",X"A7",X"01",X"3A",X"C9", + X"22",X"5A",X"C9",X"AF",X"18",X"01",X"1A",X"04",X"22",X"5A",X"93",X"C3",X"3E",X"4A",X"32",X"01", + X"06",X"C8",X"D5",X"04",X"1C",X"11",X"19",X"00",X"13",X"77",X"05",X"23",X"AF",X"C2",X"0D",X"4A", + X"4B",X"E0",X"AC",X"CD",X"21",X"4A",X"2A",X"16",X"C3",X"D1",X"4A",X"AF",X"16",X"21",X"11",X"26", + X"11",X"2E",X"4D",X"00",X"AC",X"CD",X"21",X"4A",X"A0",X"11",X"CD",X"4C",X"4A",X"AC",X"16",X"21", + X"60",X"11",X"21",X"4D",X"36",X"16",X"AC",X"CD",X"32",X"16",X"40",X"11",X"CD",X"4C",X"4A",X"AC", + X"4A",X"AC",X"DF",X"DF",X"DF",X"DF",X"C9",X"DF",X"11",X"4A",X"4D",X"C0",X"16",X"21",X"CD",X"3A", + X"1F",X"00",X"44",X"24",X"1F",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3E",X"00",X"41",X"41",X"22",X"41",X"00",X"00",X"7F",X"00",X"49",X"49",X"36",X"49",X"00",X"00", + X"7F",X"00",X"49",X"49",X"41",X"49",X"00",X"00",X"7F",X"00",X"41",X"41",X"3E",X"41",X"00",X"00", + X"3E",X"00",X"41",X"41",X"47",X"45",X"00",X"00",X"7F",X"00",X"48",X"48",X"40",X"48",X"00",X"00", + X"00",X"00",X"7F",X"41",X"00",X"41",X"00",X"00",X"7F",X"00",X"08",X"08",X"7F",X"08",X"00",X"00", + X"7F",X"00",X"14",X"08",X"41",X"22",X"00",X"00",X"02",X"00",X"01",X"01",X"7E",X"01",X"00",X"00", + X"7F",X"00",X"18",X"20",X"7F",X"20",X"00",X"00",X"7F",X"00",X"01",X"01",X"01",X"01",X"00",X"00", + X"3E",X"00",X"41",X"41",X"3E",X"41",X"00",X"00",X"7F",X"00",X"08",X"10",X"7F",X"04",X"00",X"00", + X"3E",X"00",X"45",X"41",X"3D",X"42",X"00",X"00",X"7F",X"00",X"48",X"48",X"30",X"48",X"00",X"00", + X"32",X"00",X"49",X"49",X"26",X"49",X"00",X"00",X"7F",X"00",X"4C",X"48",X"31",X"4A",X"00",X"00", + X"7E",X"00",X"01",X"01",X"7E",X"01",X"00",X"00",X"40",X"00",X"7F",X"40",X"40",X"40",X"00",X"00", + X"7F",X"00",X"0C",X"02",X"7F",X"02",X"00",X"00",X"7C",X"00",X"01",X"02",X"7C",X"02",X"00",X"00", + X"60",X"00",X"0F",X"10",X"60",X"10",X"00",X"00",X"63",X"00",X"08",X"14",X"63",X"14",X"00",X"00", + X"08",X"00",X"08",X"08",X"08",X"08",X"00",X"00",X"43",X"00",X"49",X"45",X"61",X"51",X"00",X"00", + X"00",X"00",X"FF",X"C0",X"00",X"00",X"FF",X"F8",X"00",X"00",X"F8",X"00",X"00",X"00",X"FF",X"00", + X"FC",X"00",X"00",X"FF",X"FF",X"80",X"00",X"1F",X"00",X"00",X"FF",X"FF",X"F0",X"00",X"07",X"FF", + X"C2",X"23",X"48",X"03",X"A0",X"3E",X"43",X"32",X"00",X"21",X"36",X"00",X"23",X"00",X"FE",X"7C", + X"32",X"3D",X"22",X"4C",X"CA",X"A7",X"48",X"22",X"C3",X"22",X"40",X"CD",X"3A",X"F5",X"22",X"4C", + X"C3",X"33",X"1F",X"9F",X"D5",X"1A",X"11",X"E5",X"C9",X"F1",X"03",X"3E",X"4C",X"32",X"33",X"22", + X"0D",X"13",X"2C",X"C2",X"C9",X"48",X"FF",X"FF",X"4B",X"00",X"AA",X"CD",X"E1",X"0B",X"24",X"D1", + X"46",X"1A",X"DA",X"B8",X"48",X"57",X"7E",X"C2",X"AB",X"11",X"21",X"20",X"20",X"A7",X"03",X"0E", + X"50",X"32",X"11",X"22",X"20",X"A5",X"4D",X"21",X"1B",X"48",X"0D",X"2B",X"48",X"C2",X"AF",X"48", + X"22",X"4F",X"03",X"0E",X"46",X"1A",X"DA",X"B8",X"06",X"22",X"EF",X"03",X"A3",X"11",X"21",X"20", + X"6C",X"C2",X"C3",X"48",X"05",X"18",X"20",X"3E",X"48",X"89",X"18",X"C2",X"1B",X"05",X"0D",X"2B", + X"21",X"48",X"20",X"A1",X"4D",X"11",X"06",X"22",X"50",X"32",X"11",X"22",X"20",X"A9",X"5E",X"C3", + X"07",X"D3",X"51",X"21",X"3E",X"22",X"77",X"01",X"EF",X"03",X"80",X"C3",X"3A",X"49",X"22",X"50", + X"49",X"A0",X"0F",X"0E",X"2C",X"CD",X"3A",X"48",X"77",X"23",X"77",X"23",X"99",X"21",X"11",X"29", + X"11",X"49",X"0B",X"90",X"08",X"0E",X"F1",X"CD",X"22",X"50",X"21",X"A7",X"2D",X"17",X"76",X"C2", + X"CD",X"11",X"48",X"2C",X"93",X"21",X"11",X"29",X"21",X"09",X"28",X"95",X"B0",X"11",X"0E",X"49", + X"29",X"91",X"D8",X"11",X"0E",X"49",X"CD",X"0F",X"49",X"C8",X"0F",X"0E",X"2C",X"CD",X"21",X"48", + X"12",X"0E",X"2C",X"CD",X"21",X"48",X"2F",X"8D",X"48",X"2C",X"0F",X"21",X"11",X"28",X"49",X"E8", + X"0B",X"21",X"11",X"29",X"4A",X"08",X"10",X"0E",X"00",X"11",X"0E",X"4A",X"CD",X"03",X"48",X"2C", + X"0E",X"4A",X"CD",X"05",X"48",X"2C",X"03",X"3E",X"2C",X"CD",X"21",X"48",X"2E",X"88",X"20",X"11", + X"22",X"22",X"22",X"55",X"55",X"2A",X"0E",X"22",X"28",X"C3",X"11",X"4A",X"22",X"51",X"54",X"32", + X"22",X"50",X"C2",X"A7",X"49",X"4F",X"03",X"DB",X"D5",X"01",X"2C",X"CD",X"DF",X"48",X"3A",X"D1", + X"C4",X"20",X"49",X"6D",X"03",X"DB",X"10",X"E6",X"40",X"E6",X"64",X"C4",X"DB",X"49",X"E6",X"03", + X"C2",X"00",X"49",X"16",X"92",X"C3",X"DB",X"49",X"33",X"CA",X"C3",X"4A",X"4E",X"50",X"22",X"54", + X"20",X"E6",X"6D",X"C4",X"DB",X"49",X"E6",X"00",X"E6",X"00",X"C4",X"40",X"49",X"64",X"00",X"DB", + X"C0",X"1B",X"12",X"AF",X"1A",X"C9",X"12",X"3D",X"C3",X"10",X"49",X"40",X"3C",X"1A",X"FE",X"12", + X"C3",X"0B",X"48",X"BC",X"FF",X"FF",X"FF",X"FF",X"F0",X"A7",X"1A",X"3E",X"C9",X"12",X"98",X"11", + X"48",X"94",X"01",X"3E",X"E2",X"32",X"C3",X"20",X"11",X"CD",X"3A",X"40",X"22",X"50",X"CA",X"A7", + X"FF",X"05",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"48",X"95",X"32",X"AF",X"20",X"E2",X"18",X"C3", + X"01",X"0C",X"09",X"14",X"0E",X"0F",X"00",X"13",X"0F",X"03",X"07",X"0E",X"01",X"12",X"15",X"14", + X"01",X"00",X"08",X"03",X"09",X"05",X"05",X"16",X"0F",X"19",X"00",X"15",X"01",X"08",X"05",X"16", + X"0F",X"14",X"01",X"04",X"13",X"19",X"08",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"10",X"01",X"05",X"05",X"13",X"12",X"00",X"1B",X"09",X"03",X"13",X"12",X"0F",X"00",X"05", + X"0F",X"19",X"12",X"15",X"09",X"00",X"09",X"0E",X"07",X"05",X"13",X"09",X"05",X"14",X"00",X"12", + X"08",X"14",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"14",X"0C",X"01",X"00",X"13",X"09",X"17", + X"07",X"E0",X"07",X"E0",X"03",X"FF",X"FF",X"C0",X"1F",X"80",X"01",X"F8",X"0F",X"C0",X"03",X"F0", + X"00",X"7F",X"FE",X"00",X"00",X"3F",X"FC",X"00",X"01",X"FF",X"FF",X"80",X"00",X"FF",X"FF",X"00", + X"06",X"06",X"EE",X"7E",X"77",X"FF",X"05",X"23",X"0F",X"0E",X"15",X"21",X"11",X"25",X"00",X"1A", + X"19",X"4E",X"28",X"C3",X"0D",X"4E",X"C5",X"F5",X"2A",X"C2",X"7C",X"4E",X"3E",X"FE",X"3D",X"CA", + X"FF",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"DF",X"DF",X"C1",X"00",X"C2",X"F1",X"4E",X"22", + X"3A",X"24",X"22",X"54",X"CA",X"3D",X"49",X"92",X"5B",X"3A",X"A7",X"22",X"1C",X"C2",X"13",X"49", + X"C3",X"3D",X"49",X"16",X"FF",X"FF",X"FF",X"FF",X"01",X"3E",X"5B",X"32",X"3A",X"22",X"22",X"54", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3F",X"FF",X"00",X"00",X"0F",X"FF",X"00",X"00",X"FF",X"F0",X"00",X"03",X"FF",X"FC",X"00",X"00", + X"FF",X"FC",X"00",X"00",X"FF",X"F0",X"00",X"03",X"0F",X"FF",X"00",X"00",X"3F",X"FF",X"00",X"00", + X"F0",X"00",X"07",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"80",X"00",X"1F",X"FC",X"00",X"00",X"FF", + X"00",X"00",X"FF",X"00",X"00",X"00",X"F8",X"00",X"00",X"00",X"FF",X"F8",X"00",X"00",X"FF",X"C0", + X"00",X"00",X"F8",X"00",X"00",X"00",X"F8",X"00",X"00",X"00",X"F8",X"00",X"00",X"00",X"F8",X"00", + X"00",X"00",X"F8",X"00",X"00",X"00",X"F8",X"00",X"00",X"00",X"F8",X"00",X"00",X"00",X"F8",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"F8",X"00",X"00",X"00",X"F8",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"F8",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"F8",X"00",X"00",X"00",X"F8",X"00",X"00",X"00",X"F8",X"00",X"00",X"00",X"F8",X"00", + X"00",X"00",X"F8",X"00",X"00",X"00",X"F8",X"00",X"00",X"00",X"F8",X"00",X"00",X"00",X"F8",X"00", + X"FF",X"FC",X"3F",X"FF",X"FF",X"FE",X"7F",X"FF",X"FF",X"F0",X"0F",X"FF",X"FF",X"F8",X"1F",X"FF", + X"00",X"3F",X"FC",X"00",X"00",X"1F",X"F8",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"7F",X"FE",X"00", + X"00",X"1F",X"F8",X"00",X"00",X"1F",X"F8",X"00",X"00",X"1F",X"F8",X"00",X"00",X"1F",X"F8",X"00", + X"00",X"1F",X"F8",X"00",X"00",X"1F",X"F8",X"00",X"00",X"1F",X"F8",X"00",X"00",X"1F",X"F8",X"00", + X"00",X"7F",X"FE",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"1F",X"F8",X"00",X"00",X"3F",X"FC",X"00", + X"FF",X"F8",X"1F",X"FF",X"FF",X"F0",X"0F",X"FF",X"FF",X"FE",X"7F",X"FF",X"FF",X"FC",X"3F",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"E0",X"00",X"F8",X"03",X"E0",X"00",X"F8",X"03",X"FF",X"FF",X"FF",X"FF",X"E0",X"00",X"F8",X"03", + X"FE",X"00",X"F8",X"03",X"FF",X"80",X"F8",X"03",X"F0",X"00",X"F8",X"03",X"FC",X"00",X"F8",X"03", + X"EF",X"F8",X"F8",X"03",X"E3",X"FC",X"F8",X"03",X"FF",X"C0",X"F8",X"03",X"FF",X"E0",X"F8",X"03", + X"C0",X"3F",X"7F",X"FF",X"80",X"0F",X"7F",X"FF",X"E1",X"FF",X"FC",X"07",X"C0",X"FF",X"FE",X"0F", + X"00",X"01",X"07",X"F8",X"00",X"00",X"00",X"00",X"00",X"07",X"3F",X"FF",X"00",X"03",X"1F",X"FE", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"E0",X"1F",X"F8",X"03",X"E0",X"1F",X"F8",X"03",X"FF",X"FF",X"FF",X"FF",X"E0",X"1F",X"F8",X"03", + X"E0",X"1F",X"F8",X"03",X"E0",X"1F",X"F8",X"03",X"E0",X"1F",X"F8",X"03",X"E0",X"1F",X"F8",X"03", + X"E0",X"1F",X"F8",X"03",X"E0",X"1F",X"F8",X"03",X"E0",X"1F",X"F8",X"03",X"E0",X"1F",X"F8",X"03", + X"E0",X"1F",X"F8",X"03",X"00",X"1F",X"F8",X"00",X"E0",X"1F",X"F8",X"03",X"E0",X"1F",X"F8",X"03", + X"00",X"1F",X"F8",X"00",X"00",X"1F",X"F8",X"00",X"00",X"1F",X"F8",X"00",X"00",X"1F",X"F8",X"00", + X"00",X"FF",X"FF",X"00",X"01",X"FF",X"FF",X"80",X"00",X"3F",X"FC",X"00",X"00",X"7F",X"FE",X"00", + X"0F",X"C0",X"03",X"F0",X"1F",X"80",X"01",X"F8",X"03",X"FF",X"FF",X"C0",X"07",X"E0",X"07",X"E0", + X"FC",X"00",X"00",X"3F",X"F8",X"00",X"00",X"1F",X"3F",X"00",X"00",X"FC",X"FE",X"00",X"00",X"7F", + X"FE",X"00",X"00",X"7F",X"3F",X"00",X"00",X"FC",X"F8",X"00",X"00",X"1F",X"FC",X"00",X"00",X"3F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/spram.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/Vortex_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/README.txt b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/README.txt new file mode 100644 index 00000000..871b6a6a --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/README.txt @@ -0,0 +1,27 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Western Gun Part II port to MiST by Gehstock +-- 05 June 2019 +-- +--------------------------------------------------------------------------------- +-- +-- Midway 8080 Hardware +-- Audio based on work by Paul Walsh. +-- Audio and scan converter by MikeJ. +--------------------------------------------------------------------------------- +-- +-- +-- Keyboard inputs : +-- +-- F1 : Start +-- SPACE : Fire +-- RIGHT/LEFT : Movement +-- +-- Joystick support. +-- +-- +--------------------------------------------------------------------------------- + +ToDo: Color Prom + Controls + DIP + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/WesternGunPtII.qpf b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/WesternGunPtII.qpf new file mode 100644 index 00000000..b277111e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/WesternGunPtII.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 18:00:31 July 15, 2019 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "18:00:31 July 15, 2019" + +# Revisions + +PROJECT_REVISION = "WesternGunPtII" +PROJECT_REVISION = "SpaceInvaders" diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/WesternGunPtII.qsf b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/WesternGunPtII.qsf new file mode 100644 index 00000000..2a568027 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/WesternGunPtII.qsf @@ -0,0 +1,172 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 19:48:57 August 10, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# WesternGunPtII_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/westerngun_mist.sv +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/westerngun_memory.sv +set_global_assignment -name VHDL_FILE rtl/westerngun_overlay.vhd +set_global_assignment -name VHDL_FILE rtl/sprom.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name QIP_FILE ../../../common/mist/mist.qip + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name TOP_LEVEL_ENTITY westerngun_mist + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== + set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# -------------------------------- +# start ENTITY(spaceinvaders_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(spaceinvaders_mist) +# ------------------------------ +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/WesternGunPtII.sdc b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/WesternGunPtII.sdc new file mode 100644 index 00000000..f91c127c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/WesternGunPtII.sdc @@ -0,0 +1,126 @@ +## Generated SDC file "vectrex_MiST.out.sdc" + +## Copyright (C) 1991-2013 Altera Corporation +## Your use of Altera Corporation's design tools, logic functions +## and other software and tools, and its AMPP partner logic +## functions, and any output files from any of the foregoing +## (including device programming or simulation files), and any +## associated documentation or information are expressly subject +## to the terms and conditions of the Altera Program License +## Subscription Agreement, Altera MegaCore Function License +## Agreement, or other applicable license agreement, including, +## without limitation, that your use is for the sole purpose of +## programming logic devices manufactured by Altera and sold by +## Altera or its authorized distributors. Please refer to the +## applicable agreement for further details. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition" + +## DATE "Sun Jun 24 12:53:00 2018" + +## +## DEVICE "EP3C25E144C8" +## + +# Clock constraints + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty + +# tsu/th constraints + +# tco constraints + +# tpd constraints + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + + + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] + +#************************************************************** +# Create Generated Clock +#************************************************************** + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + +#************************************************************** +# Set Input Delay +#************************************************************** + +set_input_delay -add_delay -clock_fall -clock [get_clocks {CLOCK_27}] 1.000 [get_ports {CLOCK_27}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {CONF_DATA0}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DI}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SCK}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}] + +#************************************************************** +# Set Output Delay +#************************************************************** + +set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_L}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_R}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {LED}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {VGA_*}] + +#************************************************************** +# Set Clock Groups +#************************************************************** + +set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}] + +#************************************************************** +# Set False Path +#************************************************************** + + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + +set_multicycle_path -to {VGA_*[*]} -setup 2 +set_multicycle_path -to {VGA_*[*]} -hold 1 + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/clean.bat b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T8080se.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T8080se.vhd new file mode 100644 index 00000000..65b92d54 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T8080se.vhd @@ -0,0 +1,194 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80_ALU.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80_ALU.vhd new file mode 100644 index 00000000..e09def1e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80_ALU.vhd @@ -0,0 +1,361 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80_MCode.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80_Pack.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80_Reg.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/T80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/invaders.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/invaders.vhd new file mode 100644 index 00000000..876ed1fc --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/invaders.vhd @@ -0,0 +1,277 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaderst is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire : in std_logic; + MoveLeft1 : in std_logic; + MoveRight1 : in std_logic; + MoveUp1 : in std_logic; + MoveDown1 : in std_logic; + MoveLeft2 : in std_logic; + MoveRight2 : in std_logic; + MoveUp2 : in std_logic; + MoveDown2 : in std_logic; + DIP : in std_logic_vector(8 downto 1); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0); + SoundCtrl5 : out std_logic_vector(5 downto 0); + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic + ); +end invaderst; + +architecture rtl of invaderst is + + component mw8080 + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); + end component; + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(6 downto 2); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; +begin + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; + + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; + if WD_Cnt = 255 then + Rst_n_s_i <= '0'; + end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then + WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then + if Sounds(0) = '1' and Old_S0 = '0' then + WD_Cnt <= WD_Cnt + 1; + end if; + if PortWr(6) = '1' then + WD_Cnt <= (others => '0'); + end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: mw8080 + port map( + Rst_n => Rst_n,--Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + Video => Video, + HSync => HSync, + VSync => VSync); + + with AD_i(9 downto 8) select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + S when others; + + GDB0(0) <= '0'; + GDB0(1) <= '0'; + GDB0(2) <= '0'; + GDB0(3) <= '0'; + GDB0(4) <= '0'; + GDB0(5) <= '0'; + GDB0(6) <= '0'; + GDB0(7) <= '0'; + + GDB1(0) <= not MoveRight1; + GDB1(1) <= not MoveLeft1; + GDB1(2) <= not MoveUp1; + GDB1(3) <= not MoveDown1; + GDB1(4) <= not MoveRight2; + GDB1(5) <= not MoveLeft2; + GDB1(6) <= not MoveUp2; + GDB1(7) <= not MoveDown2; + + GDB2(0) <= not Fire; + GDB2(1) <= not Fire; + GDB2(2) <= not Sel1Player; + GDB2(3) <= not Sel2Player; + GDB2(4) <= '1';--Lives + GDB2(5) <= '1';--Cabinet + GDB2(6) <= '1';--unused + GDB2(7) <= not Coin; + + PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; + PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; + PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; + PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; + PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + OldSample := '0'; + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0); + end if; + if PortWr(4) = '1' and OldSample = '0' then + D5(15 downto 8) <= DB; + D5(7 downto 0) <= D5(15 downto 8); + end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0); + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/invaders_audio.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/mw8080.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/mw8080.vhd new file mode 100644 index 00000000..b9a88f96 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/mw8080.vhd @@ -0,0 +1,336 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n, Rd_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/pll.qip b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/pll.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/pll.vhd new file mode 100644 index 00000000..97a42db7 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/pll.vhd @@ -0,0 +1,382 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + sub_wire2 <= sub_wire0(1); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + c1 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 20, + clk1_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire4, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "20.000000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "ps" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "40" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "20.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK1 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "20" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic32.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic32.hex new file mode 100644 index 00000000..251ad2c5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic32.hex @@ -0,0 +1,66 @@ +:020000040000FA +:200000003321C12EB0CD33213E1432FE6711DF2021357201021BCD64213E5C32FE6711FA5F +:2000200020218272010209CD64213E0132FD67214D7211EE1A010B03C5CD5921C111561C00 +:200040002ECDCD5921212473110321D50627C5CD6D0FC1D12E54CD6D0F3E0332FD672E609F +:200060000609C3332108492214814242811422490800008080F0F8B0BC3A3A3A1818080884 +:20008000080808C8F810141F7F575E7D1530000000020204000000000090441F3F3F7F7FD8 +:2000A0003F1D0900000000000800A040A060E08E1170E0C050787641404040CED1F0E0C0F6 +:2000C000E0E07632341800D0600609F8F671416040404040C0C0C0E0F0FFF9010000000123 +:2000E00003060C0F0F0704050505050504070F3F7F7FFFFFF8E0F0FC3EFC01030703070F32 +:2001000003050400000200C001002000401000401011C1DC0FFFFE0DE09F0FD0C10FCAE0B1 +:200120000606600000000000000080C8F8C1FFC04000001A77CD3D2105C23321C93AFD6715 +:20014000233DC240213AFC67133DC24821C91AB677CD3D2105C24E21C9C5CD4E2123C10DD8 +:20016000C25921C9C5D5CD3321EB2AFE6719D1C10DC26421C93A8060470F21F660DA822119 +:200180002EFB3AE160A7CAB721AF32E160E52AE260EBE17E8327775F237E8A277757F50E12 +:2001A000E30AA7C2BC21F1237ECE00277747237E23666F78C3A30FAF327F60C93AD960BA8B +:2001C000CAC621D2A621AF02C5D5E50EFF0A3C02CD12083AD860673E0ACDD80D3E02327FA5 +:2001E00060E1D1C1C3A6213A0B603DF5320B60CDDE06F1F52EEF772EF5E607874F06001106 +:20020000EB22EB097E1223137E12CD930D0601CD9623F1FE04CA1F22E607FE07C2BE223EBD +:200220000ECDB92321194C118F100E09CDE40F21164C0E09CDE40F119506CD810F3EFF3228 +:20024000C4603AC460A7C24222060ECD8A233E40CDD90FAFCDB92311FB22210A4801100B79 +:20026000C51A13D5E5F579FE09DA7122F107C37322F10FF5C53E26D27C223E10CDD80D3ED4 +:2002800001CDD90FC10DC26622F1E123D1C105C260223A80600F21F660DA9E222EFB060354 +:2002A000AFF5F17E8F277723F505C2A222F13E80CD0623CDD102CD930D0600C38A23AFCDB7 +:2002C000B923060ACD8A23118506CD810FCD760F3E0832C4603E50CDD90FCDD102211A496A +:2002E000CDD7233E30CDD90FC3B6222020000000202020000000200060504001070F1F3F54 +:200300007F7FFFFE7C3832C06021F660111D443A80600FDA1A232EFB16563AC060A7C8E66F +:2003200004C22A23CDA00FC30923EB0630CDAC0DC309233A80600F21F860DA3F232EFD118F +:20034000F36006FE0478FE02CA5F231ABE2B1BCA4423D25F237D805F2EF10603CD6D0FC34B +:200360009D0FCD930DCD3323AFCD12083A8960A7F27A233A8160A7C4BF231185100E0A210B +:20038000104BCDE40F3E40C3D90F3A8860E6E0B0328860D306C93ADF60A7C878A73A8A609A +:2003A000FAAA23B0328A60D304C9A0C3A4233ADF60A7C83A8B60E60FB0328B60D305C9115F +:2003C000301021134C0E07CDE40F3A80600F3E1BDAD4233CC3D80D114F100E06C3E40FE631 +:2003E000F0C2B91A21C0723601C9FFFFFFF53AC072A7CA0024F10F0F0FC3CA1AFFFFFFFF71 +:20040000F1C9FFFFFF323B6021C0723600C9F5AF32C072211F5AF1C900FFE6203E80C22302 +:20042000243E00328960C9FFFFFFE6100F0F0F0FC603C9FFFFFF210246114A240E13CDBE24 +:200440000D112210C9FFFFFFFFFF09130008130E26020E110F0E110013080E0D09FFFFFF92 +:20046000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:20048000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:2004A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:2004C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:2004E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:20050000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:20052000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:20054000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:20056000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:20058000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:2005A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:2005C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:2005E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:20060000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:20062000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:20064000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:20066000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:20068000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:2006A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:2006C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:2006E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:20070000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:20072000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:20074000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:20076000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:20078000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:2007A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:2007C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:2007E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic33.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic33.hex new file mode 100644 index 00000000..c763f525 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic33.hex @@ -0,0 +1,66 @@ +:020000040000FA +:200000007B3C87C6186F0604C93E08C3F9171C7BFE18D231181AA7FA291879D608BED22995 +:2000200018C620BEDA291837C9232305C20E18AFC9214F60351EFFAFC9CD0E18D24D183A40 +:20004000376023BEDA5218CD2A18C33C187B324760C97B324760114C601A86122B1B1A86F8 +:2000600012622E4636012E4F34C9CD0E18D24D183A376023BED25218CD2A18C36D182CCD7F +:200080000E18D24D183A36602BBE23DA5218CD2918C382182CCD0E18D24D183A36602BBE69 +:2000A00023D25218CD2918C398182155607E34E60307070707C6405F2E461663E5D53A830A +:2000C00060A74FFACB183E01325260060ACD6D0F2E467E2347FE01CA081979A7FAA81678DB +:2000E000A7CAE718C31F19CD6C16CAF11835C3A816CD2C196FCD0C08A7FAA8167D5D87C6D5 +:20010000196FCD5218C3A8163A4C60E680A9CA1419C3DD16AF32526021556035C3A816CD11 +:200120007B17E1D1CDB5173A126012C987C6506F26605E2356131AA7FA3F19722B73C97B78 +:20014000D6195FC335193A83604F3A6E60E680A9C82167607EA7CA191A237EA7C2BA1923EB +:20016000354E23CA9E19CDB40F3A6F608467326E60CDA110CD400F79E603CA8219FE01C2B2 +:2001800098191AA7F28F197BD6305FD28F1915EB226A600620CD96233E0F326260C9CDB4D6 +:2001A0000F118067CDA110CD400F218A03227D60AF216760772377C34014347E2323FAE858 +:2001C00019FE63C2D61921306F226A600620CDAE2306DFC39623CDB40FCDA110CD400FEB0E +:2001E000226A603E02C39A193DFA0B1A2A6D60CDA110EB2A65607E21E16036FF2336002321 +:2002000077EBC61ACDD80DAFC3C00FFEB0C03A8B60E6DFCDB923C39E1906DFCD96233A0980 +:2002200060FE04D83A3560A7C82A7D602B227D607DB4C03EFF3267603A0A60A7F83E01323A +:200240000A60C921306036002E383ADF60A7CAE61A3A8960A7FA5F1A3A80600FD26F1ADB98 +:2002600000F5E60FBE7723CA751A3604C3AF1ADB01F5C3621A35C2AF1A3604A74723CAD761 +:200280001A347EA7FA8E1AFE04DA8E1A3603788701B600814F2323230ABE770323C2A91AB3 +:2002A0000ABE77C2AB1AC3AF1A0A772E3A36FE113C6021A060F1E6F0C8BECAC21A77EB3676 +:2002C00004C9EB35C036040F0F0F0F01CB00814F0AA7C8323B60C935F2AF1A36FB2E3DAF15 +:2002E000772377C3AF1A3AA060F57EC3621A73C0005FD800FDFE01E97F01F87F01E85B01EA +:20030000F87201E8F601F856014CC000CC8001C4000084000080000080000071C0005BD83F +:2003200000FFFE01ED7F01F97F01E85B01F87201E8F601FC56008CC000848801841C008080 +:200340003F00004C00008000007E0270430341FF015B6E00FEFF00EC1F00F8CF00ECFE0099 +:20036000FF0000EB0000F97800803800800C00800F00000000008000004C00803F00841C24 +:20038000008488018CC000FC5600E8F601F87201E85B01F97F01ED7F01FFFE015BD800719C +:2003A000C000800000800000840000C40000CC80014CC000F85601E8F601F87201E85B01FF +:2003C000F87F01E97F01FDFE015FD80073C0000400000800003000006400006480014CC045 +:2003E00000FC5601E8F601F87201E85B01F97F01ED7F01FFFE015BD80071C00070000070F4 +:2004000000005C00005E800140C000F95601EBF601FE7201EC5B01F87F01EE7F01FEFE01D3 +:200420005AD80073C00000000071C0005BD800FFFE01ED7F01F97F01E85B01F87201E8F682 +:2004400001FC56014CC00064800164000030000008000004000078C00048D800F8FE01EE7A +:200460007F01FE7F01EA5B01FC7201EFF601FB560141C000408001C000008000008000000F +:20048000800000F0C00090D800F8FE01EE7F01FE7F01EA5B01FC7201EFF601FB5600C1C074 +:2004A00000808801801C00803F00004C00008000007E0270430340FF01586E00F8FF00EBEE +:2004C0001F00FACF00EEFE00FE0000E80000F878008838008E0C008E0F0002000000800079 +:2004E000004C00803F00801C00808801C1C000FB5600EFF601FC7201EA5B01FE7F01EE7FF4 +:2005000001F8FE0190D800F0C000800000800000800000C0000040800141C000FB5601EF88 +:20052000F601FC7201EA5B01FE7F01EE7F01F8FE0148D80078C00004000008000030000098 +:20054000E00000A08001C1C000FB5600EFF601FC7201EA5B01FE7F01EE7F01F8FE0190D8E2 +:2005600000F0C000F00000F000009C00009E000080C000FAD800EEFE01FE7F01E87F01FDCF +:200580005B01EF7201FBF6018C5601F0C000008001F0C00090D800F8FE01EE7F01FE7F019C +:2005A000EA5B01FC7201EFF601FB5601C1C000A08001E0000030000008000004000003028B +:2005C0000E0B06021674F4F62E9FFEF7E662323018080000000018107050301C100C0406A0 +:2005E0000E0E0E0E0E0F0F0F0B0100000000FF000000000818303262E6F7FE9F2EF6F47493 +:200600001602060B0E020300000000010B0F0F0F0E0E0E0E0E06040C101C3050701018FFC6 +:20062000CDB910C5E51AD303DB032FA67723130DC2251EAFD303012000E109C105C2231EBF +:20064000C9CDB910C5E51AD303DB03B67723130DC2461EAFD303012000E109C105C2441EB3 +:20066000C9212760C3B40FCDB910C51AD303DB03B6772313AFD303DB03B677011F0009C17D +:2006800005C26A1EC9CDB910E5C5E51AD303DB032FA6772313AFD303DB032FA6770D23C22C +:2006A0008B1EE101200009C105C2891EE1C9CDB910AF328560C51AD303DB03F5A6CAC51E76 +:2006C0003EFF328560F1B6772313AFD303DB03F5A6CAD91E3EFF328560F1B677011F000918 +:2006E000C105C2B51EC92100673600237CFE7EC2E91E21006711DB1206143E07D3021AD38D +:2007000003131AD303DB037723AFD303DB0377231305C2FE1E21020222FC6721016801141F +:2007200010C5110567CD3321C10DCA3E1F790F3E10DA351FAF856FD23B1F24C3211F2142F4 +:200740000022FE67210068110467010808C5CD6421213E0022FE67214068C1111667CD64B6 +:200760002121486B010914110167C5CD3321C10DC2671F21100022FE673E0132FC672188BC +:200780006A01060C116520CD6421AF32FE6721B06CE5117120011014CD64213E2832FE6776 +:2007A000118520010814E123C5CD642111992021D96CC1CD64213E0132FD673E2B32FE6733 +:2007C00011652021306F010E06C5CD6421215A6FC13E2932FE67116B20CD642121D6711187 +:2007E000EE1A0624C5CD6D0F210072C111561CCD6D0F3E0432FD6711AD202E300619C5CDD4 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic34.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic34.hex new file mode 100644 index 00000000..3e90c4b8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic34.hex @@ -0,0 +1,66 @@ +:020000040000FA +:2000000026262607082712020E1104262626241C250211040308132626262626262626269F +:200020002626080D120411132626020E080D1B260F0B0018041126261B26020E080D1C2638 +:200040000F0B0018041112261C26020E080D1207040B0F26190F141207011413130E0D0EA4 +:200060000D0B18261B260F0B00180411261B260E11261C260F0B00180411120604132626F2 +:20008000110400031806000C0426260E150411010E0D14122619191912020E110426172649 +:2000A0001C3E05D3027DD3037CD303DB036F3E02D303DB0367AFD303C9C5E5CDA110C1790F +:2000C000E607D302C1C93A8060670E007EA7FAD2100C2B05C2CC1079C93A0060A7C03A02EB +:2000E00060A7C03A0960A7CA26113A0A60473A8060673A03603CFE14DAFE10CD42116F78A8 +:20010000A7CA21113CCA2C117DFE10D221117E4FA77DFAF510320360CDAC113EFF3202608A +:20012000C97D4EC315113EFF328260C97DFE10DA0E117E4FA77DF21511320360CDAC11C3B9 +:20014000EA10A7F26C11FE94C25511C375113E92C355113E8032036007C6176F1105607EF9 +:200160001223137E123EFF320260E1C978A7CA53113CCA4E11CDA111210D6035CA85113A9E +:20018000806067AFC936193EFF32006078A7C29311E1C92B7EA7CA9F1135F29F1136FFE19C +:2001A000C9210460347EFE03D83600C92E18F587856F79E60F874F060011F311EB09010558 +:2001C000601A8612022313031A861202F15F1AA7F80A21376096D2DF11FEF3D2E211C9FE7E +:2001E0000AD02B0B0A96D2EB112F3CFE0CD0AF323560C9000000020202020002FE00FEFEF9 +:20020000FEFE00FE02010202FFFFFEFE013A0060A7C83A0260A7C03A0160A7F03A0960A75A +:20022000CA26113A8060673A036016023CFE18C23512CD49126F7E4FA77DFA2C12320360D7 +:20024000CDAC113EFF320260C915CA5E12CDA111210E6035CA61123E13320360E1C9210EEC +:200260006036323E08320160E1C93A0260A7C83A8060673A0360E61F6F7EA7FA8112CD8691 +:2002800012AF320260C921B3121128003A0460193DF28F12EB2A0560010114C3A4127EA76C +:2002A000C03EE8C9E5CDB910C5E51AD303DB037723131AD303DB03770DC2B0122313AFD361 +:2002C00003DB0377E101200009C105C2A812E1C9CDB40F0E01118067C3A4120000000000BF +:2002E0000204020C33981A6018E01BE07AE07BE07BE07AE01B2018B01A10330002000200E4 +:200300000000000000000000004060C030803080378075BC77A877F075C037E03030300CC7 +:20032000600400000000000000000000000000001E805E807F84019C00F0017001F07D70FE +:2003400015F00D9C0484070000000000000000000000007EFEFFC8FEFECA881323464FB054 +:2003600079C27E13237EA7C28E13235E2356E5EBE5217613E3E9E1110C0019C35313050498 +:20038000C284133D05702B77111000C37A13352B2BC388133A3260A7C82125607EA7C8FE8A +:2003A00001CAB513FE02CAE31323FE03CA0F14FE05C8C3301436023A3B60878747215B0029 +:2003C000856F22276078112A60217B00856F0136600A86120323130A861223137E122313CD +:2003E0007E12C93A8660A7C0CD611E0E01D5E5C5CD851EC1E1112C601A856F131A8467224C +:200400002A60D1CDAE1E3A8560A7C8328660C935CA30147EFE0FC023CDB40F0E01CD851EB9 +:20042000E51168142127607323720604E1C36A1ECD611E0E01CD851EAF2125607723361064 +:200440002A6560237E4DA7C24D14216C1422656006072167607EA7C02E69116E06790FDA15 +:200460006514117B14C36D0F0906060902030101010205030201010202010032BE1D18E0E6 +:20048000D8FC2137603A8360A7CAAF143A8960A7FA9C143A80600F3EA0D2A5143E60BEDA43 +:2004A000B714C3A914BED2B7143EFD323060C93E04323260C3BF143EFE323060C3AF142B85 +:2004C0002B7EA7CA0C15CD1A16213F603A3A60A73A3B60FA0815BEC2DC14C608772B113795 +:2004E000601A86FEBFDAEA143EBEFE33D2F1143E33122B1B1A86FE9DDAFD143E9CFE34D296 +:2005000004153E3412C3261677C305153E023232602E77357E23FA6A1547E6023A8860CAD8 +:200520002715F613C32915E620328860D30678FE10CA5C15D24415CDB40F0E01CDA412EB83 +:20054000227860C9CD1A16213F603A3B60BEC25315C60877CD26160608C39623CD1A162A5F +:2005600036607CD60267227B60C9FEE0C0CDD012211C4206E0CDAC0D3EFF32356031008077 +:200580003ADF60A7CA9301AF32C260CDB92306C1CD9B23FB3E40CDD90FCD75213A8260A78B +:2005A000C2011621136006343A3760FE78DAB21506BD703EFFCD700DCD0E0D3A8160A7CA7E +:2005C000E6152EFFCD0C0835CAD4157CEE03328060C38B04CD6223AF3281603A8060EE033A +:2005E000328060C38B042EFFCD0C0835C20716CD62233ADB60A7C2CD0306C0CD9623C39DC9 +:2006000001CDE721C3BB15000000C3B2043A3F6007211500856F5E2356C9CD0D1601030F4B +:200620002A3660C3201ECD0D1601030F2A3660C3411E2145607E34E603070707075F1663BF +:2006400023E5D53A8360A74FCA50163E01324260060ACD6D0F2E467E2347FE01CAD4167986 +:20066000A7CAA81678A7CA8416C36E173A3560A7CAA7175E237E4F266387878787F60F6F1B +:200680007EA779C9CD6C16CA8E1635C3A816A7CA9F16FE01CAB016FE02CABC16C3C8163A54 +:2006A0003660CDE817CD3918E1D1060ACD6D0FC93A3660CDE817CD6A18C3A8163A3760CDDC +:2006C000E817CD7E18C3A8163A3760CDE817CD9418C3A8163A4C60E680A9CA63173A356098 +:2006E000A7CA52172A4960EB2A4B60010103E5CD851EEB7EA7F2FC1611FAFF19224960EB46 +:20070000E1014D600A85FED1D25217FE10DA52176F030A84FEDDD25217FE20DA521767E59D +:20072000224B600603CDAE1E3A8560A7E1CA5B171136601AD603BDD25E17C613BDDA5E17E4 +:20074000131AD603BCD25E17C611BCDA5E17AF323560AF3248603E02324660C3A8163E04D4 +:20076000C35317AF32426021456035C3A816CD7B17E1D1CDB5173A116012C923357E2A49D4 +:2007800060EB2A4B60010103FAB217FE02CAAB17FE03CA9917E1C3A816E5CD851E21E51796 +:2007A000224960E1224B60E1C3A816CD671EE1C3A816C3851E133600230609CD6D0F547DAF +:2007C000D6085FEB0605C36D0F020202020205FF020202050202FF000700040304FF000773 +:2007E00000010601FF0502054F3A4F60E603CA0918FE013EF8CAF917AF814F3A8060675774 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic35.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic35.hex new file mode 100644 index 00000000..25cd8543 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic35.hex @@ -0,0 +1,66 @@ +:020000040000FA +:20000000F83FFEFFFEFFAEEA486E94AA3A8060677EC9F6C0211F42C3C00FCDE61E0E15118C +:20002000FC0F211E45CDBE0D0E07211F53CDBE0D3ADB60CDC00FCD910FCD970FCD9D0F11DE +:200040005A080E02CD6A08CDB70DCD6A08D5110001CDB00DD10DC24408C9460610084896B7 +:20006000100459E6100848851040EB56235E2346237E23EBC93A3560A7C83A3160A7C021C4 +:2000800025607EA7C03ADF60A7CAB008112F601AA7C2A408CDE108A0C836013E10120610BA +:2000A000CD9623C9CDE108A0C01206EFCD9623C936012ADD60237EA7F2C10821D608C3B66C +:2000C0000822DD603238603ADC603C32DC606F7EE6F032A060C90009080A02060405010ADA +:2000E000FF3A8960A7FAF1083A8060E60347DB02C90601DB02C93A2560FE02C02A2A603A3A +:200100008660A7C21F093E07BDD2F9093EE0BDDAF9093E17BCD2F9093EE6BCDAF909C93A37 +:200120006760A7CA2C097DFEDDD287093A8060573A0060473E18BDD264093EC7BDDA6409EB +:200140003E26BCD264093ED7BCDA6409EB2E100E381E6078A71604CA5C09160844CD940907 +:20016000CDF909C9EB78A7C279092E000E1844113010CD9409CDF909C92E140E4044113099 +:2001800004CD9409C36A092168607EA7C2F9093662C3F909D5E52A2A60E37EA7FAEF09EB39 +:2001A0000A03E1EBD604BBD2F109C618BBDAF1090AD605BAD2F109C617BADAF109EB0A6766 +:2001C0000B0A6F227560EB7EF6F07721736036682B36002B361ED13E053225603ADF60A781 +:2001E000CAED0921E16036FF2373233600E1C9D1030323D115C29409C93E03322560AF322E +:200200008660C92100607EA7CA180A237EA7C2140ACD2F0ACDEE0AC92E087EA7C82E0BFE87 +:200220000FD0FE03DA2B0A2B3601C9233600C916002E3FCD0C080E1379FE10D2440A440A08 +:20024000A7FA5C0AE5CDC80A6FFE03CA670AFE0ECA6B0A7DCD720AE6F0B377E12B2B0DF221 +:20026000380A7A320F60C951C3530A79F68057C3530A473A1060A77821AA0AFA810A218C6A +:200280000A856FD2870A245E69C30C080707050105010507050307070303050005070303E2 +:2002A0000100010001000100030001030107010501050707030301070100030307070300EB +:2002C00005000500050005007EE60F5F2D7EE6F0B3D6C2D2EA0AF2E30AD6CFD2EA0AD6C6C0 +:2002E000C3EA0AD666D2EA0AD6C6E61FB8C93A8060673A0160A7C2C80B3A0F60A7CA4E0C57 +:20030000F2530B2E130604CDCA10A7CA770C2E1411920C0604CD6D0F06082E40CD6D0F0E90 +:20032000033A0F6081E6136F7EA7FA380BF6F07779C6146F7EE60F770DF2210BCDAE0C3ECD +:2003400010320F6032076006803E1332036078320160C9010C600AA7C24E0C0E033EFF3259 +:20036000876011A20CD53A8060673A0F6081E6136F7EA7F2C20BD11BD51A472E37160FCD92 +:20038000C80ACA920B2D15F27F0BC3A80B556BC3850B5D6A7EA7FA8D0BF6F07779C6146F40 +:2003A0007EE60F77AF3287600DF2660BD13A8760A7C24E0CAF3207603E19320E600610C34E +:2003C000490BD11BD5C3A80BFE08CADD0BA7F2680C2E170604CDCA10A7CA600CC906032EFA +:2003E00017543A0F6080E6135F7EA7FAF40B36FF1AE60F122B05F2E20B11A20C2E14060483 +:20040000CD6D0F2E400608CD6D0FCDE30C3A0C60A7FA430C3A0760A7C28B0C2108607E2EA6 +:200420000BA7CA4E0C2FC60F570157007EE606814F0A5FAF821DC2340C5F030A2393D2420A +:200440000CAF773A1060EEFF321060CD2F0A21036036FFAF2B772B772B773E32320E60C904 +:200460003E08320160C3F90B3C320160E601CA740CC3E30CC3C20CCDB80C3EF02E10060492 +:20048000CDB70D3E10320F60C3EE0AAF320160C3EE0AFAFBFCF9367668A89A7668440014AE +:2004A0001C08F8F2F4F6CC12041204DACCDA2E101108070604CD6D0F2E381130070608C39C +:2004C0006D0F21174611200F010808CD4E0F21044641CD4E0F21045941CD4E0F2117594116 +:2004E000C34E0F21174611200F010808CD5D0F21044641CD5D0F21045941CD5D0F21175966 +:2005000041C35D0F3A8060571E48AFC3140D3A8060571E483284603E04F507213F0D4F0614 +:20052000000946234E21020FC5E3C13A8460A7CA380DCD490DC33B0DCD5C0DF13DC8C31956 +:200540000D4F17450D4F03592DC57E1213230DC24A0D011E0009C105C2490DC9C51AB67772 +:2005600013230DC25D0D011E0009C105C25C0DC9A7F52EE4CD0C081100600615F1C2830DCC +:200580000613EBC36D0F2100423600237CFE5EC2890DC92100421103003600237DE61FFE13 +:2005A0001DDA990D197CFE5EDA990DC9AF112000771905C2B00DC9772305C2B70DC91AD5CA +:2005C000CDD80DD1130DC2BE0DC911E00DE526006F29292919EBE1C9CDCA0D0608C3400FBD +:2005E000001F2444241F0000007F494949360000003E414141220000007F4141413E0000FE +:20060000007F494949410000007F484848400000003E414145470000007F0808087F000046 +:200620000000417F410000000022147F14220000027EC2FE7E020000007F0101010100008B +:20064000007F2018207F0000007F1008047F0000003E4141413E0000007F48484830000064 +:2006600060F0783C78F06000007F484C4A31000000324949492600000040407F404000006E +:20068000007E0101017E0000007C0201027C0000007F020C027F00000022140814220000DC +:2006A0000060100F106000000602083070E0C000003E4549513E00000000217F01000000FF +:2006C00000234549493100000042414959660000000C14247F04000000725151514E0000EA +:2006E000001E29494946000000404748506000000036494949360000003149494A3C0000CC +:200700000008142241000000000041221408000000000000000000000008080808080000B3 +:200720002070F97D3F1F0F3F040E9FBEFCF8F0FCFCF0F8FCBE9F0E043F0F1F3F7DF97020B7 +:20074000C51A771301200009C105C2400FC9C51AB6771301200009C105C24E0FC9C51A2F61 +:20076000A6771301200009C105C25D0FC91A77231305C26D0FC92100601110060613C36D9E +:200780000F2190600610C36D0F1157070640C36D0F21F660C3A00F21FB60C3A00F21F160A7 +:2007A000CDB40FA7C2A90F3ECCCDC00F7ACDC00F7BC3C00F5E23562346237E23666F78C9A5 +:2007C000C5D5F50F0F0F0FE60FC61ACDD80DF1E60FC61ACDD80DD1C1C932C0603AC060A7A1 +:2007E000C2DC0FC9D51ACDD80DD13E0832C0603AC060A7C2EF0F130DC2E40FC9241B252690 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic35sound.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic35sound.hex new file mode 100644 index 00000000..8c4fdccf --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic35sound.hex @@ -0,0 +1,66 @@ +:020000040000FA +:20000000550412093795B276D296F9F20F047AB99083B5B900F9927A05461FB821B0003432 +:20002000AFA9AEC660148C0937F29FBB04341A3427C618148C343FFBAE346734780937F2A8 +:200040009F148CF903F1C655F903F3C65534AFC61803F3C618FEC62F165C043DEE3D042FB6 +:200060007666367104189A8F266C0418A5BE1024BDB5BE1124BDBE1224BDBE13BB00B9005B +:2000800024BEBE14B821B0FF14F724BE34AF03F296F6BE1524BEBE1614F7B69D1E24BE14D8 +:2000A000F78A70BFF514A9049FFF1FE3AEC6F6343FFD03FCAE47530F37ABFE9767AD371731 +:2000C000ACBA0C8A8014E69A7F14E616D6090909F2EE468204C3FE6BAE6CF6DEFDAE4203DA +:2000E0000062EAC304A9FEA8E8E8A8E8EB9327624682161504F083F94380A983FFFFFFFFE9 +:200100000BF20B460AA40A0B097B000008F3087207F90786071A06B40654BF00B820B000CC +:2001200054009620EE20835400F235C626AA5400F235AB5400AE379626FAAE34D52427FEFE +:20014000530FE7A3ACFE530FE717A3ADFE537047AEFC9767ACFD67ADEE5123F86DAD23FF56 +:200160007CACFDC6261C838A708A8034A49A7F34A616752469EE6993F943F0A3AE34AF3767 +:200180001769C689CEFE96891E276AEE8A9767AEE69942038062F6991EFB37176EE6A1AE93 +:2001A00083BE01830909FDA8FCE8A90796A9830937BC046728F728ECB328530F8315341AB0 +:2001C000342796C60415343FFB37176AAE346734D324C0FBAE56DEB821F096DE0482FEC691 +:2001E0002616E524D5EEDE83FFFFFFFFFFFFFFFF0102030405060708090A0A010102010157 +:20020000B820FF1F2FC6112F20960E20A38320E383B0FF2F440C000402BCBAC1BA000402F8 +:20022000BAB8BCBA000403B802B804B902B904BB02BB04B902B9000403B402B404B602B60E +:2002400004B802B804B602B6000403B102B104B202B204B402B404B202B20004A602AA06AD +:20026000B004A602AA06B004A602ABB2B2B2B2B2B206B40003049A06A003A2A09B09A603AC +:200280009A06A003A2A09B0998000696049A029A06980296029696049A9800040596029AF2 +:2002A00006A004A202A004A202A0049A029606980004960296059690049A029A069A960463 +:2002C00096029A08A003A0049B029A06980000000402B4B000006002FF06BCBBBAB9B8B79E +:2002E000B6B4B3B2B1B0ACABAAA9A8A7A6A8AAACB0B2B4B6B8BA300CBC000603B0B0AAB038 +:20030000B2B010AA06AA10A806AA10A806B0B0AAB0B2B010AAA806AAA810A6001507903F74 +:2003200015960E039007963F159A0E0396079A2AA0159A079090903F1596001803A610A60D +:200340000AA618A610A90AA810A80AA610A60AA420A60006A4A8ACB2B4B0AAA6A2A6AAB02C +:20036000B2ACA8A4000402C0BCBBBAB9B8B7B6B4B3B2B1B0000802A4A4A6A8A8A6A4A2A0B0 +:20038000A0A2A40EA404A210A208A4A4A6A8A8A6A4A2A0A0A2A40EA204A010A00CA0A6045B +:2003A000A618A60CA00CA804A418A60CA0A604AA0CB0AA04A60CA2A804AA18A6000802AA8D +:2003C00004AAAA08AAACAAACB004B0B008B0B2B0B2000802A804A8A808ACA8AA04AAAA08C5 +:2003E000B0AA0004A8A808ACA8AA04AAAA08B0AA00B8C0BCC0B8C0BCC0C2C3C2C3C6C8000F +:20040000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:20042000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:20044000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:20046000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:20048000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:2004A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:2004C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:2004E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:20050000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:20052000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:20054000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:20056000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:20058000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:2005A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:2005C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:2005E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:20060000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:20062000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:20064000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:20066000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:20068000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:2006A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:2006C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:2006E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:20070000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:20072000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:20074000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:20076000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:20078000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:2007A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:2007C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:2007E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic36.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic36.hex new file mode 100644 index 00000000..2ff5aef2 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/roms/ic36.hex @@ -0,0 +1,66 @@ +:020000040000FA +:20000000C3DB000000FF0000F5C5D5E5C3B00100F5C5D5E5C3D602EE1A1B1B481B751BA279 +:200020001BCF1BFC1B291C561C831CB01CDD1C0A1D371D641D911D0000FA06FA06000000DF +:2000400000FB05FB0500000000FC04FC0400000000FD03FD030000030302060208010A0776 +:2000600002020203030408010F0100080403030202020701020C0C080F08000C0C020106DD +:200080000E00050F0E03030E0904000FFD03FD06FD00FBFEFDFDFDFE03FC00FE0EFD030007 +:2000A00004080C10140105090D111502060A0E121603070B0F1317FF000300FD000003002A +:2000C000020202FE0000FD00FE02FEFE010505030204040708060102060807310080DB0250 +:2000E000E640CA0024CDEF05CD860DAF32826032866032C36032E160CDA423CDB9232F328A +:20010000C2603E613280603E0ACD9023DB02CD1A243E1532D960CD1A08AF32C160FB3E2054 +:20012000CDD90F118506CD810FCDBA063EFF32C36021014B1118100E0ACDBE0D21154A0E0E +:200140000CCDBE0D2110480E10CDE40F210E480E11CDE40F3ED0CDD90FAF32C360211A51FB +:20016000CDD7233E40CDD90FCD930DAFCD9023CD3F08CDBA06CDD206CD4007CD040D3E0172 +:2001800032C160CD7508CDF608CD030A3A3560A7C27E01CDF6083A3560A7CA9301AF32C125 +:2001A0006032DF6032C360FB3E20CDD90FC3E800AF3283603AC260A7CA96023ADF60A7C255 +:2001C000C9013AC1600FD27302213060CD53131108602E0F0610CDC6101213A7C2ED012FA6 +:2001E0001312320C60011160AF0203021B2E170618CDC61012A7C202022F3282603E0FC321 +:2002000037023ADF60A7CA58023A3560A7CA37023A0160A7FA6E02C23D021E0A1A1BA70631 +:200220000ACA31020601FA31021A3D0FE6073C3C473A8B60E620B0CDB923C34702FE08CA11 +:2002400047020610CDB3233A2F60473A7F60B0473A8A60E6EDCDA3233A3560A7CA6502CD7E +:20026000D910CD0D12CD431AE1D1C1F1FBC9060DC331023AC360A7CA680221906035C268A6 +:2002800002360C0E03CDB602212472DA90022EA4229160C368023AC460A7F26802219060DD +:2002A00035C2680236050E02CDB60221D071DA90022EFAC3900223E5CDB40FCDA412EBE1DB +:2002C0007DC6066F7E2B35FAD1024E2B8277790FC9AF32C460C93E8032836021C06035DB06 +:2002E0000207DA020321DA607EA7CA0703237EFE99CAFE02C6012777211F5ACDC00FAFC3B3 +:2003000004033EFF32DA603AC260A7CAB7033ADF60A7C223033ADB60A7C2CD033AC1600F86 +:20032000D27C03212060CD53132130607EFEFD3EFEC23503AF773A8660A7C24303CD6A12FA +:20034000C36802217160357EFA630323CA6803CDB40F0E01CDA412EB2272600604CD962382 +:20036000C3680236FFC36802CDD012AF3286603E0432256006FBCD9623C368023AC360A7C7 +:20038000CA680221986035C26802CD8612CDA111210660CD9E12C6FE772E9836050E02CDAE +:2003A000B602212473DAAA032E54229960219D60CD9E1277C368023AC460A7CA6802F283BC +:2003C0000321986035C268023605C39D03310080AF328860CDB92332C46032C2603C32DFE8 +:2003E00060CDA423FBCD930D0600CD8A23CD1A080E0421124E115510CDBE0D210A4D0E0605 +:20040000CDBE0D210E490E0E3ADB603DCA2D04116D10CDBE0D0698DB020F0F0F0FDA280420 +:200420000707DA3704C3ED033E01C33A04CDBE0DDB02E604CAED030699AF3281603ADB60B7 +:20044000802732DB60CD0E24CDC00FDB02CD2A240032FF6132FF6232E36132E36221F6606C +:2004600011B006060ACD6D0FCD910FCD970F3A8160A7C27D042AFE600630CDAC0DCDBA06A6 +:20048000CDD206CDD8063E61328060CD930D0600CD8A233A8960A7FABF053E40F5CDDB05C6 +:2004A000117B1021104B0E0ACDBE0DF1CDD90FCD930DCDBD06AF328260328660CD40073AA8 +:2004C0008160A7CAD3043E30CD0623CD930D0600CD8A23CD3F08CD040D3A8060672E373E8C +:2004E0000F320360F5562B5E2BE5EB220560CD6F12E1F13DF2E104AFCD700D1A32376006EC +:2005000010C5CD431AC105C201053A3B60323F600E10C5790FDA1E05CD1A16C32105CD2667 +:20052000163E03CDD90FC10DC2120521000022FE6721011022FC67010204210763C5E53A33 +:200540000B60A7113F00FACC05FE04D265051E4FFE01D257051E47CD642121040019EBE1D5 +:2005600023C1CD6421211F45E50660CDAC0D2EFFCD0C08F5CD1208F1E13DCA87054F3E0A09 +:20058000CDD80D0DC27E057C32D8603EFF32C260CD7508CDF608CD030ACD75213A8260A7CB +:2005A000CA90053E60CDD90F3A3560A7CAAC05AF32C260310080CD7521CDE721C3B2043AF9 +:2005C0008160A7C4BF233EA0F5C3A004FEFCD25505FEECD257051E37C357053A80600F3E9A +:2005E00020D2E505AF473A8860E61FB0C39023CDBA062EC01103000603CD6D0F2EDA11A53D +:20060000060606CD6D0F2EF111AB06060FC36D0F000000FF01B8A800101000070319320075 +:200620000050407901000000941300100000040000000000000010048214FF68790004EF78 +:20064000010100000100100032160000000000000000000000001000AA180000009F00A529 +:2006600000AB00B10000400046196C14000032EF1D18E01004FFFF006814000020B06C14EB +:2006800000000005000C2472203038800305247310B89880FE05D0710E38302202052473B2 +:2006A0001038BF22FE000000D608000000001D4D0000001D440000001D56CD760F21206004 +:2006C0001125060651CD6D0F2E71117606060FC36D0F210061C3E306210062C3E3062E0033 +:2006E000CD0C08064811F806CD6D0FCD9F072EE41110060615C36D0F05050505070707073D +:200700000101010103030303F1F3F5F7F8F2F4F6CCDACCA8CC76CC44CC129A12681236126D +:2007200004120444047604A804DA36DA68DA9ADA9A44364436A89AA8CC12041204DACCDAA1 +:20074000210063CD890FCD890F21010822FC672142630608C3332100FF00C91706FF00FECF +:200760000000C91706FF0000FF01D017061200020101D01706121000FF02D717FF09FE008D +:200780000202D717FF092000FF03DE170F0902000303DE170F093004040505060607072E91 +:2007A000480E0411EA07D5061ECD6D0FD10DC2A607AFD3033E04D30247110808C51A6F13E9 +:2007C000D5780F0E0ED2E0073A0B602FE607C61BCDCA0D010701CD881ED1C105C2BC07C941 +:2007E0003600230DC2E007C3D907AEEAFEFFFEFFF83FF83FF83FF83FF83FF83FF83FF83FFD +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/spram.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/sprom.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/sprom.vhd new file mode 100644 index 00000000..a81ac959 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/sprom.vhd @@ -0,0 +1,82 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_aclr_a : STRING; + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/westerngun_memory.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/westerngun_memory.sv new file mode 100644 index 00000000..684014b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/westerngun_memory.sv @@ -0,0 +1,93 @@ + +module westerngun_memory( +input Clock, +input RW_n, +input [15:0]Addr, +input [15:0]Ram_Addr, +output [7:0]Ram_out, +input [7:0]Ram_in, +output [7:0]Rom_out +); + +wire [7:0]rom_data_0; +wire [7:0]rom_data_1; +wire [7:0]rom_data_2; +wire [7:0]rom_data_3; +wire [7:0]rom_data_4; + + +sprom #( + .init_file("./roms/ic36.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_h ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_0) + ); + +sprom #( + .init_file("./roms/ic35.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_g ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_1) + ); + +sprom #( + .init_file("./roms/ic34.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_f ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_2) + ); + +sprom #( + .init_file("./roms/ic33.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_e ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_3) + ); + +sprom #( + .init_file("./roms/ic32.hex"), + .widthad_a(11), + .width_a(8)) +u_rom_d ( + .clock(Clock), + .Address(Addr[10:0]), + .q(rom_data_4) + ); + +always @(Addr, rom_data_0, rom_data_1, rom_data_2, rom_data_3, rom_data_4) begin + Rom_out = 8'b00000000; + case (Addr[15:11]) + 5'b00000 : Rom_out = rom_data_0; + 5'b00001 : Rom_out = rom_data_1; + 5'b00010 : Rom_out = rom_data_2; + 5'b00011 : Rom_out = rom_data_3; + 5'b01000 : Rom_out = rom_data_4; + default : Rom_out = 8'b00000000; + endcase + +end + +spram #( + .addr_width_g(14), + .data_width_g(8)) +u_ram0( + .address(Ram_Addr[13:0]), + .clken(1'b1), + .clock(Clock), + .data(Ram_in), + .wren(~RW_n), + .q(Ram_out) + ); +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/westerngun_mist.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/westerngun_mist.sv new file mode 100644 index 00000000..83286f52 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/westerngun_mist.sv @@ -0,0 +1,218 @@ +module westerngun_mist( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "WesternGunPtII;;", + "O2,Rotate Controls,Off,On;", + "O34,Scanlines,Off,25%,50%,75%;", + "O5,Overlay, On, Off;", + "T6,Reset;", + "V,v1.20.",`BUILD_DATE +}; + +assign LED = 1; +assign AUDIO_R = AUDIO_L; + + +wire clk_core, clk_sys; +wire pll_locked; +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_core), + .c1(clk_sys) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0,joystick_1; +wire scandoublerD; +wire ypbpr; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; +wire [7:0] audio; +wire hsync,vsync; +wire hs, vs; +wire r,g,b; + +wire [15:0]RAB; +wire [15:0]AD; +wire [7:0]RDB; +wire [7:0]RWD; +wire [7:0]IB; +wire [5:0]SoundCtrl3; +wire [5:0]SoundCtrl5; +wire Rst_n_s; +wire RWE_n; +wire Video; +wire HSync; +wire VSync; + +invaderst invaderst( + .Rst_n(~(status[0] | status[6] | buttons[1])), + .Clk(clk_core), + .ENA(), + .Coin(btn_coin), + .Sel1Player(~btn_one_player), + .Sel2Player(~btn_two_players), + .Fire(~m_fire), + .MoveLeft1(~m_left), + .MoveRight1(~m_right), + .MoveUp1(~m_up), + .MoveDown1(~m_down), + .MoveLeft2(~m_left), + .MoveRight2(~m_right), + .MoveUp2(~m_up), + .MoveDown2(~m_down), +// .DIP(dip), + .RDB(RDB), + .IB(IB), + .RWD(RWD), + .RAB(RAB), + .AD(AD), + .SoundCtrl3(SoundCtrl3), + .SoundCtrl5(SoundCtrl5), + .Rst_n_s(Rst_n_s), + .RWE_n(RWE_n), + .Video(Video), + .HSync(HSync), + .VSync(VSync) + ); + +westerngun_memory westerngun_memory ( + .Clock(clk_sys), + .RW_n(RWE_n), + .Addr(AD), + .Ram_Addr(RAB), + .Ram_out(RDB), + .Ram_in(RWD), + .Rom_out(IB) + ); + +invaders_audio invaders_audio ( + .Clk(clk_sys), + .S1(SoundCtrl3), + .S2(SoundCtrl5), + .Aud(audio) + ); + +westerngun_overlay westerngun_overlay ( + .Video(Video), + .Overlay(~status[5]), + .CLK(clk_sys), + .Rst_n_s(Rst_n_s), + .HSync(HSync), + .VSync(VSync), + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs) + ); + +mist_video #(.COLOR_DEPTH(3)) mist_video( + .clk_sys(clk_sys), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r,r}), + .G({g,g,g}), + .B({b,b,b}), + .HSync(hs), + .VSync(vs), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .rotate({1'b0,status[2]}), + .scandoubler_disable(scandoublerD), + .ce_divider(0), + .scanlines(status[4:3]), + .ypbpr(ypbpr) + ); + +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac dac ( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +wire m_up = ~status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_up | joystick_0[3] | joystick_1[3]; +wire m_down = ~status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_down | joystick_0[2] | joystick_1[2]; +wire m_left = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_left | joystick_0[1] | joystick_1[1]; +wire m_right = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_right | joystick_0[0] | joystick_1[0]; +wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; +wire m_bomb = btn_fire2 | joystick_0[5] | joystick_1[5]; +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_left = 0; +reg btn_right = 0; +reg btn_down = 0; +reg btn_up = 0; +reg btn_fire1 = 0; +reg btn_fire2 = 0; +reg btn_fire3 = 0; +reg btn_coin = 0; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h75: btn_up <= key_pressed; // up + 'h72: btn_down <= key_pressed; // down + 'h6B: btn_left <= key_pressed; // left + 'h74: btn_right <= key_pressed; // right + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h14: btn_fire3 <= key_pressed; // ctrl + 'h11: btn_fire2 <= key_pressed; // alt + 'h29: btn_fire1 <= key_pressed; // Space + endcase + end +end + +endmodule diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/westerngun_overlay.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/westerngun_overlay.vhd new file mode 100644 index 00000000..ffa6ec94 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/WesternGunPtII_MiST/rtl/westerngun_overlay.vhd @@ -0,0 +1,127 @@ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + + +entity westerngun_overlay is + port( + Video : in std_logic; + Overlay : in std_logic; + CLK : in std_logic; + Rst_n_s : in std_logic; + HSync : in std_logic; + VSync : in std_logic; + O_VIDEO_R : out std_logic; + O_VIDEO_G : out std_logic; + O_VIDEO_B : out std_logic; + O_HSYNC : out std_logic; + O_VSYNC : out std_logic + ); +end westerngun_overlay; + +architecture rtl of westerngun_overlay is + + signal HCnt : std_logic_vector(11 downto 0); + signal VCnt : std_logic_vector(11 downto 0); + signal HSync_t1 : std_logic; + signal Overlay_G1 : boolean; + signal Overlay_G2 : boolean; + signal Overlay_R1 : boolean; + signal Overlay_G1_VCnt : boolean; + signal VideoRGB : std_logic_vector(2 downto 0); +begin + process (Rst_n_s, Clk) + variable cnt : unsigned(3 downto 0); + begin + if Rst_n_s = '0' then + cnt := "0000"; + elsif Clk'event and Clk = '1' then + if cnt = 9 then + cnt := "0000"; + else + cnt := cnt + 1; + end if; + end if; + end process; + + p_overlay : process(Rst_n_s, Clk) + variable HStart : boolean; + begin + if Rst_n_s = '0' then + HCnt <= (others => '0'); + VCnt <= (others => '0'); + HSync_t1 <= '0'; + Overlay_G1_VCnt <= false; + Overlay_G1 <= false; + Overlay_G2 <= false; + Overlay_R1 <= false; + elsif Clk'event and Clk = '1' then + HSync_t1 <= HSync; + HStart := (HSync_t1 = '0') and (HSync = '1'); + + if HStart then + HCnt <= (others => '0'); + else + HCnt <= HCnt + "1"; + end if; + + if (VSync = '0') then + VCnt <= (others => '0'); + elsif HStart then + VCnt <= VCnt + "1"; + end if; + + if HStart then + if (Vcnt = x"1F") then + Overlay_G1_VCnt <= true; + elsif (Vcnt = x"95") then + Overlay_G1_VCnt <= false; + end if; + end if; + + if (HCnt = x"027") and Overlay_G1_VCnt then + Overlay_G1 <= true; + elsif (HCnt = x"046") then + Overlay_G1 <= false; + end if; + + if (HCnt = x"046") then + Overlay_G2 <= true; + elsif (HCnt = x"0B6") then + Overlay_G2 <= false; + end if; + + if (HCnt = x"1A6") then + Overlay_R1 <= true; + elsif (HCnt = x"1E6") then + Overlay_R1 <= false; + end if; + + end if; + end process; + + p_video_out_comb : process(Video, Overlay_G1, Overlay_G2, Overlay_R1) + begin + if (Video = '0') then + VideoRGB <= "000"; + else + if Overlay_G1 or Overlay_G2 then + VideoRGB <= "010"; + elsif Overlay_R1 then + VideoRGB <= "100"; + else + VideoRGB <= "111"; + end if; + end if; + end process; + + + O_VIDEO_R <= VideoRGB(2) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_G <= VideoRGB(1) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_B <= VideoRGB(0) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_HSYNC <= HSync; + O_VSYNC <= VSync; + + +end; \ No newline at end of file

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�)dO{H@iwm) zufmJkftjX&;kd+WbE+D?$Sd2PY9VjSp^k757`8*x*RMGGsvqg^GF5CO=qd z{r;I7*LzY64hMLOi3Ws2c(*^PTMTI2nk zuU$g~DOBdz9IO;MN$JB-;&yXRLVYPTHJNg-d~KKATXI`sZ@=$$U~}m-X`IiG#ENb^ zhGDvJXLUGprk21=nVDL8++-p(ot&P2&S)d&<_#lY*&dC@#@>H=9!QTWt#u56cGCe4 zNpoG3vnJfM$gUT;)heX*@pWE9eDCJJy&u)~hY#(I65O8bk#mbK<<3IAk;gCsnz{(+SAb zLNCASUOoIJG44lfmN6J4MZ5|Z6+~V!ZqR;Z9B`wcuzA8;=@3&Op2A%`K#ij(jrzR+ zdpZI+yR}ji2NN~%Zx)kE$FWJeqdt3)4I!IR3~*2UGlC!E#-0ENdVJuOQXILJ`CB#; z$QCz@S$`Ub){q@>Pul~$WO2YnKfat*qy9<2r9Mtf{eD5JV|60s?!+CZ2wjbDfCR0 zOzi{THb0Q+Q~y-wRqmmm_@yU9-urjR@7_VBEb{n{zA7E_R)117ba#&2EwPTtJ=~Oe zW0k`U`WZ^BeQ@V`(dRy~`PyGeQzgvp+Va9(O z$5wD12(UuV7Pi7wR+kyk@z%zc2fysf}%z?7dA|=w(vqcoqPoB zYUXIIRbE^<-;&gvSI9a~s<;vKsUHhD4L zj6`h!UEdWwTlzCsuBu;RQDX;%K=2y7%?r`ur4`5-8)=?8%j7es7ikmzS*M6@RnZZ}2e3;ua9umfrA|DUHWs z^UPi+Aq3ajUBT=wY$Yg{xE1*9-Aw$rovRi<_;TlM`$L77EKVPMJ@a5iD4{8_((oZR zZ+LEJ8VnHx5aMcYRg|WSNopV78v0*T)HMJ$o6B`8sl=8;#PDFoK#)sPD@iC0VM|p~ z(eTj7a7sNkK3s%j^%5Z4hka^P;;77!aZ%FkJ^n1o3NpM=Nw=<}UgX4&pG2N=iJS<8 z#yc^7ge~kYYlIJAW7L0yUr(ukPt;l26R$kK zVoL1Z_42Nc(yK>5UDob)`Ovl|9{^VJT@@e*bI@610}!?1_t0Ro|GH1}AN6+G{TJ}~ z-{{l)e}Fps&l0l{|0XdST;K!&#=p!l*!)L{*>(uK|DXT=ZT_>UKg7Qm zGv8zPKWI~$pFfGvi!ss6xn@+wk~kius(2_{N=dJ0i?-qTxw>Z6N@E7Z%=N@LsH8|W zsP($9hKY*-8zS$K6F&OPj)5rdz_HYk#0r+9LUmVCVV`vMgJuw)*b&BKqcQZr$Kj!q zjHv7$(~9aGYHeG*p;PmWs43~}j_IvIxT8{)c;tHO=#xX^B5d=`vui4_@61Q!JeMD_ z20(FgQP|-B<<=Dc%lyC1f0RLJhxj)GHhcDhclLkxt7&BN`_E%;^iBp7sA3$8z~TTV z$kzaXpA*|T5tsg~db5cGes&gzOUC65=4;k=0_&95@t%qdMIj&v`PvxWc}OH&!8$3t z>NfuaWz6!D(v;@OId*dU)KdGU@)2)~R2J0Fo@#p1tR+j*Z68F76`+Fneua7X7&V@i zv(i7|)bbf2p4n`BGK~015%>2y+FKNBh2kbICbm}g9_H(v?8S%)APKh$Wf794u zki{xG@>Ao_LF4%x{bzEq{$FDv-hTfz)L3(@C_*pvBp{*c$uw)*3~R)_i6PsM7e5<1Ys zUD3euj_Z}aJNiqxZ_iqRRF#px#`Y-wL*1RGZVR(Ku6$ZQVK+HU6^oHgR(~25R3?*~ zT97!AfLDaAe$Lk3>4NWtz=md0Z4@WGKNz6!F#O6wi@!T&WcOSBg^4o-L%EV~uASJa zb4MR?HP(WxIk)|hxj~zuzQKWF`NqWO`WKvXN!TF)cb4C@N$P;+F z?2$@IqDo8g_5~xEq~a{kt}2>DT5Jn`!z1Z-QZXz7UM`u0rv)8qL8i1S|8Yp-|9M_# z^B={n*df3|=HI9T_gLA3h17rhaeHoAW75D#BCX~1{Ldj$to)_2SHCV*pR_*R<+N6p z5eN%k6*2??As2~7=XFv6Olg}pyyvyz03h_S8TB?Y(GCWHGqJ0q@AHq8y~l)s8(%TW z+Yl@MU-!8voR&YTw})MisZH~!3}}ERqH9F?`<0g}-&RzPHpd;QPo;K{8Ux})`9pgK zY)eo7c^hT$bavvZJl8QDdo68O7s2}81^JWPv;(TrRu8S{y*rImzCb$i`ocY9uEP_k zqfD(5_HCAR%s_Acyo#2>v6G@ z`akU8Cz9_O>!v@dr6K3a8eBiQZC!62Riwy50Y{;ld5@zTUt9ZJI=?nQeM+XbOo$ux zNduZJgPWFh8E>@Bylq$Qn1d60Gy(m~6WG0@H*jnQpWGN)6W zxKISmWits)6NW1Q9dSPsT0+t7BL9o$?AE=9hpZ;fIn|a*VND29Iyg(qXzQtXpwpqP zWl9vwo1Fq$dOPDYe$>>pFxR4$>$@i$dDZl&O6rC<_9B|H>cj74ihz}V&PaZkXB#t- zdbvCDobG0r$n$Ad(g|Shw@i8tK<Lj=vM`5BV zn_7Kslu&FAu&EVpunwa#tTj=I_^t zAhoItoLBGvJGY#qyAf@5=$i6;t?$DdX4g*dJU$%EYzBdcL(dfdD=?UKK`K(+HRXsu zyA;_)B_qf-N35&tO7vN`pl=8mlYE=U68$HsW_aQrwLH>=KW}NyU(79yo(?eTaWVe1 z+1ya{XaxN8EBl^zMw1?I=AJpf!(cu-pcyvXAGYXoYedWag#pRKOtJ4(aqr}*p9z6v z8)qw)7rs*4>QC=n*@C`2(q!}$>RGfE!BkHj93oq}WZEhp3$B}K+De+vJ2rg!-rH@F zigWhSQjpn*JmR4rp36&Xrx1GD5QCP|pI!C4@7*vst}L}J%^h+{{RC;ZOM6VR^mDmK zkw1qO)m;e&1%Hk2C$pYrgFUzR`?O!HILzMt{|LuKg;UIB! zr(SZ<4@FpP`4%$`lDqp~gg^7Q9gaTnZvKhMTA>HnWI?{v(B7$SXNb&owKl#pN&4kd+{5GdTJJoR`BBmG2!7f35OQ^s!TEzbAC9SCOd(Q z%}2?AERUKMym_l-MNS3^qWTCH1^y1@6}GL@D1o-E6^4SCv4d&b1d=PoRchJ3iW-{2 z7Q8-e2pKz8>xVM;HmVRcPqKH3OBxo+#P!Ae3>rJ-4prRHv(8q`^NPexi#OU{xC8(C ziN2plJp{OP^!bE{#m)u*YYCh zsO{FbmJ_t8@OtPD;h=VLO8X;Rp7*=vn@#!N5-zgmnk~!1Z$Uo-O+D zKA5l7ia)L0lr!P1_uMRM`l%(#t&?s+UYc~M^fnR0_B9S0i#}nn|mS$SD~4hqOg;MAw!)`e#pJZBm>t#Xv0pjd-`S;*HK-F(6ncL)YszsQdU=ckE2DO34r zx``}+Z3zI>9sNf?NskHwnH1^}w2X{rPStDWG@j_b;t!me||V#clK`5Z4f zhs`CyXw`ORinxJCy>TEXs>_o-y~ana&gVex6|ITP#sv#5xd1w#RpgH@@}+skro}bU zAs|>l)XUJx)E_2+GgDf-rh!WJ_QmloY*%tqJa3H(yl{1g)>Rkv)BwHHH5kmf*b>f~ z=I+c}GLGn)F29)-F%^rQIh^3^24Cs-&|;g+BY8qm`}X+II6+iT(lLT}{t>MP`s1WA za!{b~atr;OQ4JNC49r4Y?MVZW!W2zaqFZgdt2TTBiRiOzDdF#s>GYXVPf#PUpR4OB z!d}2Zp_U)<>FYf@`bYs5o>Hbj($cXd9|`N<<@Of=f&h)M>R|~`9;&GyMD}RqhBuuv z-o6|MRv}bu$E3XdbxAq)gFs6+djk5V@G!W)u(MddQcwQ$>^NZsf7;K3mfO`r3q=e1&qb)%C2kN z{9(ts(W=j{lpbEXu&?BdqTCz2+SF5rlk&h#M_u?uwZA1Be3x2PVPvPx)PzGT4DA)) zZQ9qZdKX55&U5NnG(FFIc&JP9KKtuPNLMSNwt=~>U|^(ob6n`wZzB2TW&iG6*_xn^ zdG`h5a^rP~Ym8+Z|8AQMqHMJ+|4T&)|6A2H;#dO)t)zCq?f9guvpF)AzvT8BIad90 z8bU^5`L+4TTCjN9zAy3c!tjt7yI-n!t!G$>9`2)r;EAW{>X#npBCw%qFHiGMDrAAMH=JR zM>TxZHKn1r^)kD#9pg;2k>93az89nX#TlwUespnlyJtv*`^p_;^ydhr5RdJilE4Rc zOirU3%XHX0QB3Oey6qGO?&HEJ0FU@YP8Co0DBz>sFZpxPcw{^#RqCF0KFeuUoi>3q znKsUg*qgr!ai>3vwEPSY6fe%`>TI00lcAwd?SXrw(2Sp-kLMe;;!&<}%*5$?UBcqo zzDKzl*YqUgWl!ooS+CTTRV64eh)>Ys>esIyeUMO95J{xJ#7{)q30J$lb91Rcnbk}P}eiEk@YOek6p`n?>mggcH%W)E* z-PGzL{PdPFDW-VS3R1ETL0s3VYgJFvcMzIt8g)+3vg{8{+BssLO#VFYJxbzJEHz~~ z{XXKgX`e)HMq;9Tt6=ewE|jO*hE8dIKw*zf@-q|?fsP-M7F~;7?HuuHE433~0AXR` zR6AguAudVNX@0^N@GGb-%jO-xrKA!s!o$6{wQvBtYd9kN=b+&MMDbKAz!s%V${AOm zYGw%mEzyE&X!RXL9}|e%)Om>98eg4eNZlA6@_FtOxVv)v0C2udHGZ8kH|_*LQIuas zR;D2B@U9Z3pTh(&&0V53K-~59IFku(pNlyFA168m2skK|$dV^qumsvBQPm=B!U~W$ zd`uY!ZWf9{yuO!mLx2ol=iz<|kGJUnRS*L|bkPM8LEpW^HVo1*7#Fz*G;5r~cbxc0 z_p#AsDC(Y8@N;u?>yci^X%%YM#VTtdw{%zo-#ibt=dc&TJ+y#Ys+fHM$G?mk6NUf3 zRIvY1o`xOb-`g?XV`u+As9@nYmgSaM`PS!YCe}ATpHaTynu0Q@vai1J+(YjB#WSDm ziSucOuNQ7KsUmlm6`#dwnDlrcF8m(UlSa%B!WqPSPlgcJB;0)|rGL&MiG?wDxOTij z9=z=DtIDd2BWX1FMf2nSu?b~984*jK*idJONL!*??4qx7?z;jV#h(v>6b%bd?n^FE zY6Xt^j8+Yo)y_}jL5AeMnLAzOW8W9ZdtH%!6Fy-*Qb%70r@$f_e;GoFZ7BwzWA1{L z(Y&vYMljeRc7t4p9JZym;XKok>OK_@&PL?b-l;9c+-&vQCbtn@;C@i&^<9v9#aU>b@YlK7rt8-Hf2F@moiw)WjUjwMCZN~df zQFbtzaYwQ@p9NY9f*b zEQP2e@3sQ`=0az9A9i|@vBoiVHu!pbtYegU{(R*o!O>4pn1X5pekLqxER7X@Yg{Y= z#soHGJCx^sx+ac%g?2e7ux`;d>fV`=rj0=V52=SY|9Pw@RyD`S1f;3Gh*uqZ-46 zwO<6QY~G6Sd2dg#%RbK$9Z|OnirUW;+Zym2f;j@Yy1*1I0SLG36}>pPLtzpF;A$+m zHawp_8=z?s-W}JjuNiar!S1Ubxwr+*T0NUNoBHNM!1xBXk5c;@Vx1pM!;Qbz)`Rth z&#o;}2PzeRw0x_Oc-=yL>lIkYJ0MC6 z9KY%KPmDh|!OR>YHdSC7#Du`n*DXGSD&o47F`U6xr{c(?2Eb1_`JkfcQw2#yg=)Jd zO`u9?ov!<_I8l`}DeF}({51(2wshHEzZ2rw8vZyvoktb=?2YXk?okbDZ38guYlZ*BeE}9r(<_Fs2g9Htzz=A! zi|p?hEkEE#+|C!^6fYM^rUHC$hiPj5p9f-U9|gcB9PH&pTH-=P03ZfB{X4^pVY(NrIQOa_V~elY&qsyqY`_7!-p`c5~c`T>Fo@bwMwcpcMG zW0#uf^&DUf^F_c0aAHwZf8;om0qWziNk4Fa@qjER51GhZfDwOiIP8K=_1`NPrQQoQO=>6m&|wPk|$ssNjD zv{Lu839-Epm8m}tohBAt2J+r$+c*rzM~2Wn>>`I^k~O6bVz&Mx@yDTmF_HL>@)+z8 z|DMa-+RpZW;PTcxI^&+_MmzLW*(W}e6t_k=p*PQCY)gp(G zRh=zzcMkMtjtu{*XdBz+t<(k~3%ldKLE{g2ZpB+VwEIZ8hw=!)9e7EfYqH|t5glD< zK0Wo4R`xpyTN;@6!XX_o`GzVg6@q8Q!P94 zDvrjbh+Zx>AVm~H^|Vla1jK)+5O?64HHc>`x`drEdy70i7Hv3Ug@-@12-3EdAR&VW z3A!6-XT?!u#auPFcY9NH*%Crfjcc8*GgPz`>GKi{U z<*b9`>5oMclh$jWTH4N@3fwlYSF_ zhH_fYP)ftuDP#5R^y8KM=%nFDWuug`?4<)lPOLbKqzjzs&3&O|dDsP0$6w3Ges*;W zV^5NFeZ~HUPB{xVL#$jT}U(cU)ERxzl1MP+O;;GLFW}t#&vtN(puumttj~;>=6;7VK zQ~NE@XKwh(AcysQ&oOmr-&a2U!n)cuR`UaZB3Qi-b+u}h<)-QEwS>5?4o&%LzM5j9 zMweY500had^$45t4wd>;|NbO2I$sdr5PL6xq*<$C)O#yI$7wS@b-H$cwIcdTTEAkI zdeB|=M2WJ7*3dui3o&&hRrM>~xq@x;AtEWh$i#T_vSDI5QNt1b{l`TzxnJ+^%-*Fy zgg{<@Hp?=t1Q0Rf_Nylp9(s+ScKSyv%e&;_^ySg7wHxf;yyYrgYq;!NY0=I|6#P8j z{O(R{QO??9%LlY%%X`U0-S_*{zs=>maFK996;<=kfUHpoFyt&(wX0<&EwJTQYg0|4 zNB|X`>O}ndTY3_uCp`dnPb~$9WJ%GA5hQ76CT2gFPn*}wlhgVh=xTyAoEZqSUe{| z=vYY$)ragqX9y1XZ1ljm+j78N)gLNU4AJR%hwns2jqD2-q=_CO=TzQ=v%X$m4zV*u z4#uNEi}tWWnuriHYl(WaZ9Y0c0n$W+lEr)}o+nOORdIWFx3WEY4&>vrax#d8f9w0n zxTQuhJH$gTz4zPVhdqo}2sBB(kC9Bd9hEtNO#TE?aa=u>9&%Tf&9*|A`GrG$Us##s zXEFt4A&{hL_Wxq;y~CPHxAx&PN(ntd1Zk2GDbjmYFcfK0RGPF90qN31CY9f6`AL$g4kSwQKX*L(>=I(j?4)G3CY@%#(<=AyY7c0lc_|J{8}HiNxVEO$R@ zt0Kts)}D#nE%qY`+x5a!iSEQYUpxC#l{h>5uF)#`vSvpNdssLHa@zZ_VO$jR_9JIl zj1AciwIwPUY&N`;iu$a|E1yXoFk1hD^_zpe*q-E^4J(2_OA<`++wx1mu&3>PX+ zjUxN)5i-*Cw(ON#{I(F0*fj*YythW1rSAC&?#8-_(u_3>d0EiX7Q9-CjQx@-y*;eZ zPlyN3K-RC?gcDg zS(`t7H*%!UW@#JljYAQv9pB{pJ7PH)Tb^a0Dyw`sLgpQqY12}j;ZOjU4o=`s2Bvkx5)P{GgNTRDY~Yin;;VCk1a4M z9vxqa_PaKPi}$g5GJ+*GR>uh`MafZ{pD5&GBWyDQtSk2V+(CPeHi)v71IVew$fULj z%Gw9p>uCe`^N(rUtT5(FEhKEIe#QqTC92-MGy9b^4HL@A7K)#SV>k$xtLL+^!rG=; zR{8h2~<1DnC~9z%R=)j z90~l~K6V@iC*)ReFkz89(6}=;B_j~}s#2ZaYG*~-@I#R*#udZolBoO++QU&3M(gUZ zKIBM-eKZbz(Ril#$$4)rbBq9MLGiL|V%UISqYb`l`E6uTHmS-h{{lyRU!qLt#stbr zuOAhJ7*;%kVot>4A@sUv?79WUT_mijpghAh5&?3pfi7!n!!n5uT$?-X3`ENkB1c%0 zgI=O!+#|(Tn!O5Z8ABQVDj--VlH!a7TM*Cq8==IN>t8`z>be&{*$=&0vTfblSGpti zM74=1tbvH_u_)B$RWbbuz(YVX4&EcaAo&)=IhM4m?xER|T7~cOy%VWLaRjmU9BuO` zP^&&U-oUY}4(+aG950!U!tUSNOkPhlELUhIG$6EsG!_B3dRV&$YW4Fo2}A z<*UM6(>>VrM7tr=!3u?7 z>XyISWr2|ru&N+eLR%ucuJ0-Oe&enA!=AnusF)j04#xHt)d2}2xM+fRX!x1u&-L6g zHgYf^i7Zky+L!6ExKX#fRa|qvPJdCw$cH27HP6ew)=&Z)$p+rE%c*?nVrCV`z`!{a z!w{Ly5$Gj?q)F3FB!xKGI35exkY)RbVWN>k1sFOND0|tr&p<_nJ7p_Rk& z9sBfd79*YH^ZKU)ETRt=tG+m$JI?@-?`*#DYN14}dC*$GNfkfFnIj7#KzOf-tGzwO zJ9VILjJ(7Qg1u8tJA{yMGh>GcGqea#xKzkPP*(1JCVnuJGC{7%WOU@IR^E8b2Nkg4 zqb#c)G5MLzqI=ra=L8^~1m~8cU7gsfGZ642K`D@F8x+U13WS6BUM61h-9*ST9mVh9 zipHy=jpb3>6I18}D;n5C!xYA7?@C_WV~OeAxVG__-siHYxVdJ@hBB1r&P}J03rQL% z#ydgn$_ncG5OU9#&-Z2d$9z!UcqKQ_aDp@;a1TpZU zINWr_$BPFz0W;5*6bnzOOG3qcUXfWn$mqO)u1tldl~WCy1jy)Z#Lj z__9*k+79l@Nof65mT_ZQOHSxfa>>&W0DHJx&P;Vif^A}$r<6P=6B22?6 zi(gjmOE7bU0cJ?&PLlZX584#KaFmIfwr9Gv&0FQn=>0|Ub+Lt)WN@O6EYf0Qv@@b+ zkfvjGXvzP;@l*GZH#Z7PNo{+$vz3$SpUwBCV*?}!_Iw;P(_ ziznl*2}R%xx~$abzVs^GUfEh@PpVY1H9zTW|uH4#5O@vfo{-Ngkz^65w7FXKlbyjfnlln>m#hhvIxL&R0< z<@@mow~>48f-?w4=H(!vO1+>Cxeo4LezT zF#t>u_O;MUtLw9mjx~!wpnK5?Z-w6WNXg|??wBo6zVH<|_{btlql)ldxDLIotTwA2 zHamKy&vVm>W#`mmN6uPK$?s;IIV5pIcPswE)NvevaeIi!X4;m(10^uA_-c70$s9nJ z3`~T`VmEPI-h4kM5JN@#42--d(~21Z@~;icY3^!=B==Uk4>Iu8HaB-RDnc&z>k_H* z5#cwZ=v4Ix-!cu2Q=PH+7S0xDiJ`mQVw)Se6(i;Rm$y3T?Q)9>(51A_lLQuYJF=wf z-bDD6eC6gAZ>yUKUFZEn@!R+t#wuVW)i-(L*9Jafui?!5$aKi03CQx-4wtLM%%knd zF|cpOk_z95b7qwqvA|>%?T=XD6)IZe~}kyeYnH9>~0=0CQ?2C8mSVbpFyvoITcP8y?ecjfL_b}agFx>smO=A0)7Ad zzbG11(){0ud`QuI0Y>p>yysyxexuxImFWFcq80{dMN4H;lR>ZySR~K)3jB%S8f~w%L{(q1l5sbvmrV*h`}JRj$+Z zyqe=nxAG&O-7b^VPHKW1ix0NhtSluAwoi#EOfE&Fn4c%-+SJ^9;S2Q*Lq4xRU06PMGa+12IIsAy zHmgB;b99s~N2Z7>WH zD|xqtkHrzk;(`Q`5DpPuFe-vE2EF24gD8&LVks7?Y~n+^P@Aju!8rac_!y2hGroK^ zEUtZTZ419Iqt>xBeh<0CIS6EVj@&r6=@*8Kz0<@hO@%)IR;fc2^MTf-`&j(;XG~QG z-b;6rJh(*v5z*^J(;lnZ?5~+zF5KKCIS9JQN+T+V1X?~CB8-=s@UtU|C{TLt&sVOB z3LNvOOtDv1xN&~ncmCatk*S-EiTY>}2-uKwk1w2WJYQz81QZ9pBIb?2aMxZMUPXwKW*s6JCbvYy;Qd=BY~fZoBb{C*cSTZ0* zRs#}gJ;5`}hjLvj!hD-+CMf<+a=hCmH zJ*Jm~hMy5#u(F=8cCgJ*(z3e!SyYr1+s&2~X^cG1AS*R+U+*JqCw*7_QXHtK(XgoA zHAST!B6jt?y*#C)#~kV(cnyS#@F9j?LsNo7%s#Bx9MHQrGbWpP;u@}lHeNR>Ne#%t(qxZd@=sbCVUsf5KBhR0|F?&8N_61-M+mN~d}}7?Cs% zC?TroMP!Gd zpl(bp$6KyxU$T<3CN8mgq8>wQu8XO8*=kB1nYgMDDP_`TzPh7aq7#SR^j)EMHJ7ld z1lZLZbWLJ!MRcA$WU~;qN!p}suC9&8Z_sycqb%^PmB{jCS-GB02a{!Wdh@`R^#-XK z-H6SFfN8vzZW-CC#{?hMT^G;@H@BRUMzt@s1A|*@x9Ba8h!HeF4wBl2QJ+_OQLVvr zDQ`Q4DrWiEw%20ZN1N2S%c_krHXMFXEx@w9RS`QDfJSkJZf|#d&PYmO46PZ$4|&Dr z9+C3k+A?DilAym;U!h(?FA>KylpO$u%n~&Iwnf;2PnQ%wpp$J zYU^jsEUQaOvNCqK33jM)mJ~vzX<0Seq-iMsOJ^;jLaQ=nPY+69Vc_qZ?>idmlWWX5 zHCl`+g-u$e4D5qL`}l-PA?)19Vjc*?iuFAfdgBnbGOWUs;u&#}lXSRUpMlX%`G|MT zym&ruJXYWsjM$5$EY@;^2}i8-Xm+7SNB3I~p=nk6GxG^ov_2n#-HTdy-dQak=a9H5 z`*H!xe z4M#yNbjmxkEvuInwQSv~4H2QLW%qUhb=14E3tFytN>mi!SSDgZi195&4h=2k>aGO# zkkUKL`6kdn;>zqy-E>EoF9}^5y%XjeIpw-?kJf_R&FN7_u@grUoh&~u^@f=#J!IeDi{ ztw0Fc!Y<7-gkM{heb6M!SZ`BiXM2|hC3qKGA~aBtewB^ZeSHQUuwfb8jKoz+1I*Cx zFDpU&eKZ7s8r_+eGf)9!S#7Ij2MKMnd0+@K$f9SK~;~ijwx)&4(TK z28}NM{0Mf$NNHCHOn}E(1vC{PLq`BVwb>r&ZRudJdN-=jhBY14~PW_99kEgX=T4QGlL}IsimxI~)K$TGw zRC>`|cxB15NX(`bAKDVIjUT_3af(d7NL4z-vNcL|Y$JFjh|uZ<+qnQdT__eG;}2@4 zUJZt7?bXV_4g*8%F&-J_e9H6bnFGvx&J8s&=x)G(i;4c=DN*feYfaSn<7+AV21ZaK z^SdNX+w+l`S5winFOtm{qVC3D(Z8vgDE(SFEvQfODkAfXhBssYYh?H^5N(cE5Vo@tEe}FJc*SNjEZ`b7^-t_ZnmeWf+|!hE50a-z#h+5KOdfR^JfRasZZm)@0#AUirb=jYKJW z3DWLi%g`2XrU5Z_TO=1_=@rnSMW{Rsmsim~}dA~0c@&M7bpfy39%^zH%ayLlvty%*6kZP}Lsrx1B zzLhmP@y!XH!1F{7Wknjb61X8U3Ng1Ens{1uv8#Pb<@GT_`vQ71vQ2w+)B2H1WCQFc z2-(ijcGTQ%uyS&uv+u>o#O8ZMXHOE)_fSte(C_4$lY+yBh)c!B`I4^otsO-mv*>+S ztCLO4_P#DSA80weHbGk%*L`=H*3oJt107 z@_YG?b_wj&c6Ay}AD15)t;;ojeP6kLN=)>OFPcJ&FAu+oJjOZ5Ypzu-n!N(VcnL7W zgb|t(rl+H35`@k&$_<(~19+wnt!y2~>YzmS(znaKZOzlmp8*&3G6L_NM-MHC62#7o zH?tp77;fsbM?DcNUkGbUm5v<I!Fnu7?8_Vv<_JEM44rlJuBf#S!U!c7U$DS^uRK(#5F+cS@A| zdZpH_j~TZ16k0_OPv48&&VZs3S_O8sQi4s7x|EQADJyDl`?In5XHpnmx){`-=2JC$ zQ)R-^+_x2Ow!9OF+D3&LOm%{M-j$1r#4ZanQmZ;K%oIO?5gcWP=+0rYFwTo#a3D8o zvFqrv06B{raT8xIB?SfBYnv?&W*@yZExUM~D^?fPy0mW)lhzzi)-P`>xZu+4BK%-0 zjQBI?A3y)kj}4W+Ta$SEt7&RN6;+kK(%jFn%6t2(D=L1qztXiTN`c78fKUoUdNMIR1U`fJ}&>l4gx+YneegOU*3;NH% z|C;Y`{qKA~|IPQVODsR=iJtpV$(Nn|DWO2{&JxEOLvAN+;95IX8(S_{T}DwpqD>D z|Lbw?uiS6?Zt#EIZ@)#k(pwJGYsP>4r2h}}|2(eBA1*omo+zH9XOZ7Bw{HjE(&?|Se9NQ19(+rnzaD(coWCA? zOG&>Te9J|@9(+qezaD(cj=vs!ON;3T-$Lcrk=6bfS?!OJ)&3Y+?T?Yw{uo*9kCD~> z7+LL)k=4G9{OzLsp6)7rH#zl#0|NB|BB737W3-y05>#DN$(dE&3Ki^eITZR0n^oT2 z!`&P8KYZ$(M@T?eu$xB+^jo)Rd&`SH9&VxZv;VeOp{M0m!2xdPJ?O7|JHfBlolbqd z97-QLg#M{-*OvY%>nnjCP&%Zi$JbB%D=}C9E_VLiTI=eH|DATj|3;MylB6BGcT(ci@Z zd-O_MT1ywO2~1Gwg{(hbGOB+U{{Q~#_unz0RlZ*T|C9)=Wa^P`A_DSz&ORd!`c*V( z{RsbhCc{-&kJx+YTL?#9a;WmfJE9?bU7e}caiGVELd7q%Mo`-Pr|N6i!qk&h?BH1*3e!73>5`WR9 zTbxcxjC19ASYNuR4)=5c$d#@Tz}GjGC8+7`bBTTG_Ui+X?!H;Nh|VB9^Qca`5qsL{ zSDPeT#cduG?qx>9`{Pabc5 zX)A4FH`1n+x>01^^w%&=gk_=ScD% z0LT_4KcK%zksNq@Rcn zE@VsDD6q3%Zs30)RwoaQwVdFIRvZLb}0*5oHAsX!1!D0J&q(*+KQ3!Ub7 zCiW-+7XQYZ!_DUNR^eFryuHLU>B^4*Q_*AH^=Jx z1uyG3c+>~of*J@0yU2mlz-i1GVsTRa?Rzi=Veu(Y`ZKd+O4jU$b~HI^m{C^N-s)Xrwn&45Ir1I?`Fc7#kQeeZh|g#xb1h zHdNj$TC%@*5__+?Y*^{=n?-@9qXI-G?CI^*GF>v+yB^rI>_pGC_Y(JB2KUF_BRkG@ zwXfT(Q*QIIO7HF+o35=dQ&h%KV1`yi>kL4mw*gzvy{M=j zXST2%3E$EQVhI}WvEyazV-SdQ&mhz z_-Wy?s;=B&6ub1IesN%bN?n|V{9%ZPrg`Zt2oA8DyZPF$k%dyL(>0zVxs<-&%$WJ! zR8#b!#n2bO!@eHW{^T0NZ@J{sboMjtE^=5WYcUL2hl_#DZ)g21CQSf+5hsqPLe zli7hv?uq)m^$BCb*V-T&)SHUN4~e{pu!}amC&6Gxjt>8z#AkSsGk1jGj-cre9U66{ z+6UY6?m2E8H54i*4O-SvWt56E^tY0aq)QJe#)$6B`?gsw&IzRn@MaOnyovFoK zji&yj{S;WOe00Tu6J^|FmYH`&*ZE;Imz-0yEHuS%G6v`TiI00behAeLp2N{gssp#fwSs&NPeWw?lFlv0CJcX!F1BD?t*3GkWsteVvsv%K9!SDg4V z36O5kqz`|BnjVTL0 z2s`z%|Na!1M?oc+AwACX8#s%K`4D1RzM2B*39L_Wd zFSdJfRWk0QkgV+!w6EY(2Hb37bIk?Dw+k!c1^D5ZrrTa^M<=$Ky)sB7+>0f)9oP5{ z_`}*8yeBUgWXxM(jXrZXN{PSM$7liX=CkBea(2USqu}%M1|N!h#{1snD;tC*;d+d$ ziD3LiSQ#kyKE!?a_*HxRhx>-lFD_odR3>hjKNA&COKq3nU3AP}H5h)^7b(h(m59?5 z@G%`wv6IgBJJGDdUnw;ZUJ}EE)D%}O9fZz2b!-`OYEMsO;KxTA1NM1FxjmH6bMGd zA12Wo%e7RCZ=EM|MWpSl;RKz=bsG zE-vA4upB9L`FinWQ{C9cEfSNEoDs)XxY;zsvH|6h<6%q4PP)8%jN5R>;!!3Gc49XO zOxz(XMNp{O=zzS)D4Gft2P$+;4l{2pBU06C*WCTl)atjpO#v%jE+m(n9{2-=UEyH< zC->Ha{Eq2P=i6S_X5lCT(s&ZJpaY719#thJOBV)MBhunpMGw?F32Tpk%1G*NZChug z>oV}m%-ufR!6Z6KKG<+y1HOHZU=#KB~Zfa2R?6}2{( zET|p@Nh@v&NmE6S^5(kzl+(JI^oc>im*uWEU=a^gPM=Qt;PmpohJw*S1^E>_S=|@> zsf(#f(?>WHT=g_$^8#()c|Ys-=&%=Ro5?EM=FLL%Q`?FeA$;&Fr3zmoN`0S9nsKmz ze&!=spZq7V)knJi^lf*P(E(VKACmp^Mm<*arGhgXqhy}F2PU4ivA^xokG^6~47JS6Ly+`$j~}-3%RDM;;TbRSEYDeN$giSaQQ87NC~#fOY9zO}yO< z?zTLLYQe7+s{0%=w>@rl&eyE0J=_*zQGG|b?C^3Z#obKOdc0&R*XSTapl^8Ah-~I{ zm-kkElXE>*kBw3p>GCnEknT27kfso%n=hN=knnxQ9z9)sn? zLH$&ezxZ)n+*QN6$$^91D~8&uTyvZz7kG-fF}FfNs{`rN%xh5@Z#?bfsDK7%l!)SN?xGnx(rGSe+ssZD7C+#_< ziG8UOp4eBie8@7}cZ+l~qB8s%k5V*-_A)5U)S|2VWG&e@0ie_iI<&8EN4(QTqLFk} zh7MrKrl$%qCbc<%w_KY?Y0n^fu zE2AY;@y(Hyx%9zWMAT-}x-T(Crrntm6R^w5HDsS-*WB6ETuXA6$Pzd5(3Ty7Af5CJ z^Q#=gdiktJaWH4yW15qP{XrT@>6UwB^mJW;o>mw@j{WRKf&LP)0t|M(<8ALT%P^hS zb;gqybUOC4QspXKsI;Lt#?2{oSc`+n7uN?{*)V3`CnwVZ3Vjpy+-alJ7X?)G3hY8h zR`14y0imlNx6j_>*HeDmyFuXdQeE{n>#(HSl8L@;=1he>Z3dxDknp{!B>SY1`>+WL zzC21}dBJg$;kZ_-#9e|{EDL>&tHi=IU|$y(o-@MgZ=-H^mP4TlKT6AEnoq*hYV58S z2*{kSXqi~;J-P&}n(B5@dZK*Br>a$HIwpp3net90Y}3Ex3_JDVa^FHx;#2Y3II(T&;|wC^K} z$c1V7J<`te^og-R8h+S44AHSR@lv#j%@QB_{>dtn^&8C(JvZk#xkqCa^oF)ZhaDcN zGYT(wv|&ALeU#nl49*7aW3LvI=*b+GQx?&e%-n1`6Wsm=smphokU2g7!400*0MFbo zVtjcG5hBNo>Au8NtZn6=06LxF**X{evm>Jdria1Ea2-4xR03-qV9yv4x;E7|i8U}# zN^t)mf~5E1uA5c4bLUWSb^V*Uv`8I+mqPbMSPw`i`>|xB4FdZyzlOz0q7J`Mu<~Fz z?4dIB<}#1Fd-7+FlfE~{nP$ADT^zCJ0#3~a!yjIPXt6D@7tHI)*z0>^TUxNlxZ^Jd zt{Mar_l(Y(V2(3Pc<0UY-!488Wt)W;Crqv~)RpvE+QfGsBP@4l3{l0~(wC4^E5Ov3 zL%AJPU82e6;~#2`YkXH~@b@QZ|K0NzWyP=C8vk*E)^o`u$dmu@FR86!qR_X>sXKkk zeY59NE0s>cz&9AR^^a@je;Jra5L`0nuSslz5!FjH zX)dtt+*viO*q7G3HI>lsQ#Tf%l)v9s>Zb@P>K+TC93`#$Zn>-6thK$x^da)^D9~%i}FHF;vYoqUF=YQ}?IB0;?`or=ibSgJlzm zMVrhuJD=QBwysGriO|ZUq^m4(R1%ZHk#+%N7a;@$Nbe%H`cBC<$Ds3$SA{WAHkDWr zJgzf8^{-rQjXQfDR&2_inK2mvGX*9wq6~2XVPD#_K)Tw>1QfGta<~Y%8^C3GGBoJp zbNZ6z&nr1ty2*`1z8@|d`@G0E8Xx*GaVK5cR#f+~c`Z6+7lwUM#!_bbcQ4|uRERm-();U8#`Thi zz4(=0`xPPzZk)AEeLv}~kdoTvq$bGp3AdZ?tVrz*o9;**VL9k-p|ahjzo7WCG2wg;BhR6%a*t5?gW5_k)LWZtyaY zXKJOf7%^5=nINK5D@b`-Yt_JJl z`;ouGZCvocQdn)c4YA~TXHS@ei@BVEOspz-F5NPH&!IUPx0coJ6P`nMK$?f&1B4>W z_jAHf2P{_rDo_U8x7>>=jyA;@^VzRO!H#+0uVpKlTelQa-wbZSb3ht|b<-olyKH@)j32xwve zxjEsX^AiIHo~4F1n}=c!7e)wsdIAvMIJO$ye);vC6j1EOpjDQ87|=_x4CP52{lbf< zd!xr-%$omgaITYQaj_U zR|*_qWf|2U;c-fH_^L=N+v#+7EJS~KnRLL;swe*^L=QaP-7Vv?=7&Nyp&HZvS)mdb zIF!$2qwk8yIRy|%Xy+&nu{D^X7>^?59Bj;6vvP)f(aa>kEFWzM8VMyt$Z>{Lg4fQ0 zlalJ{FvS$FHw5s9d7(XXWrgcCHN+JRtiY|#06HzIVjM=7o`|U)RRDKP7RRQ9aUrP(zPJ{96I zaP9N|BIUCI^` zl5%Y!^ybfxLXXY9;l*`0AiHnQs`1-22V%otw7Hfj8_B-J90_L5z9S5F4Q|a<&#gQk zVu`rF)KL7a!bGB0$l*(Y$ikJKb zsZ>soKu98*gVF}hDIL|<+3{{Qy}^3-`A@HJdj&kmthjeg;S4xNII9Vjgc-Q1P*Hh&Xv$tsh<99_n7zT!UEa!r6(3YItEJ{P3T@*jmz@a@>a%;a;(%qeF*kD=P zL2!+F*oJBrdK>y`wwKfdV|C%o;iC5}AyF=0Zxf}UTRv}H*T2|-6rU6I%yo`1LA%5) zl|E9FRf0*}NT)Kdl1iwZ2O6&3!&kbfJ4^c}+n6h>HK;R=-t~?qlS@aN&d_@xkm}-( zv*`88t}n&jqMZrvJh<-LO5en3U!n%!Q4$MRHR>uVIU+t&I~Qq_YyC+Nft3hTlaVob z<`e+%XFRpHvQ&{Nwd3zTwW2sZFt=`FtIJX2xT5O2u)9e~4%|CM@L3dqi7+rABeaHKgNOEaO9}C^e&J3i!9p?~g4~_Yen9 z8Zu8|+V6apEZ}`|73%40Qq~?*f}crV?^$f{6D#Im3e#)dMlqZ$Ox!db+UeXFxGW&S zAQ4MjA+HfP>!=r;ihYiFP=p6N<*Z%K z;N_?OqI}-F@5{+7*qRqJRj|iY!(g71n*#4))Ux@ATcBfI@{I;VxbjQFJy!x;b&#Oc^e2y(y*M%1G%;CzXdy_S*ihNsTRro9_BPVa6+&lnjm z25o%u0G-~(EeGH0)NR!Da@pK>c66UQF6^cxvkorvGSJ~TL&^1L{9WK|ZD}h9EpbEl*kP`X^++0Yz}`Bd z`feC?IDS=ir`d%!-+RVaW_nm6D#o$D^Q5|T;ngM<&xS(qos$~g6=M*4eFvH3fswQ2 zo*xwM)V~k7KbLMWArmpPZm|+dlrt+i5?CW4YGN@4v0SaAQAgFTr^?mliP8`yvLgg&O)lX25Zf)9eQf$?7#ik0j*Sl#?=-+qfPi_ zk3`Ws$C@`c1CE&;quxa%yB+s1hSj7LY9{=N7UyU4SD6`7TQ8UjMuZA-PhGqDrLcN} zuk3pJ3kFX1tGV91FeJj-Qf{jY))=`%t@OadI8q{m)WW9p@@{O+capJw(rv3wyE90 z?S$tB(lp_IXX(h0_9oPKc`&jk_%kfm+JPsk5L0WNSJWL{V5lNO*iIyd=jL$3?Q1T&;?L^MW)B&Kg)<80-;=1r5|jub92a|VYzDY zcLEI#!ErlXliAjrp?xYG45GS38*REmzJkkQ#C?8_lcjf@YIyJUf?q%cn?#@^l2*s9 z>A&nBstZ6yhR=))f?(;$`%+lDgmAH(5(5>48Rx8^5gfxDcjmf$>(dpcAZ}5{+wP$O z@I1mveYv;TlYD(2BZXcmo$4Kvm=Y#tj07iYXA9k)W$$Ko^tmV7k2g?4xCZya@|4~L z^*zXZ#KQQfN}4NP(*g|&?VOo`WhlM~?vnTJ^eV?SL=P8%rXi93i5*ZO$+;ZU|i{YDSSFr$O2-2O!o@{}%B z2oDnC<@8k6NEc!F(k2J6WWT2qI{PGr;*OZI&ZM16g=IiL2^kT$S>uf$5FyM>p14OJ zJtZ#id;;4<*H=3&>s7(-vNmd}%X2zCURMy{u^AvrKm^#Gh^1G4k?AdPT;exBYuN$q!E*Ik*Q4p%e=Z+w zYDpViCt_Fa$W&kim{_7eSiMEI20C-PC-#b4x92)`hg;SX3~$v+;{aI|l4i-E;;V&_>I)w)kI}1yY)XHAKYgrIRe=%GH`p{ed)|xnNEWp zSYvnw`S zy=6yM7CvRMUgKG4cr>jDAwRFL-0IVa+nKs!fB%>M(lYou^`NB6+B=;U>Ba^Fpz}<> zxt&jM#$=Bft=U`rj;+Gp35Pb^9`s=!fyDvM^|&2a4NGR7E#5k{VHmg_gbYTZLyldS zJ4DJ-!d}aMps^onqOj(NTnCcGR!X6P8cE%Wags5*KoMrK<kThi=!!y3&8Ck*uan&olnxG@;KEEy8n?-#+bK zYKK^N+^hj8{M5NhB~9Tw$A>Q#vM<7h6-_I$+>}DZ=gw3qal(3))VWW)8~Av7>cFrZ z=n_@}#k-Qj3N^)}5n&zbqJGtAyQJ;?$)uDaEB_8Z6>xee2S7fRA2Z_pHXc<$7YS!S zt_SD#M^S^t+~M!IeaD9CdN$%7Zq(qltGfi>#oso-)nYIAnC~G5`QG%3Y&?H<9v95T zOE9Mn!4fZw%eX#PFbJ($Q2~UYxGa$k)0Dl#K|(gWuPY9#DXkG`rAlBhU$4TiAdmL`)im*d$$4^+93O zc}YohR!xlJ+mxLJ#Y~v;OKLHke?d^dZ|N)A%^ou7$JVGc*2DPTygn`1_88qI^5K=K zL!ZK#9DYgSRu9**^+1GqA6+eGvEWpHuziyGfl||Mr8E7}rp1Y*!g7<$0YL+9txI6} z_n}tl$MpRk(B;{jT)2w{2QF_AU7njts2y=u?joMNg8;u2;y~D?NK<>&D#aJAz#O9-#L}7~rXC?(|I>WK_;m+i(qR7?<@hf)N)HIfe_LO3*W* zFTDheGOuR5Y;=7T_?%ImeGN6kr>}gSeWSnU0~A@y4RlxqemIx&^x!d8j@iHj2-b;D z{TAPIJq^}QVuugsLow2Nck`0ZR3Zuie$JGwlpVit5cbfIskmg-N5oh*8jmOYlfWn3 zGSc)<@M`uRf4-gwTP~M+QT$7vlhi32mTu?xh^btyr;H=$8f1Hd-kF{pVXz{DTMlEI z^g#pE(3r)8grN_GU3rA-yM?#?)lq^^qr*&1+dEj`IMK8uk3 zy+bb^&>^x~*lIUQb3}d)n~+q}Ts|d&HD@+0T}5#%Hv000#u==pI05yG>=dsstPpY$ za6sX$q7Xp>oMjkMViGJ#rZ6$?DC^oR2~_S&fk7}1)az_QH0D;mMqFXTJ}Go+IBfh$ zBQ?ID97fg>Fc=K36~u~K(mm3}on6BdyZzK2P++HGS#Z5O7TB^Ilw;iy^GAf#q$RQ` z?O98Btm0FuUN9=$s18D<2fCr2;6lf;3{vu5C*VJy%^2Q%)LtHnVe+{x)asnyy(Pr- zY{Ce=FW;wI1~aNJ2#>Ud~;5`{wSHgA`C z;CpuS4M&o7(+KU%fkam4Uh6uQ%bg>QB6rz_beSw*(G5Q-8|1G#Lhcw0TcLsQvTcJl z8f)rpeyj{>@H>Y?)LB?D6(xOEA=pu*U+5T&{Zx<08@@ia4!`-G^&(OLYcI76AO z=1Ik^j)}l=Io5;4oBH%wD`|o`Gwod71eLRvjP4}GGh>H??aTd>QK3B$n1@v$ksRMi zNEw&L&kTA&s4={|BpH<8xUnZ6*8#6YNlQPub`SnYhxg`f&1=D1WKkAQf$;fUMM3md zb|8NBc1J-~F)ypz63F>A*Po-?c9`%~>^%yi%PdS(b3@%d9qHp;UO$ROq~Vn_xpYny zUhimp+%S=C^AsW7G_qcsa-fU<`N)Ievf*?2IcF0-pN$*Pof&zS1;nmX0xsw;(T5tc?sstb_Y=>df}MXR$d$b`%UiZAwlW5ffsE6 z!U&>v8{qZVj;5MiL|*Y6RoOTI^~Y4gtTI=nx@^;`#?4SKtK2W~s9_+fj~&C;%!Z96_FMt;;sfa=`QZf8ym+=HuU_mLIgnVG@hPvVX3tGG&ThPQr&~;&u7y*T0YFQ6e9U~cJ9?$ zol5tGNgP0aeR1LL_O-w7&F0+q;>e1rPB0y zSGI)vwU0?wv5g;`szU3D6H=h!CPp9PQRQC;bFUPUz=%*oSB%Y0k6p2gTE94my$2g0U;PlI->O}YzZn#15Go{z5dp@XQj33rN zmULd0IkA+jE>j}FWqjIwpBRf5X$)ojwr<5y@3kA5>W?L~Up!B_qI5n^rdp;r+?O6X zplc1$ksF?RWJc9eQ)q%lz0TS>ERCDdQ8V+}ZMdv5$tPg@vhihTVbW-FpT=SRoRUE7 zLYk6llA(w}?YJ?Y!=S%M)ze!i!Ery#tGN>y^*#|R+bL!VyG|7>)W7Xix64rZb6~Lyzhm zC(&WHJs!2RwkWYmT=6+3zGS zs{YjUcpKAjsz;)G$8||i1u(UX-}ul`c;gxl4*5)s>Xrz3u;Zo6$tKW*Zf{mvPp3x5H43T_)|mRV_XP!J8uvJvX64GVp&!&>n|!zAfsKSGPufl;&Sr}b zPNzi2_@#I~vhn6QT7Z5MwRGV2m|4`tFxcn0ydbHheNRMey$;p05QzGNO@m{)k|R8F zR%>CGZHH&kieJ^2u*yN^jgIz*yjJ-A9jnCb8R_cKH#S z$a_=F#0shJNGdw)3QDuiQ`;ain#iAgod`i6Qx^?&L$z0V#B%yyx7iMtSaH`OTUAxl zg{vxk6wa8s5vcENsAnDoQ>(>B8B_G?%`DUy*KrToe6$TyHj#Vv-Glu8_*#5>rFUEB zQ`yS4rm_jq;=aS##g`TzcoGmaR2o}O>C|+7^nB(U4gt<3W%|^l%0}g=zAU9C4q9|S zzFlq89iY*}q$R3R=5|fxMWJ0n0VA#FVq_jl|B7M6-#a^%tQQrZXyrT+!?%CXD%!C@ zHh*Q9^(q3}muf_NF{cDg4XX1~vFVNO>~jm9`dV=F(wx3(7q4N}f!r`XxE@UW;`<6; zO>V`zQwV#+qh4U$GpTf&vZ0x*f5hK;Y&tbP2$73E?#EO`HLD`MSEJSh=MzDIX6&2 za#hl%g@7E#%gD@R3L)c3G-n-AVW`l+0HY}#_B75pa7@@x=CcnVf^SAK+Wns|pv<>= zCA+U0*&@+Tla_>uRp#zUGz?f!vV_NODCC~FLG8dm!h-f^s~x=l@QOs{(9?`u>`eBj z*XaXYktT^2Xe-y02Mc=}KEPnuo1eSFbd;|@zAG-CF2;Kd+pVg$oN)&dB&?hc^3vQ< zR{B~E1xMFg-<5mFtGO7f$jm=e7VJKTjC9xF+4ZaRes>52iF9^5^V_GG@WbzA8S#?6 zvMC;t>83_H#d^MXOxR^oxQq49LZy7d18(?4V|ZmP*$mnBGl#^nvoc9MCG$#xB72L$ zH94LuLcIIu`F4^lLsOCuIw=+(4L$oB9_f3>=Ms3ZdV(r83I;{S!*R~nkuOYnKC5;~ zc&nQkn|Q#6peAayBD_VRg_}w}cEZQ?G8Aeqi2}GL7-RzGWu|@xavj5V(+r6e*|NYG z*Sc}WJTqeSN|wQ;Ue4r7Xi!5ZP9+)4qauY5*P?@v$k?{fK5=-vzj9vRK+t>#!b1){2Od1 zf+$3i5*ux2zLf*SfbU#xt#s!M9IP$<`c`8LQmIn4r9SPZQZn@9zSR=u9BcW~z8-Lu za6g|>i-Ka7Y`cq}V{+k$dA*@@w%Z}4o3R^x#TH5v0c4(NuKEEsgtcwM~j6&t5= zOT}!Y!%>MTL$ZB=o^i_$BcHVXyTP>I;MD(tH1V-x$Nv{=jC37M5+4Y*=816oqDAC- zFCLbH=50+Ni)UeJ2VIzB816 zEoICvevjm3zo<_;sLxRL2{#2pcBSj5*)hXDhvxR1p4dOv+n0{8W5=8Az3heviQLCB z(Z4$TmHk2QDG&>NF;TQ3Rdvq0M|ZuEQ-hy#G%P4nP&qMXlkRh@i$kjXSW33kvlDmv zjP!Bx@-5at8@e^*z2S&FA(9Fa&(X%Xvp5JWVn-aIS3>jVQ%e9i&S~jgTZiUoffW z?6yK*@6+ud0cBI$$N~)@^lU}?`}e2_9f^?VyNOLbw?0c8w?WefUSt|nwEN?`)J4fp zO>Yj9S&_Kl?qL04KlHfT0YUW_ZH$7NO~^@)O=&j$*5m5$)BL|Q0#)H!h*DxBp_~uI zWs+CoWGm;}YUL#z^PsQK!K?|F6^PaQ^+5suW-g?ttON&CU0ueiY;de;4H0rT8Y(M% zDnBM;CBw6Woy@~%6g|h8wNR{gjh*EA7}*JR^;43XP+r6gdfBQ=f&&jH>E`Rf@89R9 zuWsT2*XpgT)m#t1{5YR^o%!(6&{Wj)uE5%~rZWOGst2>4u<)vCp_$Er|H(+1WK354 zmhN~Nc|z^bHFet?DmR;=S#9wvaU5+MK~5c$1*ek2)Op5ws!+Y2}J>$ zLf228?ZB8K%I^tSHxsMrWkT4O@6<&_VK6cG6>}#-aL7~lIu&lmiOGUIU!j^eSDWd# z7f<1kMnztMbia(VrRL`^%g7dSOuW4Zunqcb_~#5~j!2F@AkZfqS3>4nLz1jiTRqO= z{K=$@mDS-Q*hr&=c)?7bV&XIh)bH4HN(HO=+%*d_X5k>&O8qy}4I`Npzfgh5el2W51$%^+FRYwKny86|7>m~(3KK-rw#ZFe%np6!G@cCD ztk=s%HQ`xk^x@ymdpX;FX7e1eNkY`F_IR8YYich?HBro}jOY=yJdrTG|wP$P!XJf57+oScy<+MCNXp5mfp1ANOfYna#U03uq)UN4@=L_Drp25)P@ms9U$8g(}%jPlu zTlYN3rL#oNvb%Z5xM=}NHnncnK>1c)WNuZYsk^<+rPZ&Y<#;bod`Q8oOPG6c`W~#M z?$wE}$BVs(gN6j9I-56JvyRnk00FBLrH;eFK8HTOYBXx)K!7R{Bu82)A*O85`WD#Y zPQ2=*TOTG<=+-aii_9S{WnUn_mJXUX-YY{~cqyLT{jnJsWuhIHKtKLw!Zhh^k&p?j z(YD_N&hOFSy(JM?O(Ou1gcAbdt8LjIbw6gTxr7c$O}Udf8sL3DGEA{;iW~H%9NzU^MsKk>zS!G!_r^)Aiw(f&R5&Dfeoe4p2@R~f=$6i7U z5x?%*GZAw!z9#f-I>FOON$<;}^L@c$e3AXaeWw1exxt3y44^-Oggv+ zlJN1}^wpYLSfskM*KcoP!Kdbs^4cS8-%IhP^HR^cby9{x@r)IA&7){))6AVSm8)NZ z+Hh|*_j_E7aeRXZ0{wIqc11Q*{GoxG3Y2o!#sc!=HhFPG5ll$3Ofbcz-hP-F#~kG^ zNS1agL$o%OlXl{OD{kQPwBr#wGL=UT&|lfVnnuisjx-b#8ODgX9%zT=5+v#K_elPI z5oKZ*(WK>DzJ}JdrYq)#T^(glm(P|!ZrZsHB3-Tad7wEU)h2!>_kn5Hj7btFYO$2( zH@WWI4#Hwj?BQim=B^+q?Bf2FT|l-(_uB;#&(139NJxePEj(lG9%@VABA(ny0XTZf zqSWvsX#S}w{VO&iP0=XUz^l?Hrp4ZX1+i+Ne_z1;;^QpfLx^0+sSs7#*xmckq*cW8f9VAeAFhXzJD&724P* zW~qmA-n%2FGLC-Phc5|ahvf1$M%Z2ISiE}hRRheXlOYWgzFs^Re85a?8I+=s5xFrW zGC!!mlg^#FvCyWQvh0iYTQa_xeg0N(3ymT;SP`vpi_p*5Jlb-{bg9YcP;CldO1vhQ&6n zCAkI9$jpb8QmC}0f|}!XGq-u}gq<=01Ib1ZNsj5yK2tO>;)99kPTg%e-o~Qc>Vo%A z`uaSW;8jJ`wXhazRO7Fw9i(uTpZ6!g)2eE#IvYn5g+BKqTPL22I5f+F9uSF5SiW3UzS)=unngynVx;8~FBQLVs4lhF9yo!Z(0 zgE%GsSSl&@U5zdB?~|%W`9OJbCx3W*IY9*~6o3_wb#B-Uw$|OGJ}2pGcEW zJWqPP%`%#{Bvd%UHgmEdr2RTp^LYA~&c_YU2cBo{fl+ugb}m6*zOy!2+5KXb!gpX% zd9Kp;oalv%hP^x*tX}`>l?h&spd?hD8@X)I7{iIX|NSZQbZT(URe2|fG)nhi)xaAx zjcVPT#Up0bE@M_ec^>s0kjZ8H zcyqdWlftTAsbh55bC{a&{Hh_wYY+RyQCZ|~bmkbF$4#(tQCK_q|uTcm#`DgSc46I zM4oHCDaRWvBv=#5u|M~RN=sV*U0IB80lxo1=kR|M75_ad`hR?F|G0Df-<8EU_Mdf* z|9`mt|E?^?(f?2uMH`e}{I{pg4;Ddw8T3m_I^375Rx!}`$}s!jClj}t=U47J3tqcB zn09LU2-fZ3rOk+A9KK@5d~fUW+?n(K*f(Y}2p@yz!1P9wrZ=Dsj;fucru}w}@p{;g zx8PKa$lf<<3FbK+pX;A=l_m4d%t|}MW%1J-CXq>qNqYq`j5Iq^QXd)Wi?Urc6as0zp&OR=@eF{OJcdMpEIK2vMswM1+)p*aN#wpUJ=9ef{qU{*1 zS8_2x^3}x)@b!=Gzba<-0Or-rDW-0*Uboh|vOmG{t>OEPVKvA2;L|v+AvCa=(q0st za+V*0ItrW72BTg2*|g^d5d5$o|WglOQSmEeTBEK zo!9o$7qh(s0zEq9={r&lV0hNOR|P3gRe`t6ry0m>JN7p@`i|WlW{B1MkLArd9J~9D z%BYp(FoNveTX!hL&At1L>XOB}a3E9{c)mwcU4vM8pW(Nxjjy{LM?`BqQDVF8&JT1ToRMC_+ouZC} z6<;&7>0)aqDJ_{aZQ`EbK!u|fG`QS|wREDcc+dk)SUEU4wuT6ueCybhb~D9C&=s{) zSDk;W0wvfe#jNu&h2 z1vj+|3Rmu1N@^VTUd!>%cq($Ci%=$D&;|FN-gazBUaM^lRX2TcJI^0;qTGKHV{MTy zhaTk$^?S(6r*Mt5wwhbhCD8ODf7y`aRl5tK2UW2a_7?(ZHclll_qUrcDsx&BC`cRX zop8lKY3KdJlN5~In#L44JcXjj{ zf;^nfb^>ztgtJ!sl)6@!6(&z$@@1_dPduVIc5d+& zWQj>ar|L@3DY9~#v^|Ct*c<_yS*b$hAJb2o|V0llDF4V9tr7i$wW}C z(5?-)A3Zf`HV@gyAPec5dNy0ldRn!jB~;qim(hz^BnF2>1XYP5b6^RXLG@zvSD_Uv z)g^A>{ddWHHbfL0IdRY|Qurh}>ZcO^R|w=`ky41$Sm_5!xr z_{(ltxR#xE=In`dL1n!U8ZrJ=WGfvG`z<8O)w(W5#^)?QN8sjbh0`1uLjXE`(z<9z zc4|i*DPDc--fo<-HhXTa$^P}J;slp*rv+R8_IMxPTxgQXTycR5m!@NKy6xQgH+#bJ z=Y+f<x44iY^bN8_2LsWaW4o9CPS)pZ)jCp6za>~W>GS6f!7 z<;!#WdRYRs>b*8IU9hc0ZmSh^t*TKc!q)!Ohlt@xZ&ENvQ?-@X;MmiRO%jZiUi`?& z?Jl(Nfm7K;i0WOFXYVa9m{i?cq+7|#l+QBt<5+ERwec=y##ewqhmj{c4Wjcc zXkq`m@StOyL*lPeGB%$DS~1Qa7KNCKT+Cumhc`LA3a=Wi8o8SSnbj0bf0fvzR+y$= z+lB)COkakjDviLqE*j6iwX+IzYoe_hYJUpU8Gs;-OQ}@SNbwfRrjuq%Te-}b;vm;rCp3c?ho@Ouc3!JjxK5a>HSJ zV`5@aZv?e2IeRWyg$lCc5>W2})?M#6rJz%#iPS1}sC-vtR}156BaQ?lPP$Un5xeCl zUS|SJ6CNl@J7n1%DI=8HGn)gPV=4}KbP5Tc@pS@MA#A0)vp02OCH5*#*y-u=bG}s* z9b$1b`Ahc_4+1g9LoKWF%$c}SM3H1Qs|&&Y`P{3e zRYLhhg=foA4k6N__FRreR5PLdP9c!8f*6&ZTj-Jk(?OF&FE~?LbcTPLXrsul2 zt5x8qJC;j{S{onU9IWcQAhuu2i|gu5*I`}dWP+}R_0+Ur{hWps=9%i#ex+l#rd_ww zTRx-=&WCV)=_<3G8vwOeijtM3F-ZQa%lb8+qgauSIKPC0Ldkql(h2>bxPnx)DtO2M z;b7dZkeb@O`>_<@sdAvPl9=%jucXN?LEqvN-l}R^eGBP(l0wcP<0A|0Zh|D|>l`_S zY0k)+w-WeJh%C4_lS4eIRV>pz#ai#wWo@IZun+feIQvW~ydw0bYTin0KnmHOk5Fok z>*Fog#rcYVe64L8uX^^H0!+*)`fQt;+Dy@It;Kd>OERWJlh2?X7kxsc53PG^Uhz=a zPI1pP??bP`zyA&TuT{^r{=52eNB=W@!K2z*|BG2hMJib3$r2^O?~UHOPIrs1PP%VB z$=NO}&U<4)y`CY1l}U#bIV?U4A_t^Oni3}zMwq5U!Y6rzBpbSK8(ys!H&RW=g4&dL z2$^F>EU`BxgsSb@s>+=47R9Mc1b29E*zI#b@9I%vgQOSEAnUhy8?E3sLrLZVpb zc#aKwCBM&>TS-py(-1xKwv>k;IFcb;Kg#cCdK1`uCD>Q{%Ituth&U(YV|4HVlSf{4 zb83IX9twltQX&(c7=@d<;(|e$j0)9bb&zY=E~TQ&jcFyKy;26B#S=buCl-izL8QfO zZ}NxAYI~<${w3N7f>hH#W>{3z6FKup)Oe9SiVc2PN8OGf{Y1;4MJ-jjMB5CWZu_a; z)GR%G^02O!NL)!YI&m$Zx8XY z1Xyme8`^?uh9*&TBhCp#N1(DOn`vD^P2Ize<7_$;EzGxXVgVHDeaytPJ~8LkrHf;_ zs2N>BNpO8g8C&HrVVeSYx*w}<#^VTePlPRnfyU=?Wy2Gj%6lJ{pTEp?MWQGULWVsH z_cHe&J1uvf2n_syM$E*CZS2U`y2C0Kq#YQbGostOy zs{cT@64^rHYORkn?8^Zs=e~tEf#@BNj3SA1Z699klX!mqGIXbBa`~G8b&{-F;)}yG z_o?NDeW0jbH;)vk4J>n@#uomV?ms~b^o@X|H*{8NX|8@fPCL6QHU~eMU958$YEUeE zXvm%ay#bbLu1jvW;cf5B->ZdvW_=M6rt`vl>P60R<56n-$cFSN8x#xAN5Ixg-v=ok zm^%8wW35HXQ4lJd7bKlox*Xdff2J|V>%p*d<6(@RL~V8Tib98R;{F(j?#DY;=UU;k zVUI+0P1}!Hra7Mqj3Y06FkY;5VHS)kpXa`5d3IDX336rM8hww$I`R_cIw+nciv;KV zVm(j5B%&xpwo60##tByhBS^hHMDr;q2C*&_A8B=v9G7p9hThP`&MM#V2|tZ7So0TS zA#(-$)A=U%NE)5RG7g1bX7|}=I;ZjZ{A>*uB}E)FBN!prv5QR_TujWwjDtxqT5z{orPQXg(f&FIdz;M{s$DOE~n#38aZ;Fz;73^sZiXz&= zuTtJ!ZMmI|2uc#n=7II4ze+`l?U5>(HNV6c0yYo*7wj*I)g#bXP(&E5}}@c=@z!lj+cSY8w_i;@H!h zMV5BPb}x7&mrP?yer-kN3dx&3ypexytb=3Q$m(-+&1#Vk+1?K-4LN%~kd0*cT#rZJ z&bjZaaCWxS78Gj~d{TW(_*jeQDW8Ft2}NGIDL4Gh4v2yk&t6#{tWe;tk)pt!zF)4| zhEzV-w3?Ka&No-P@4o_D-1p$6RMEgZ!rgNpTd%HM+w+IYjy;Opo122oWjTAWs?TvJ zcuuVfs_B^;!jHhtk7yVV!7_&$BTPiV)gjTXurCONnpO~-?F?MhCg)RA53g>7u4rVJ z?eTz>{wgqfA?+ga@`)1uqg}8;?5C%PecWC>ya*Q<&`Jq1NYG`2i+jS@jfWg>kY;-d zd#sq`SS$*gf$qfr=RiR>{XrLFa?PSzc`*1I?)g$DtGAPS>$C`r5^mWvsamfe5cl?BAm~51~+yn zIdRr!!tWqlhIn^>&2d+6tK&9{&=aR$io>}exD3Fmu@02#alV*SldwBm{LyyeLDe2N zl0?$-LOVOh5?Oi=6v1bt#-}R_XM@fv3zMq4QVT~Sm0FK>o&1PH?Bd;Z=$9ddl8f%? z*tySv3d>iIe>kEQZB*?2+X)2EUN0dvPDpE_ybISfWY+V2wALrXW&MM?oE@6ENsQR(e6-qF`CA_q@=S1!`GTC)dc1&WWi-H*eGmz?*r2M=iK1v}>iw zUD!6gg$fe`C>si_QrLYPCOd61t}2k*Dvq)9cyEG+>$Vgb2o7LQKYsTr)ai_H27^kn zi6l{(F^ydmdl~mn?&oJd1&d%!cZ&;SUpo2ucINSF1iN5K+={hdo%ppEy zZmiciZH}bOue}Gg*WNd}ltRMTd({OJYlemE;Bbv`CuU>^J`iQY1U7;)Ls1#@_}{KR zHW;dZwQ;mhCE*fmr)fVpjG+z#OSa6;V~dN4*z5Co23YpH z_4GH!M*ZTMl!>YT->OWG!s_w5}{OjQ;SNwhzIkX0pSzN3RD@C`FY%b8&V z_1JmoubQ3D8zmTP?_+FO#wjFpWQWS49;v+BF?T~k?dU6=x@<8X*$e#f(yFJ=@LueO z4&Jm><#b0Y1q`8YS7s(c`(NG8%hDYc$gITh5sQy&xx7%lOGznW@3(dt2tt(OrYie! z+-Vm|r4S}PBw2c$3!)v-Lv1T0ZS<9>^EUQfn)Jr0YHq&w=zQYB?(^G)%N+act&KF~ zEm4`i^V#P1R+>h85trJn#ZMk8pB{CbZ-0sveNu_(;^3V2kauILT(LbY;ZSxx>im%1 zn}BD z!*gIP__mYe+2Z7kHk{N$03S83bmYz+7;Nh>I8r*9=A(kk9apW9orZ3}M>tD3r;G;W zExJ4x(*KhI8O_B6QHpXhz0ko8?mEu?iB6K8JH|9KLn^t0?p#XFs1%fBc~T z;JTGS3`;jaje?^ zT}8m7|CvttQB`n4^WSZl)ZBExRicMT>!{kXZ$PT44m69(qS8Q7Zy6y;GVL3`3IJ%e z;Fqqer4YEuA}|pRBn_x!&RiN7!C{(V0PX9m;%_xwP3GnoDzo%a3uzMa3;|2@B>-_HO0P|feZKl<(b zwY~%2zUL28*N$p@Z_NJK|Ly$07fHK6gVwbF6mI>OY|?*&fPC5LcQ9yL*Pe!d?YC+F zX)*g>+5IUt=bs74myNu?11bpzIN5$+{!hy#{>uDMu{n?Z69M_d;2#9!W(e>D<9}MK z@K?rv?%MxEK)!5b|2voTB!vD0^M6_@@K@%4>e~OAfc#JB~*8e2^ z^q1Cu=F0yWfGlJ5y|kBEKrZ~i_D@%EKlQTx4*;^v@AX{g!ylA)P1T>S=YHyC`x5}U z?+*ZS7G&)Q*Z$MB+)rKm{{SG%2>f2rL_nB7F#pr_ochl^_J0N-i}!{1e`fz%Cm&?{ z2eyB{lKZOy|F8MSGRMAOdDAmU{|~JHzp3T^@w)w)e=PGyEvEu`^8@QYU(5Z>eg9|v zvCJR*9-oICI_gx^W zKQR6CRoq{h{ulh?pg;J>6+b{uYl6P-Pqr)n9{*VTAD0C3kH5Q#cHex+?>_anjqlFt zw~g;!>bH&W?&-IUZ>9hH!QUNH5CQzX=>z|xsru~+ec$+&`S*?QPVu*0f8?yG`bW;1 zs(<9HsrpCGnyP=~tf~5soWGa1Z}}YkN6sL~`1hQ@-xs@o<{uybQ{nvY@Q=TDRY0fv zuldK{?=5)L5BSHL->J#}pRe%$Tu)y8KkGfJX=wg0W?_{iGEZcEc3*B#+Y1->DKCJ_ zi+Dz=?3E$Bxn!T7`R<;s>$Rp{=c>dr@!a~IGuw)S&HbbF}wrm zX&-l$2HoWrajY(nLO#RlZKDXScIYxJpAbhss~Li<PA-+w z!CY}%BE)SI0X$*Yn+%|cl!3K6axh_OD8S{3sUiJTm%gaVlRlNX$!`KT&@~;x-Ph0`R-H#4Qh#8Ohly!^|Ue5Agr6fsdupXqHyRU~wPt&Uj zTTlb+0vM41yguS2Af6hQs=$AY4^ajQ5`XlXzBDlUb(eWdl8ME277f_Ek=zqY7kB># zjUuc7Gi^XYK6(V8GhG4QdK-}HOF@&#G!WQJR>0(-!M{M)S^T#VP}=liZNFwZ3G9j& zs}g}2r=9-OKK1}}7xF|UGp++Y8w2Wnk%0BUUVwGG3HVg<00odyUrEK<0D(?qm6!(r zUECDvS3wGjo-6&pBMSIrQB4Lm2^;&(13CyS8hQH8VfJ~OO#uYDi9zoHdV%S~(p{Ix z3=$Am#oXkCL~V8M*WX?-1j0E3$7E^ZZzH=>D7 zD};Bd1P)1h$^k%vzIppAyUQ1Y^0R&$J^URPdu&GoYtgJ7_?|m6y2EtdmL^G(7_dDa z-(DXLe33f?Jm&D~t84NR%}@9k;(l^UMDo<}b&yAdG%c3JRu&j5V;4RI8h@g?uuJzP zWlr}z$#2{r0}Qi#8e*4`COrU<&hSdzRyz)Fy~LyEdXgVsV!XdoIR0}yHam3A-ea8- zXN11qGfVwsQ3-5m)SUs3i37axN!!>E0-4HUrtniKTgXvhQyASzpcC9cCUZ`p=e}y` zF0xBCVLy$=Jqi|(96JMrEbI#tA2+E1=p~BtS6oTLopuWBtiwJeVa62I6z*m7ngs3n$43Z3ppn`rc+?g|&fo@{nH>Ny$Ww`oetBpU7bsalXrnFmp6R^5Z(4;y zCjxPyAC#-AXMimNfPO3I5jf;*$)KG-98WH|@zUTyEO%rU5}r2&cy7KdC%zraraxb8 z2biGf>Qoey9qA2hSFs4>GJw^Y5J$3YW9g$9z^H7tD`4bFU^3C8j=6nH+1AiyG{b=j zSQN?4274tA34#M+RQhl!_$~nFV~E7D>NF20=9|DpqT+QqfR$wl0CWl>9$1V3&{d4U z7GSFq6uHu;k|ps@tWFJt2dFX$bT$W;WLZ?xKQ#f99zdyid{YNNt*&Bz+N=x(M&n}0 z%}n-^yAmuKip2oeDGU;*M8G4Eb&qHPi~>L`K(=&6Q2;y%O~>94Vt6*wHrO7ZnD@?W z06^Pzb%*{e;2SO9j$&04Spb592S@No)V@om7KC;h15c;r`rGSx_Ts4o!Wh%mwE~r8 zOhTOxOZJE(pr)NXhYnGIbtZiaIJ39HtriVTkeA3zwp^4q3phgqfFf5*8-NMw?f}7b zrqs3c93k#<7NMY48lbw-3bUr2KxTl?!OkW;fH0|0XiOrazDR+$lf1dtl~YCPLl}3u z@nvluKAx(F#iSjWHJ*uL`k&6X8#7o_)l!>|W4hwOg15J1^a@1KB<$$J^h>X`dr|n! z2b6#Zbl)~|2M0vh^oj~g1NiKXVkK9RCur!=f!9&=uM-@1MdN^C$1HzkA`0-zkriP63ocLNdUhezD^ud8nW!IOQz%p;`TK zkxO-B1hfqcHTlg93hT9jH| z#@tq9CCF9o(x>JKpF&RobOeWhbz}19%Obl~bDdUiH=&rjPxQS@W{$n=hMv zF3CIwuslPEfZDfNGKsMah*W%*6J(!%1jPZ+kVD*r%cgklTvu_8!NSF=TuX8tXkL8X zKxX<$G&KgO>OZM!9xgP}S)(BQqX;fda0vUKx-tLnUEcqUae3_cx0Q?k?u?1zZ4u2q zFs&?K(CgJb)^|VPb<^ z&xVPIrNYyV8+v61Z|@CjsZrl=Z~-=FD!2x<&g4u@tV!bIRUZRLOnjnY*12lba^koG zpOKViuT({tcV_E{L5BmNU&+cEMbmf^`HUQ17IFJR>~DiokiYE_AGDq4QFv*M6wki> zd8YRm4$+7BE#+}HuAc)7gGq*Wg6~tMojKaBPu%e#7KcqddO)x%^Y2y%GaRtbtv}XVjdB23NqZnhr6|-T(W~yuB_8@r z06#WNN738j?7^9Q`leW|bS-e(#*JYa!Hn4|*%!x=Y&ybv`7U=94Ddzw+a~XsQ9^G; zuIe)YI(fB79|jbj%4L($YXTihQdK4#*z8W$!L(BV;wrVO%nY#ypx=sY0#Hm8;4dJ- z#v}h#8N1q68$ctmfGXC2ZG`tTM{q?DQ= z)d%z^X+S(cH;3B}$HB&!=*93mc!!~>>YaWE$9ACNi~zBWe|fMYTuFg-5^S=7wp#ry z(RB-&!&p!XLWHfERoux-SN%zqjW2P1u)UDD_4dImYgvt@aJY~cou=!?h&COn>>?9 zU;OO5c`IXt=BdI206fjXF@rsMxU}G-jW^L?RJNL0fa`1qfKk^nZjWqq&Ta*gE#X|H zBa=bQa3gG+$-b2y=2Ch0R)~{qPOvl}tfK%AW;aAurpmG^dDzKa!vaxH00;on5TRsf zS-c_|q+$tr;?QAeRTB|K!MB*nJ!d1>r5KQ$88_qJRHIh#9zZgCw+{QL0-8j`&z*LP zBF=FE^yEQH!>p1=RUeFG9lwH$*#Q<cReYO8a|{YU9Ppshnqt{6npH}vt-2y$tR0YL zaYpV{50&|L^n-}xk7u6R%EK#e^*CwXU~)#!_~jLbu%=`r<7unms1Q?0_UdD>NZ`=-kP*DA{$ z^;-G7LkS-na$EzJ3=4*YDOA38|eq6NpsPNs7a4=I$h1@6gP)+vqOkQSg!U z=bh)XCCur^M|kQHv3_d&TxtBnk~6i6mY6n@p z6Y@037K@F%X)wROYH>624mM*J*nBt&`Y86+D~MnuTncF=ZSWN@53YVc{A<~-R3e&4 zXR3^~{U6%iJszs{?;rkt3prIN=|ILY6k{tDDvd*o$srj;tnAb#TS^W^tc`I<#ULrA z(8wvKM2g1RNTjkEF{Ls&l`)uT#xP^8>sjCD^?Lre|G5A7{qFnu%V`WV>sr_K`Mgh` zFou$5UWm?gm80`|7~;NkA`_ogme)KyAsq7aC){3&av(0pagN3g4k#`D+H1&9bg=am zW5JbpAG>&7doBt&#T#-Y`v7DRU}UUaA*L4vNI#?vL_FLl6N{(KN|dHGz=+xBTBNt4 zA#jOtsdm&BD|n{XkA{QH&|=PmCS7L;DVr&NR#zR*v&9>*n%dGNtR-)T$%FZ#z}V1* z*j*ceupoTfOuYM7tm@I_O;M+BXwO8k>I;gKaiPsZ)pCl>tqWOi<`21LpZ*)cpRBA_ zgYg{jyfSR*U2>vu$hlP->ObTPTQkLMsNkikk4U&q>cWyajsq6#IiW~=IYEv+MMn@x zZ({Y7{aQYAfi0jS+0UO;Kz(a_B+U-K(qiQ1eq>=PxPo!1Pf7cuAJ?mMhQo`N%*^KI z5QqlrSH69WuIbShDtyL;PCOL5#bKN=;Qo& z!E5ojiJkooEnO`pkcJS^vu6TXyLP0lT2k>xp=Fo}u)^fHHzHJk?#3rO3=epA)mPDa zoe(zoT1G{GZ|TXo3+_daP#+uz z`3gk*nxpT@Y<@k0ZUdjcmx)C=XB41^0F~il2*Q-$=n`tkg`+Wq2Xi5wIgkKQ^y`%|Rnyqin9LRQfjYI_Qmy;qKRN56RmmucF+iW=0vHN=IeVs*ex(GkG z^ed)R{xcwgk~H#^3mcH=n^Id}T>R)!2>~$o;n-hYu1zAK+nT$YCq#gV_4XnP->5%+ zO)*@6@Ev3kKThNw#o_^X~pH z3HWO*(m)gQQHy#5ndPwp3!9zvn?5(Klw{J4yHX+aw98evUjc?0+=+9=Trrrx`SQ}% zwwC-jR~&5Wi0Ls%MbY9r_~*+}_W`>xfWw*VD)k!bwM~d8?MVn&zRARzTtKWS0%K(% zpm7QzA3!9Z(WCR5CQOMC4gbyB;0h#JPtro<3c2|H&yRob_kF+^1|UM@!sJY~u!DdG zm&rX}-ym2f;E(6PO~Y1$bkm!n)$LgO+Pt-(=xNnl(K7 z&;`}VzxEgAXsPzqANTxr(IV$vHm;4%nEUROF`0FJJSx!KPt3umsX`*U|LXm%a!mWs zr&i~#mRj#!E%)z==T@3)S2W{z7}N{r(gIX}o%k3~pgU%>?oh_}0L}L_y$7moyD~-| zb)BQ+AM)7&YM5dUcfP3&A1V9?b!HU{1z9ntkcL@3z~^AG*<(DwnR+spED2(TVe9=QB^vr@jK zRq@#EJG~*>&3?Jcs7N8nKtj=vqNJSaZCrf|YRPG_yvmP^W?6Z2lD(pQ`p4&W*79Fz zPHQ?=nBdlkL#l!{m{182+<(9K-KqJ>Hl2ySY5h|5nMsb_CVzRq!$|});#O_R*KIb)xB?y>-&RbPb8`A+qAIj;Ljc_Bf{9NpzBQX zoHUUgQ);?SD3$2abDdLkqL-q|wC-YaIuSW(BJ zXnIC!PA`FG@AQYmd1bltOR6Eosd7F=Z-GEy;pOjTV=WW-d85t=wtP#}VbzaMa{6Qv z@RKqfg>eJr_3s&@giEP9orFtkj0jyL^wp;?SL{-ClEKC1YI=(q+dczzFsCXbf2eyE zsp#F_YYrruUQpSjIpP=;$HZ+3sw&yKsX2Yx@?&?;ueV6g=)2hj=0IYD^>~|kYCYZS zc#gej*M2zI6-T*73KjACwslgK_3D_1yz1&T2Y;TmT4QC8CkLeK;1lTT(q#eyfkgZA zjUv~|+W<0|-sdXUs>%+P&qynQps$w)k!26(yGOp1XC6%6kR+estfHfO*w-;?G=!7=BQ(@t znE+tUr6E5*<=@tqZZ@=9+4^uq<+l)fd;933M}w7#EFhS>=-8(vWA{1OUuP8|;g!;h zjXzRSzD8^LEO`(Cx?{#vM&*@b>#ldUW}D?FvtBtdS@^vMq!*{3n~$sysYoWoX(rQL zG+4r1muG#0?jo?1SDbn7Ce8lOJi7ij$3AW4Vroq+2d_Q_A{z@|fzc(J8~tFW=4_AL zk)L+fj%$Lt?AXaM2u0X{AEZ}}$1jzvaU4Amt~!4pprFn2#)OB1KFjtiak&Jz%a;IO zLVAgdN=Cb0mELH(a~lV%B*s$NqAUnl$XyS0(@|CJOkjqV;}c#n9W-qKd31xp%!rjW@~lNNgtg>W8AT*z<2T4dgloju!Oy_os6JHn?3pewgZw zZ`PqXF_6sWQy(@LB~^1#xQ8v4EDY8ug%mS>B>#0EFHV5)BdOrw_?P}|!RngVB3GsC zEE-uUf2^Nu5sV-J_!r$Y%&61sluyctnNFga9P7K>M>^h1Ieu!}dCktP>?p;9o)Xp`LoloGR`5loJJ~t)~`uxB_RNIyq-v+W@$Izmw z+V@RvO?MJ-q&8j%&Q#n%{U*%=&Z;TlE2^rzA$BTYfHvO=#@MtbP{IND5GlgNjl177 z=h*A3VJzt=qX=z^h8IN#-@dxcDsd$|rvymHqMhH1L=tpftLN}tHO+L*`t=jaJ2K~2 zrJTBT;f06y`X3*OUb*B5=?(DJV_P-`2D=vO?$f*CWqhb@0Wr5M3jKghoYeXxUQj$QN6y&K^2~`F|!pz1jlNK&nU5#D12yDZR=O3 zQ8>es-Ck$98x*`SV=Kxy5?((F+sT|!Kuhe~es%5I+Tb3k2`0aDBe@MeF`fOaLQxn9sl29iTOyLrXH*l%h`@i68p=AV>R|(q(EX0&{X;(v1;b-9IX`EdXSQ#OesqhJa2MhuyRip5(-UM_EvAJ_-+#^r!B7nyF z0~@g_oS*yfXh%6#2|vRtF$s67vG#t*b@fiL^-gW$W~_iyRJ|D1{sjV2_+IzmOv@)z z*8XE_Vd(gyPPN#jPq_-&pC!=IT9vT#DsOZC(i;FC9|tj8e2-HJi%i#YaDtaU?(FEU z5tma$!kG+~in-O^{fe5ycCEu1p=*w>(;Uk`bp|If)h>+|AF z;)!=wCT~7jQR$gZA6St}&JUX&7ET1?qd*>AaUZ4IPFiYbJa)Ak;>|>S(3z^dcmh0l zYQ~D!9v()W-QQ|H+PB`y+dnTk%XTTzpj_a+5tBmwC^h={?ad}Nyv}2L2q}xs z#w*(oeot9*8Ml2SHaBdb8Th7jEUe)o2Wk31=U>`NyVe!F@|^fbP@T12$KO9`m!H2= zjfy8~=@ASNSAM3SR5Zt9KG#=tyVqb-9GoUU3It;QRMR}Gj6&fBX^oj>`0f!z1t|X~ z)CV7d=36DnX;{d33#KskDB@u4Swas0KeJx{S|a9^9>D!(@3K~~XdY6VziH>}Hx-)G zpMIO@qp8YUd3&v&IOcW)>cxTn-s{AX<#p(#<3XJHP5*ur7M~hBe_wAHbe$g(CUNV6 zxagNS)Xq<$g`p0%>9N=0zE5E3M#dM6{LiYCECw@ zblbk5RAvAqm`d&ph*%yeh9m(A7iQS-U;}4dRVR+m1*6}(CYY0Is8Cg#4;+lO;i;lS z1#u0-wy3Oh5kvX`T5JD3%N8!@`=helOoj;WzXd^&rY0)!RPeYErZVjQ3=I|W`ON;N zkG?Nq@QDHegD38wRuJ6ZGXTdev^b`J1vz9L@XKn&0mK!MW6b-7NP;hQ0RAjtwdQoH zz^(nAoOBqj{n;i49wP1-@Ua~HYW)nsu}OLu*Gsja}G`{Pn^6 zY1#l=4Kv$0Tse6QduE2|!oz1J2n@8PODB=#D=!_wa!v#d*z#-l*BCa1Vi$4tPP-=Rqqz=a#Y zDop&qBZLHDE%n_PD<`7_UQ3zy8^+Wv){U4{NwI66CySXow;k)3h2`Y{(sm_S6KkYir{ zmiWG7jcd=u8ZT|7`|@MnC@uOz(VN%7u0AxF~=GS@}$!T!fw!v^YVEpq%OKvH2~EdtAblszRo=fENK;f(_dgmvxnUbZBaQYJfjG*)t?WIPsDI*}$~CWc|a! z7$)#_(@GtX;^R}*5NCo*F4d128%i_V&*Wn*izJ`7?Jq?8Z&>vN_0TJdi&j8fY|{b- z_=uQ`saTA1o1fQBl-nuBE0K@TtcsTkj3B8C={$CW0r-(RG}%`UW8> zsq3*D-eh$@`g!!8qGq{qS0`R9c&mJa51TdV%+o1DQm(|+j~tJ)IsY#4&e*!;T|1rh zrnS@N?hDcO%oRqFbf=>M*G)`5)fCB3T~ZzdoW($U{b~qw1*fe4e&VaG^ZIoP$rlMg zf^^qzg#6}^o^LuUvmS_YxM5gg$K&B!`epuYFg8TR6O0@zG!=sX>^dFW zRi^uGqTQDM`uHvl91KxZD=vI^#kL@uk6HrhKEs#OPvH021vyhRhcMm4gPVkm`G3|^ z)RcNDU}?yj9FMh8{rS)!>+2w6e|^5pdhdMMKm;(FAgM}P6BCUOfQ$Xe`jy_fa{#L^ z;7scbG$U0@j@;&_{KeK#6XvXB*?=mTN#u0jev%(E#N~qFxDl6qkXBSmXC{C-#fPJQFwkmQ3`W%}h|uD&%vUO1GK& zl1(URf+qtRZp7#jUhA6tM1v;Qr0r61&6)k(BiNsh zYAfsCL;^TuA1R881P!Q^%06x|AmZT=XaeMdi;&1QtIED6{EGBq;nikJfVBwF4S2gU z>{*djpsBtIpZ&SGztTp;{k2P_#*oR+aYLqZ$wZOOPDsL`^v|5{-%VaTQO&0>17Upu zga959auE$h^fvqW>);4;RWry2oOh(e3u|*b`b;3X zY`|VGeTY2j^H-(+J#MjviH5@*;HTg_IOf(;|Is1cefO6V5%97sU*f`oriafmQ@OWI zhyk$5`y-^=JwNV==Txy@Puc;dMBvCqMefXJ_DsAK zC`)WX^)wPno}egTJDX{YN%$ycemH5(;RF~2A~n3r)0+{=RKegw&FdXhd@wT0)0vRV zv{B5O36nI6K?Volk~W5d{(6JH6=ONAt5ps@AK$$=d|c}vi$=O@#KHrgez`gwA_SV3 zJ-4Ylj9gOw%P0A6UP16$*_AldoPX-YN&3+-tLd>@k;UZ%3Ah_c0R38O`*Lm&`H2mX zv%yCaQF$ysU9?k(G@i*p4&9s2hHhK3rMm~vh@ z=09QR>YC~5IqcS}Hb_eNIc@FS93}#S#I#2yqnzI7*@+pa*Lay%67B;gFJYxiVPG>p zN6R79fCUm`+vxMxc;HJfhtZ4*um%tpxXz2?hOF&}P>IV6#S=|K6d-B->0(?P6U=nwI!A!lxn*f;0QfbEq(!$)Lk+i!{4fgB zu!GVJwzk|CBUPcM68?|VE`t^31ip}Xndm37=4HHM<8XMU$Q{w7T7-+Wwf zM_~8?llEDW%zZ(yoy1qND30HmX`5_{yc}UaGH`PbDpqv?X z<>eb)z9fN1Xi)D5L-^2MuXWk*&|tE?OD=*hn_UT>7(QaeU?i#<_2Fog<*oh1Op5SUq$#g#7(jy@M?Qt>8o@<#_IBF)i==T7TLBH)HrojC8eaJb z-#tRa%W<7ZBX?@62KTvp4O|w;8DO(H^j-vFDlnk{1N#6tx2w1-Rj3E|eVL~d93J#W zbD6zC>%wipxkBYhi-R*x(#J_Te>Ex1N4$4og>vOIz*HfvH^Eavd#^^8og|FzsJY4I zt6~ewCNb-{VKsJ)T>O-i2qYqh^iqMLz<>$RdrB&~61a&9{J5q+D-B0BeUj_7L52?} z63O0JO@Ih2huSfCQS!Sa?gJ}ia;NAJ^eExAU|GLSKJ+Yi^#)t8$TLxhVGj>iTURlE zmaxH1p$gvcq?#FD1j_=A1%ydXOkT~v!d%6}6=sergEY4|fBV8>eh)J+!kp4k;8BPZ zNe#IxmQ6hwO{yAbj(OKwF=f#;#8f<*o0tc9m#o!gzKqeSk?K4NE|Lv7YrvN*8CCp8 zJk|o(WY2osu%BTA;q2+<=C*_gCMEJN82`nlYGZzV{`OLXihl9jLk(JuN_wcLTXWdt zh61N*7~K>y5NWb1EpqQ^eBgPiUfp-Ep}?lhBdPp0h=LkaX;3gR*G^Y=^N^sbsfNuc z4?9&B$Y*}ZtOj4Xxte2ZziW>1IXmmGyrSjFG^O@*28YX_DAk0|M2~QtQlW?P(=Acg z^v-LopKM*bIPT$ai_qKTb(L%cKmAvQuD8bxSQWvd7myyXY3wFs&mbtvIrs@n%f` ziRcUb9g)Om`M%DqLQaR6xmEoq_hjqG0s)7=oBte5IA^cSVcSnm99KO?-sa)dv|(fzMxXAT3V-#_e)ky*awg z{%wSdJDlCMMO~%5ISD8~C-o!-?UX4s;?*p<7v3z0z--Y#bk}UR9%GARZe)d%L%8ag ze6x{qZASUA$8O9yDHK>(6LRr079VtR~av!k-v({vAM}{=ckGDMez6y ztgsw<$mRqemE<_no@p=*ojP^9wuxC0Z~t;-AVjx)lM2~6Mo9UprOMD+QY|uHJLym6 zZUsx`ijMO(@|!`N=_15QNT^4qXV3SD98S6|W?bJ{*C{+?nhI*BN=*HkQ?56XQV*#U z*j94L_O-A6Fse2j-~F^aE2U$HS+gMY?1(JdrX#@fpcF?hI=onSEiGf@9w}B&Q)r}I z`qvw`$fs4$z*wWmm*x8dPEsfm zYTIHs9N0bBvg5OWrK?e=6qIkBmn88n-*89DraUVc2|SQN*m|G+$zrF13Lc(|i}vE( zDm|QI#X?qnO;pRZ11Q|#XJgn(r+XNSkJ#Vtdg)Tzby4TKF_H0%Uz|8Zjw2_0h86&= z?|77>p}i`(?<5!yYCkLZdB2R5k8%gNn=L$jN=2Bnt&nUN8>o3OJl={+ynzyyQPuBiK-6YHfzZ~ zN7c@EWDc2&-`J?5qGs<|6R`_(Dd2a}(A<=O($lN0Fzf83EfPS;vjTtCK5<#yZ>GSP zd~^V35R*gi2Lvl<95V<=2#*gT^7(MqAYiY_Eaq5;j#Y&vZf}o3irZ@Hk?7QRRw6Qa z$y7Ox!{lV^;@DLmGi4aZ6NI_2b-Z;pf< z6?e6*pYZZH<+ia5%rq^>VPILqaJ6C;%$d#Dy6H==$GFz9DmEP zOkiD3Up;j6#|INA<0|0J#QCK1(SVvAH^a0oynGl)zs|1#TyxLY-xdw{A4$Sobn`0c z+N}vKA1aV^%Gw$tUlT?psXZONOy~!US1x|wSF-V^*j2zsA}drldF>~z|3Kw%bv;YE zd?u)Sy-?v|S~WnVeNROaPsku@Z_Iv(xAyuUzpukvOVrvG2>p{4)Ko~cZ{M{z#eCy` zI6=SDB?2jy2a6b++ug=BFYd{)A7PF!o@20pe`fFemdy3>+TIYqVswqKKkfu zMNoN3U`rIblQh+uZq(f8k$8=LrjonZ{K)*H7il~ z0Bei2N*NYi@<4@0TvAFPaymS#1=F`BdQ@Oe&j7+h|Bi;`8erEH>qgF8%zJ zvyS&OP6C7KXz)3R<`TwYo@>J zX+aWLhJvO=^W5JHgDaAin6Xjot|fhAJG^mqwperIwJ|JVh3*04J4R#%%w1{fvHn!q z#>>g=90;4H*RO-INkWQmM?&<)UmNbW`kwFJ${E7NLrN=ilka{B$XT!c*u)iuekN_ahvty>*1tTRB%at0Q9ME2!X+~m>XBj!ngFC9zAfvZv6Ls*A(+s$J6&&eoMt$ zQ_XIL5gC=U^`dO=qnZ3^vooc*?q|b@j}TW7RWgGJg-;JOc9jAjX6FEmrJP-ex#4th z-%e|inQf5FSx5Bs^EVqS;Jh?;ASp8Ii;A>)Y6M-4La|Z_981FQD z^FljEGbPJWllDvLUN>Rj#zbTUQ0T2?><#y@J_&Uv#WZ^%KwRcc`qMI2W_LX}AF5wt zw8(tiC;vDo+=J4|#KZ>wa`wpT&(X^1FyCmlD(&go!@b6u8_gVB75r{*n)sykr{SG) zX6WV137$B$xd-%5GzDJB)l9>^Em!|BvnOm?MR1p)>>V#2blm!SZx*B3C7%W&ged?B zJl|-i5I$Hb)Av}abBbH7aGg;<5J`@RO`d!n570V1x^GpA&wx?T$vFO0LHTElnK=>p zHx~yJTKH&{53sTD=X`iTEf-4XaQqWr@Bgh<-{QX*Y5({8{QudsnVrAw#l`;rr`mxX zqmO3HOjL7DT6a2M`Ef>%5xbOs?B=7%ZpN7&cAas~;abS>+T@FO>+dnh>q-7x9CJBWluJ~rSaPX&Yce4Hcqc5oH{5O{PH#v~rkCQId z+;$zhQg^K_zRNB)D}C2sX zq81)dpXusuI=%Y!@k95QR<`DLnd9=DvsQcctvYwekFg`zmrpk0YB?s1=j(RK`E{g5 zaNkDR(ZQ6I!@2b7q1#URp?$`GO?2Q(?JwRQa9$f32v3}?Yw~ercK!ME#Ug%Isq2sx zsXG>%_#oXO!&UoY z@L8yBdTGjvPV2K)D{(QFDIBPFcDdGf3mO~^^W${%t0OR#v&eT+NY=|Ue1X^T+{$oC zBMyT{o@IJ^EL2+G|On`75jKYo5-UR#}6$sHwIzwe~fYCnKfcOm%v0-lU9b8<~ z^3*yZ*gt|ASOWkiY4p>OLZrYMiHL{lpl6%u=2qK`-@V93&w#{ArJ=Hc<>XuA&PEq% zci&1J_`ra0;!?XS71y0QCqJG&z8P0slR61sTDRQyxHFJw3k5p7H<_!wvfcW0J*4yR zM}`?&WxpJ9?3W`wkbfs`0#&hBUA;kmYo^m`IbD&Gsz%JY4Qq?I=v+w+Y}%1i@AUp@ z>l>H2K4p5pX3ENwioHBtCuYn2qKotR&%iu5-=BT_KUHSLQ|TSQoiT=e<7$ zFpTDKXrA%M?~`qMPvw^iu0-nPT$Y;2sJ2!iQXu9>zBqBVMJU1wh7o*eakyMChJTO@ zL>eN)Ogx9{N{DBx-95nMawR7*mkqcWU&dp)1tMJS_Xqu)W`60aS1LtE4<6T5%JRS^ z3U4oHUP;%)pAJJWb%@vYt!(#oP3_VZZsjbbez4e>B4hk7MwF18a&BQeZZd4mZ@8Sa z3Q82YgX=a-q9a}Qv!A$?b%*Zi7xVZbpO1VB53~rXul`J-TkuogCxyy0N zW778;x^jWvdL5(ZS0$bA9xd|$&$GuKJB9jm1#f-pBb}UX5Y2MBXzC@MmN#%z28;<~ z9z*;&?yvg#=AtqfPo9UEpaH!M!)Gui_~SGM0EtutfDi5<1^yeZqIeh4AM(w{d`{hUi;R_XrA z`w%iKJ1c@&8H6|pLw>z z{D>I|z&V1iCSd%ME`YIo0}-QuI|3j~1gK!jQV=bE-2_qC1NCA60wm=4+LQqAmik*l z3G)ryxXTAb^JeemM`$0RQ$I0hsuP7cqC*(8S{aS-C0HRjaeS@v00id8I46O_?!UV= z=`)FV)#rtzU832gb7L1`46_-V^DLL|JVA1vozB{5-hCb5qIJ20jHnY?Pt*@tfM_LA z!ZzGvFlwV~eGA}jFNm`Ke=CeZ=9wXk;*ETUJf|D=G@k%?#E>n}9XkE* z;+an$aTh*1IbEm=qXy1IevR`P(^lM*pLawX4I?$}P82?B-q-b~K26w^083_Do>dQ4 z?mC#9dt?6mXOvv*x^N#UW2nC*R#htQuY#JtRMrD9)pB1Om0L|!i=UetJHCOJ-tDUl71 zpPH`=T64@Xe=_->f}q_S9k%g~I2$v*s%RWDsHN9?MQW<@u60vX|SW; zepFeGCp@Tku9Lk>W;@dtHjeJlSa^;NJUqb{FiTXo(oD{4H^qX7W&o=xmEZf>FoOnO zW^(!S8YfVd_@QkU)i0RDoOa(AIjwfCdm7>6mS6~N>l(_`);*jna;+@gO*lPNxEz5_ zo8SNN+?T)~`c`saori$48kML@62n6C`W1n4Rg&7Lfp>j6+m<&==vQ^4-ySq`{92`+ zszBo}Pe&=#{$Vd~joQwA!*$DR-hRu7-JeIG)jjXB{`-`JA%V$`9_fkLQdCM!819Cfg za;s&WsBuvn;j!pE&FcL{Z#0>njNdw5mB79=EvLDIe1GH`o5 zy6TDirIjk-iki&CE%5hqvu!3%hK`z43=~}1bgd<<`|>OIjdJ6cpNDRdt3IP4;Omq{ zlOH50C7)M~%gc1~U(5ZN_$+g@m^OA^fyi|*6G^T%m&+XdITX3NQQ6l2b5(SMYw2%1 zgGJix?|Ip5*M*u<(*_`?EqFB8>kLl>$@GmB)2w?vUHgce<-+x&R2Kex|N37)_2ssp zx%DOKiO4=04H?_#%IVswyvBFh9E_b- zd#IXDPV`oFJL;%omn(00f9o~cg7)0TATYY=uP1Hjs@qeSJG{xW$;w23m3AZspuZQ; z20Z00OZ_mqJ+>OyldhA5asE=m|*|hiBv*&L$Z?K-QVB(^!spVv3=6P>A}+-FHatDS|Ot`+Lc0&kV*9T@w9bd z#X=Lm8l#g*E0k0UAPcn+;`mxw9Mx_p1MtK-&p>nsfvWU%S-;^`$Tl02>h@5d79MIy zKc1O&3&N7)zsk}w6KraT5^P!DQMqdUw+c9*O=)RW=-iUbmpo&C)M>nftl3=^N2E`SoH7|vy{&m&-%jvrK9Unx5mAr&HJ*mHkO-c+VyTVAZ$UK%)8vT%*%i z^W7`JMyZNINx&cSBlu$NgK8sK8|`VWl0v{nD;`|+Y6HC~+fU<_C)Ft9B$zg6lPqRK z?)xS+g368Mx!SEP|Ccg*N?XL!50%^~? zn^pPN&5NjyL{f&;YXAVF37v=kW|Mp-tYHCH3Od=C?SD7NbGOBRiLmT#(DMqu>2R?&&|+P8ZOn0yN*Ms) zXEGcmEm6eZyYW!f*8z6|WHgqlm4s>-0&+64Ru|m99dmwD>E&^!_i`SaoDP3uT%gRU zJg%nV0^?{|nBJva@^5&XmbDDR!r51v+IQbN=VYau$@xE@I)Ui#Wg<(bb>H48dVKor zt!Bx)iDU9sN*!yW?3AAL%RH|wN<|azF5DAm-(KBicH={aN_tLxxVo3Tnf4fjvd@ZY zSu%hC%MiwkAHOnNZcl4H0MNb*`^4g($(XKr!PBeNxR~y9NeE7y6|f((e&4ZM2^Cbt zAn+vdtXp@9-_7GC|5&7NS1hG`@*;H_T&2w6XlWP!XEJp}ixxukwal7AwDS{>axt}7 ziM*MgynD8|Z>RzMAZ^#SaS>{uWk)&}?rT-|Ty2Y8J4j$%Cfq~NqKW`!Sb3WsGY(_~ zbXVc@l<)WRd_P>O`?KIpR;zZ(T%9v)=&1D%(3}X>)>aIWtGaCHashO z5$q!;b+TdP`g*Re2_X`z6T-G25Uc2c!~Q zF4>{u>*p8PFiC~yrxYY*v$)#bH^`QTp!zKm`5i={@54uz@2acC(1WV{AefgB=L?n9 zjMQ-WBWsjO04B@@-Zv6#-c_EI+av?}W!pDcqc z|9yUxEgDIsJ-hh~)h!x*=9KY`R;Z`kde^Z}^XM+Oq_rY;6=#w2ET{8iRsmKpx+^1i zWdhVJ3asv>_>gwqAA-JeGr3I_8DR2?VkL{0;%lR%!IzxAJ#Yh`Kc(BoMM020K7KBF z=+PA>E)I1d6_M=xn4;lF`UUlsur?6CIwsSDfN4)L8=)cMv91cP1PsLcKzMMBoYJtE zyP#nDgp2Rv*)?I(F(q~d6KjAZ7?Sm(=)H1zGv1m3u~f)$yOR)stFM~4B30GEW@tG> z3wO}tvM1^CeRmr?;Yq@g(aD*&KAqinCvL#2qjWbq`O!%C zlw{mNg-4;GZSyd9W^t@R8fB8BudF&Wn9&(>4R+^av7ccs=vbjAZjBCgy?(#qu2Db) zv*>v@k#jS-9?Uc!UsszitCCBBpeaQL%>#YN&K%+mF~mu(0AEYNP02{gustiT9D0*~B47Li>A29cpok^x&# z#mKE7hfBx?j|&#?YbxBply+Q>kg`d3Wf(4gSV49s+0-H=(~Xfk44C!F zT!1Be6nY_zBl@mWs(T00RXS!V8Ydfhxh6W_+HhL8F-;Z z#o~ONswx=h4b@Mk;AAM0OzWxmaG;}x>9rZx`!SjDfSod7A&onHe3d~y1Hp}%iw;M= z74ksB%9CCLFckj_2}JxtvHMk|uO&ETa(^RR$|VW3&)Sf_bgZ+0D<3ab44@TY8c6EHU98w^SQ zW9r5^a#vds{2lJ68{7D;pEe@O`ReJN&9d&>ocd}A?+mTUxbPB*uT#~nFDf~awmxl@ zZ-Z$&%N(cDd%kh;YdrWkHG6?U9%36B@Eq{@jRNdv<-^9Cn!n$1XxB}n(q`=)&h6Xe z2+%NqxL%Zo7}C7EHXO3hzkcFNY%~J;R!8+-PuNWt?y}gJja%wp-$M#pci()Oin|hk zv~xL}IFiUgam{6WXha<@3`L}YU6u<4V?b075~_<^h5`|gh%gXII1&DqiQ{GA<-C}W z6z~z(PZtid{h;WjW3hZRjIRwZupvJ&2Dml6_)yza)Dj=$$>pT6mkp%&wMYKphQ{Fz zd}xUOVcSgEqC37Icz{2{99oNCR7fH%LjjC@5NLoQX$Y}wSsO?a(DQ*q7?O;!=D>(rp}k^&?|Eu_O_EP3#Dbn4yBt41|ibE3y*N;G^QxFY96aMQ|wKYKRG5 zXm9~yFXE$AG!cK{(k@s$&{6~da(PPsN;j?%v*!Ld83s53JGG+4KmwiGE|3a8K&Vem z=?LK6HEa@nbUpbsTsleM0&Ot28BkDv80Es#CIDw#VOS#E!C8oi{OZP3T3OBtz_s?yjy0si5-}c64Uga3|nG_GjZDNCK6RY z*Q?nfgUPtLxlvgK%-uM=VLt~n^H4J+r!AT7D#Q9#C1KO3HBQ_`v~O%z3&1shO%%JE z$?~3}E$|~J)CZqX!(l@x>WN0Z(l3w>CAuL6PVa3{*arE`;zCwhc`Xjc6M06<%{|mYkS>tsX7A)XaX4- z*($;3hTtED+l)#wXnv{K-7hZ6I0Qz)sbeBtLM`$P&7BoQEHQEf`DZE(O zI{CQ1-=GZl$#B4Im>Vjp(JyXQBF8P<<{rSarK)N~sN<1ckawAD)ZuR_mgC{J?l5<5 zmYbuzuIh0GG?Z}hamgw%hZXj~j{?rvi9=v?=BTyzi(!l3V6<~fLfJC29tM~v=jWWx6RO^@h z2WM&M<+^4|6EQwd3p}JVnts=ixa77G9$U%bvUIJkKQ)s^U#PxKb~~ZlIJ0ZOySh<= zo7rCv$TU$QvT5nbM@hG~yzma{zR>Cs)YWNB+Os!h#Q(RWY(wj5cn1D|XnU`yrq=e| zd%rGJsuV#4K{^NsVIe4BL7EUEf=EDVQxpqeMT&wjU+FeV5K#~*CX`SDE}9_BB`g)| zf*=M_j1*mjNKq3433ERCdB-=tgFVK#55E6@?*mU94o4EmJ)h^guj_Y(h=G$~t(?#= zh~dnLb#;d*imby5&ajv6yfEt|Y?K+9{z>y5oHrEpW@VgIO;R600PH23tj^3LPBjrY>4JuAUt-}C-Do0mECsWc`}UeHTp;Bd z`eaRwyM8jFgq#O*ToIwNMNZBMp1AqBeQFEU$TyaE4~imRZnMvcDI>hIuTt%mqBjJb zj^OYdTR7gtJk7^-%)-Kgd_i0(h&$<3?^XJ&P>9Yh*EFo%{gOjnI93{rOs&rpL^)PP zRk2|hZLM^~kZ+IPwh^TMq4}fpzZ}oMiIT*htyrCOrYIxT>6V=f*{Ec!a?C`)k>2U+ zR~(Wf0qJOL6#V3#*iuD{sWv3x+wMrwG}c3v%w{!W`v1!L^|0B!&!ym1Ktr!OfcvxM zcLhNP$mgHI45obBZA!I>+2 zrToq;liW4Q^4%v3Gk3REQc!dR_!LgvN)V~GGpX!@eii);@gKT&?`gpaIN7@Gq!ZBteJ-JGSTLp2j&F1feB1b)Qdeuv1A67A?SFetBDO?419MD0+KsD ze;255hWVHDneZFkGkq%{QGp*+#0g!CE8z!2P0vmjjo$2gE}+e3(8x)CRttsCu`Yjy zFf)d@z&0wPX2hjA68cAs*vz3s#rHSK=oiswAdf`M4Q|JkO6x7#1_fOZ7d-r}g~+n? zrC$@TDlx=nR$bp%6p^+;wUBJ2x8Zj9K|ujf%qTz3m=G=9(Sgt^9{p4Qz*)Cm2XbqT zW#eZVc#h6c(EHKd?Xu*yq^m)rlFfmuZAj$jk=`v*2GAcWQ?w$D#$fHPp_&ov`L*K1 z84nFl_&mAJqJV3sEjB@IIhI*(bgU!A?>4h-b^^x{-*pKTPmI%XMAf9Rz^w1nmQ!L< zU$B@NSdWNBtd!?TQFv~;YDwA4cemdDlk(hLE?QH$xw$YmVpRJ0BOe5&m4j?Fonq@h zjmSSdk7TaGl1QyMr1Ykt%vyT^h4HPSNRV?Om)wy%1#k;x%S{#vkC{gw_d9n0t(nP z=Z$!CWF!$#tXvha9Y&98G~U*-h@o}cU-wf%m!S4EX~6%QN13&&LB`#ptvAA#_K2>7 z$i~!Ztj5qAXUx=o&VJ%_YAfkDJ&M8=f39vL=97|BBpxr$2HrLL11`)SY2ShVM4Y>9 zGn7o@cDp&gzdh5e6gs}%{n*K$1}8J#++A$91R#_jT0^?aIHXvbq%S-WA%zu)8=5%N zL`PVFva&X}9NJAUPhn!)dZL*Y;y&pFc#EeE)p7ANE!c2CMZiSt{(+c6}8CDw{C z#DL_qsTS!kS66Gzz8<{_MLX;5Tllx;oU;P`1T{4 zS9wbix~q%@*=e^rd!LQSzWbUw?Ct_W@t9Pebdbs`bA~2ZC=BI2h+S zFQU-F0WHk#W;y_oM6S1NtOW=%sr~YyuJHBi`77``yueoLYy~q2?y=i|%58B5C{*Ks zjqNthYcSqNk++zbjS3AxTgHc;BN7xoNhMDK%eI7pOXB<8vZ2|88zp+L`_m3@_!ukL zKyab8Oq6$e1s9y1F$U}f0KCvAz2M_nL9u8KfRU8>@d%T*XT#=Op z##rIMQ~o-a@#|7^jD~Z_Sl$~KZdu(?q4(Bj*Zf_zX5B7i?~PV40F$~nTr*6TWVLR% zv^Fr~B~P9ELtc4<^#+HByGtd9J}|es-myyB;5JZfdGo;zKJoFg^|%MAqkJ`0WqJ> zB_)$<%c5}Ouwie>V%$bAed8SY_HY&N@N>GIrq;$;bvoB!c&eMfK-6cxzA>=s>d$W> zcVAddTL0@HN7RKf_(INwOuX5w=&g|f5L!gM{s`Z=***&LuwaQ~9(vGIGaI>jMoIMFKCy5TnM92bXABgpJ~5f~={Y4Yh_@c$eCh!TS`9JpEB z%9V`xU|{KkE#BIjzaNOh)}jE4S12XK*&s#xO*V3TdEsFFIQN^q*4yWB31e;f?kG(mL~h zUQzh(Eh=qnw*FV}Q3ZP*Y}2~YH=T2roVQ~(k7IDj=<`pr1E$^QL{ZCv|U;N_>x3b{(ht ztLI5~utRHwzc8<(EC$|rcjbu#27kr4uM97Reu0m+KVk}nvL33WiABAin>72l+&PKd zP$JlOjc-S8=Fg_-)+G7t`S%#9TdD*=#8`5q4Qs=fYc*Pn=chEN6}T7LYVF5&5_SyV=L%|WU65cpeyn{RVY9* zj)B&E0g#bOL3{*VDw(WLJ8`oB_%)DVp2eWr39Un<%97;v_nkbuNXj zAa15PO+#^5_jF9*8%jKopd<4s3QHV9Wo~Ghq&5x=w8!7)h8A$3JjZJ;{y`{F#jYDX zcVP?YL_hiWSkMx}n#F^_UwY|+5h{ytWXim)K>*y`}7Rn(y1Pzv#3Ohw$X=nrc zEYagl>0McI2~Y&tBo?Sgxl1dW`Wk}r?`}4iv)J)y8(4>VWC)bb&X9k}BpK>0&OtR6 ziZPYPAp$M{1pJX5ton70bGAXaTJ`sZ!!93ULhiT?{QK)bd8xay zgTZ7hu+3!he?6)V#ol7L7@r%`Sow$aFB^AdEe((Ff1a{ZfEyF}|5(9aJ^cNx{TizH z*pSh4&?z@|5&CoAWBKP(3RSZ;c$Hyq?bTjEE@Atm_3koGs2*pS@~myq5(6w^+4VB> zVP)1*TH-dflRZ|~|EaKJOoY2zf4QiR4+kE|el7F)j+Os|4>idcSHd8^o@@NvRn9t+ zIfV}4@8*VpxJx8i$n4$2$a8fCrbEf5Pz?cG@T^s4b=mXgHQWdOpr3;@z+Jp}1HF%v zHfd6ygc2Z$3qEfxsp9I+6Jl7G0RUbiswy$;3mfz)(ur(iRz`+ExdYT)3myDKxCuV^_r6*}t-JC(hA;KtB?Ii6_`hvf){GeXumMwH8M4tY?0L0)YqOj$wY z?`_k2Lw);_qvfjFBq7wyhfMX@)E4SsnU`^m(U8sHb*hXAzBXdH_}#gJiPMQbfd<*- zMqE%?42an`aoB>4A&nxQsg(Wl=z)_7UqloF@!uz{z4e!3C=Zr&xP+Z+CJ(`y9X$06 zY5w@mcoBDma5315CfSnB$+|7z-C!Y`ut*gHBWzpyB`DwF5EDF3$QzY!F?(O`MrPY&m*=y174Q*%jayQHb#0Qeo z7X__-&qIPB1N>XLRR&zUrbbIQI9*JNDGCHi1!Vt7ck(Xm4= zx4z~8pT@9&JU2#Wd9150c;L%LS!{@134t>MuvgJm;}?7>^xMo9JSoxe8opxkTSvEK z`Kn_m8=(v{uCezY8bZZlq^LnIoej`-6Rw!j_KQjJc(j7W6oE40k%p?GY6G96`+Uh* zN9@@`6fn|q>9zd7;uk>fzN&^HZXjB*O%lRHL{xT6(GW>LD#UT{X4Fj5&n0Jki*E|6 z#f8cdx+{9pA|lR)NbIhsS>E`|Aa&zOdC0hZl1OQItTcGrVbL}$>C~Q1q-$5I>>Z1! z2Lb$YWo5Nkni!Py2c2|H@Wcp~zH7)v`SK3xSplBxh@-*=OW0hj zulsOck7=)CgaafXz`3yh(OChcMJ4f+uzE`@$qX*HB9`xe`UC0M1-}NCI9T`G+rSp}T#vKqfEWQWqI&Q2xQFLlR^- z2$aM|u{dX%Ss;qV^b~ZVH!V=!`%<(K;}V6V0i%E~$mc8&Z4*=qtn>)ra;w^O_~@Lt zxeyodc~L_NB3I{yLhV>~WEVGq!vvhu1hFamx{fU=iuF*J^RyczAbfTuHc;ac%;K_= zCIyb<7;Jx(kh%093;*z|hf7~9Pg&RTSf4ae^fRb@q?|#**li9>D-q$W7g-Q6L|=EJ<5E7KW^eyiIZDirlAHIS68;044Dg3lO(!xY_=jF z)jzAKZy*a~@okK28szZZ$Qmn=VX(KO!t7rXV5N*?YOkH`ldy&G!X& zRR~FFjT$@%-Mm~t$LMDG=An^6V|VfPRap-m9xf@YO{vK4WTyi@^sdcc?QY4T`~WY< zjkB}eoLpREAe-)}Fwk4_BA_apBwF^R4h14&@SSan8jtoLOKSY43zFwZ9T6 zD4z=goi_WoQ#er8OwRjwoe4ot3u2SCe9t!crsiy?bG^a7E|gh+g352ec;NH>EHc~h zW)gJhZ(qZSmGfSN2781^J+wNZKu?1ehb7N0dQV$*h*Ue_eYQP|t^4m(P|M+${9MV+ z;V^KVD;Bg6yi42`u34HAo|LS@15Dwxb0Mrbx%M^0`&O30x1-3<+Wbr)n}UnP2m!k1 z(_Ew?6>hCfX{a+B{ZcgD?&Ne?V*)VvF7@b4v`$AOWztSFVV=tECo9j5R}h8Mkq8I( zQ*S6FxJ*#y`vqx>6?8)3Rv}34(RoA!q;EY?*I*F@$Ct?$(m^hWv{*PAgE&DTGue5T%yxgLpWAJr+$MJB=?}dLKf1I7I zKc)aVfU=0RhT_)S&sRYx@f>c(LgpUdN3i9T;nNCzWeYkiI2eQs6nB~40}duq{ayT` z>#BBaJoZGsYEv|HiRMSU+?ov7P8&DKZ8%UMb^oEvxn5kz7vcd)#K+l;`^X8cM_Z5_u=Ho2!owM~cNG99*2zheM3T|?DYSLJbzG92jfPol zQVSt!Gt8m{MkN3Y{N;L~C5-a?KZ3x89j00v+KB!z@ehxz5P4@V2GBWRt+_@)(zpL* z&v(qBdMlW<;}C7r&847(`^TTgI0OlOleYpP^WD%x0Kn_iBb#-8oR)Mr2ssk~7Xjfh z2>x}vBrv%9+$h{#cVx;6PIP!Xi|rI$Y<*svm64TK*f*8^+Ia)G2^auwfm`~weq3zU z*VlvVcz;YhH-dt?KC)w080dKFsj;E!P2ijaoCwFpE`M)P-V{IV2ukt;A)n7(99lY! zxksi%VMit#&AuKu3dGDvJ`T5pR^0W$ZZgib@gm3{nWb>lWsA zfYn3c*1u6X!%hh?`3JmAa9=VBKpSJqAVs`K>4Li61LZ&aq@+zI#eY1S0RcK)*e<@}2vZxkUJBENAjd+e7oCfYfNj<(G{z74}9A-i5{L*p8jT@!JU;tPzQ)m~nkz&mAF zIw7fF#Ha`eBu5tNUO7mVFanyom+E6#-aN}fTuhy%Rn<+k6>mNfvSOhYc1sBHdU$E3 zDk0(1DV}(8VMru@0upiiM-VQ(KzFo%52FDH6+Ik*El8YO<^A=miURmHaDgsKLy zWJt^%BLN@3Jaz7X-M)P#&@9RgNF1u-bg7W|M6=~xfj3>w2Z2xJs0|IXEx&RMc9o;V z1LE*{50p8B!ryzMF`YA~&oD}(YWvx`v_YRF(W z#t9y*GHZHwxajnipj-Hy z-9gMDbKXO7!r--3*YmpvrF>@4K)SoFI8Y6E-uf1tfQUGN8CqZ#sk~mW?l0H)QL}2w zSV|xw$nR&-;BuPt_-`gZ#&cszfAC}7UwW%|IAHATf@{@2|67ch_5V_u{(oFs+5*dK zJ&r}3I2i+bgQ1`OKZ@F?$AXY_#j7oqKDn=$j5)GZwFB-M{BE?Y zHh{_0*b@np=X`D6HhtM;yQR6h%-I%}=RT{W9j}`?qkleYKJ&q)P1fc2R5|&-nOvni z9WvKHp?#!A#n~|Y?G}y4y!__@lP8ABc1~$=%rsZmU9Vd&n!;4@E3F($E1ZvTK<)G$ zeaf}QeuTl^oJ^x$w6s}Mjd-|P?Wx=|s-0%N{`e(B1!!)VneNWb8jNscF#WqPgyej_ zk97=aBD#4p5h6sy=AOE?6>~~{x;Z#=eMc1#3Jm)48Hp$$hiwk2fX@m)+VmXn#q)Zw zOtZM{3O$@5>6GArB}MPO7R;{ix}qesyM4-$!hP?Qsphqcjc=>Wj9~c&Y=o;dRwagf z)Aldnfb7k8#-hlbECLu_6@0e}NCboagADO_R;oA6d5n5G9vb2}U@^?re?&$skr~=) z;pMoTrX~_DtZTsuy_7S>`l|um+oVTOvkR+i#y;i_1@MDT%g(gSPW$%p+MODBLq^c( z3i{$4iH@As!m5M&M!eAB1OEo^p=$GPi8T@mX4v&sr5-v0b`uqy_Cdgu^*%97IXAZr zTdWg7LRy!30t@%Yald<+O+i3-$`H>`XAU`X!mKc%Of0BR1FX534n*@BgSwBu*Z4>V zL0y+i0u5ImlMo>2C4-2_6pyBtIl=A+^tV2g)$7;ccmvO3?`}{v+E^$e8)@mGNk^w_ z1YNL$G9S}(H(BX-;1*~ZgxBtVgtBllr=dtFB-jiFbmMz=3BLyn8PdFtzsecKBdm{N zpk*8zMdt@a3_nem$x0b*>iazwDlbh|?hdtZ9K;O^-!w)=vJxYrCY?=XZAiygkS2QA z%5X8vbMWcrc7^X_NF>27vP~f;!a0nS>7S`6@H60ZKm_PyZWyW>jV()XZ|($3@(v&t z9&e%~vUsXNrEsqQaN&4&3j*7gfR{qt9(jk}n-Nr@+EPvO)m>}l2m*MEl)q1Y6trR( zB+lH?eR8}lY7iWEi@W*}RKFhk?C5zi=f2fr`1*UaERwq}c6bT7=4Pp}Z9KU|Zzaj{ z$rv%j)nWWJC|3|=1*cTXkOc=(XOy7anBUO%E-Nu(kUe2z`}B>HZXn9(34JVHpW>)Kx|MB)7G`szlPn2ThjBT;QH~FEo<=^9Lr|dNi1f6(-7w|o`@}Aqj z$}jiD&NJV9%e!%{V$oR5RyY`L;`{DKD8}^yf4S&Ruz$?t7MT9_Xw@=5Jca)HEvo}#?ZjwgYI~tRsMIHhn`(T5a*d5I$snf9hI=o>A5HboXYSx zW|lVcS%9&k;yUsiEp7P7fVq2Kk>&LYJ7>G_6}NQ+^B7UjidcCQ1$Sj0bh@ulH!KGu zD3~5fd&%Jwi&@vafbQ!_^IWIDS32qSwfeo)u-MWmnM5z6l%Jl zRBn#X+qN{!+;!}OmfpD?wlqk2WsGtNZnYN?AT;JXG=Su;0Aw_|9B6D)zuIs7sFv|F z4DXz1Z29#HUy1gdbfF-1YjMYy+uvg$2ho?4y0_I4j3~6Ni~o+YliMr$EO}9Q#e{%6 z!hheLa;DpBOgknsw7VJOiA8f<|2g7TXyIpXI+lYcp=HH@>9NzCEtdS@i$DM`xf^(- z*K|-Y=-7)AqeC&p{A*Njp5R&^_|_;jA%*zbTJL=C%5OXo2Xn$-v|C-nc!5;E_}oTUPg^&A zOIZiNpR}@9ekp7JFd#6pmRP$I77Chm-3&p0uFk0by5^$EF?*L=r`$VgcMcrokEhTv zi~~4&xo;YZE}ctpfp*J+0Gyaf?Ax9j2HRJQ}an07Ga1FG<4oF!ujl2ZdBb>(u0DY|kwb54#4bWJi#OsPjX%Twy<`?wur$)#SVE;@m@Q40_< z)Hss&08dV#7m4dpt-6E|i-e(~Tg6PG#wf2u&@&uJ!MGI;Hlc4!<3Sw>CY7iW3aez< z6ogQ8iWG7t(T!ZV?$6?bk|V3?t-TE%NJGp4Mf4@xPJsEECY(%s&g91IoMccjESM5wZGX(`vL_gj2Lop>3pH>mCi|iLTj#7zNDpms)vip20j*Xphi~iEK zr9WY2gs8EFDi|3ZJ0MNlY(sI`DG-Jf2JumrvS_+c2UW_l+|H(ejWkxk*XLpYeyUtJ zfG2ksa`&_7g~?Hfh(zfK5q7uW0itpi&_XHrbWPMW4VM7uu^X9ffw}}dz*}|zUI5p# zD*#O9#Xx^P;2=Woa~!~did$d|mPovapN?O|69fpUYu!swC(Mt9!_{NP05cA*h^=LbuVs!_Sj?o zkl$+FSvkb|@Y@rgb5~fC>JP7aV%$0L(XLB}-Pc)GJbP0UcH8if^$pfv?x2KUWFWiw zdk3)~qg*^o3WEL$R(I8f-<|~jByI4}h;z^4FP(2n!O_L#-eabMLCH(43Yj&LN>+HljHNn|Z1?Hpi_(tKk8ZtQVSne<-8cw+S@}-+ z`G-#2C7J#zS_IwYuy=1yI%-GNOLT4q>HZ2n=|TZ z9w-+`h`3vwtP-CbF$+E=gNGbMI9kF?PDw)NB%{#Lxj0Kw#ekS9#nu4W-@ zxK%tb*4Sb7HY;1xbafP~c4`wQ+P;308}c+pCtAZmtDHUMx+m8!1zDUj5^o9hzmXwh zyws0&4Xo?4%q>|n*=JzCR<=jp-Z@jXJ$&m<^THPgFhNW3W#h-0s%Me!!nGTm`@^I& zPFGLnZuRv^kDA-=8Av|6NH*_9+V~SjkPI%NP5S(DO%^`hc6cT9dLe=g;TCiRj` zDtm>Jy@A=C2&hF`+QTH`&F6mb;sFcc2cZ+Yd%xcd*6koL;`^ZGv0s;3KCe%1J3T+3 zuGEeYbLSrL|qa4;@B9cSne>rp3P5ia8R6kg~L1K%Bc z(!>(#xTD^eEc@q{Z&=$`t$vV|ePlh_+sJ*UPLvY*`rEQHQj>qm&+a`Oh5-?Rcy4wa z->mGTQ-$&I(^GwG&vvEhWkU0~h^5p^BxFyju5nqDib8iWt5xR^)mnA0BRyV2I{?a0+B39qb@|r-zF$`F#=)|FsK7~LI4|^3zw#BL z&^bOuF5&F|J~wXrf3?l)Kj7^D#+BK|X4`)uH*PU*JhA`m0|#pd>*6i)%1=poA6{p; zPvi-Xn%B8fZ2$7sOE)<6<%RtB$8O`ETD@ETUTqz8Bkflm^#bwt-QpwS4N~_|_LP1~@krEjd zSt7mbR+Gd?TK^!ZC8I)7C_AMzu+ryp=4_3FbB$w2JxNHN#?!91s(AU{|5E(0x8IZI zNfYsSutuFb$6?Ph?cOC&@tDS-u7J=kdgE=ib%K`U0!!@sRn|`OKN7zh{<4p2W~Cae z>{!TWlSu;2r_a&mnw{9t%4g}mX^&%=DUx>^0ZvUIR6J=+R)t+;7g~w?G4r&O{7aB2 zLmOweBYBs8Ij0GSjT)>(VV=`v1G*Qj?2i^-OS#8*mTidDG=YU%&&h@b7Y}?l*jV7U zU6k9@*r7+;_!PIr6BJgn-(0JBNEr!R9ok&`;?Es>o+!U7sySf#)_#Yv{XR!!iezw_ zslGB$--{9(S#yfCuoT><6{hyI!v5}G=PBuyHwIdxcey?BTwsd_OQ!C-xgPY2E0)_w z3k*Xu#Am#&VP5Fqf&P~3L94HMbf)tTiAv&hrlPE?)j9B~d7vP@yvJ+n;ab(29h#mK z#QMu^wlZSH87R;P=w38m!3s`B43l|^6H z-}xJO&=UOkcy{^QCI?GXZROX4HmcoW%76apWarbPle=R}_Qed?(;~mCt3uA_hSGIw zW{}jC^dCxNb(+h%smV!6DTUEpw9``Bcdp|L_7HI~Nr6B4;?q-CvaJ5O6M1wmKYiC7 z*O-%quIo46u8Mg2GbRNWvYpPxPHOjA6dG37g-^AY-5-}GP2f_cgz_dS%k1Owi_v!B zznL*=zP$N;k+P&G_QWt(r5ATxrmDkFy&iac^-3H~Q0S8)j3}L1v_%nF&q3#U=~U<2 zlw_AM{_(8EjT+~=zNsqf1PV0cg^l^a6JGUZ)V$x%RvW7jrZB3)X|D3GF)lT{X{u6S z5@DI)vI#DRQ{-kt_F!Z89g}EgC^-tnIuIah{9LN)}-Z~qbV@u5KWFVc=oF7ihn7>4wVQt8D`Q8{QxtT zhnCBY2F~#mq69U1gPyqo)3<4UZR6PAQt`yiLs~~UWn{DZv}(gnCJUMGI*JI=(X!h? zg))Y>A4r@i31nSlzFT_Bl>J$x74aMjH8LyY?h>B*yZ))O|c zg3`qG^2jFlpLVZ5RIr-P(CXsSF7D)6Hed%y&Va^&46wS%?YY5vWpDRqCbS&9>HH+O zi8>MjxF5M?a2lFxrAm(}J-xLJIh=o!SI!J?UAc@7@v1Cd_7s%L8vFd?;lDQ3>C?S+ z_A#5IkKT!{bg_w+-CX{(yKkfH1Wijt*Tde0rgeSNsO0TGuIx9Cl zt?ih7Ts%B8Po3Gi?rYdSpRe}vdz=1V6`d*lPSaYJt-D)xNK~f`IEY{;jub4~q5NJyo+D`9SF3As#Fz z*J$Z)892j6COe&WVF0A67S1I%rFAGIe>YU2XN}Y5U;&fuwHkEFh)j*4&7V%A(FKKE z377yEo%SD{V1Ooyw1pA$7Cl_A9TRku6M?UO5VOB2U}{GOoBYR$ zlXn3!Xu;M`ew2B*K(Qz_@7LI^!w0N_9~G`SENyTjTQmIJ4t2{l(&^fT*7h11a{LjS zsF9QIsqfT|K&F;Bl1cUF$xdClbKYSlM>_0WLdE*8Subv<+f5^J8FmcpbEjzVbW?_r4+f~E?cQz}(t4BT{4 z7NJUd>Hr#wc}DB~N+RYteERWN97Uoi4C!7vErjHNh^03n3)f)~cgn)lghHn!*K(_k zOFK?v%JlW}yD_p^ScD$ETMbO9xSpN#3BO=)S9?9gmYv<2^#f9)(n9hEe##X4ZT6|j zvn6js$9~J2UGUm`AJ4p8IoZJ&o~a2y476n zG|&1Dvjtv%TW>QuqOXDQ^eW18er{AeHtk<37;5)YlnVI3H-0Q;@bx z-Iik3L{+$9$OgkMVCd)3z1yY>;stjr>1ihxEj)}5(;s*<=i70|j+BOGY*tOqr!|^7 z=@}tagHC|uz)G;6j;t^+WfdyGc zYN@EqO_3ugFkL^M|EtRdV1yS@?s)#SX8RP1Umm4A=Ps%FJvJ;IB5mTy9$K>t>o=3W z$$qE8im64!!gokzZMxoDF4eWVL1}>H;5A30z^H{#;Qj;%x zn|-D!qW-6Um^^XSadZwexaX;ZF{K@v&2%4KS4H`DTUzvH7{7hK^PZl^CMCM6My1R5 zuE6u;B@f$h8qcRDSIkj=74xzcyy&~SU!;rd)}OS4?c4)MN@Jiqt0%L#ik zPRpjQabDy6B%vzquHGw;_|22gZM0wobmO>Y#p-Uo&FNN`?~@zZvGlCQ-(iM??b){H zcA@#rZyLMYm4>am9&Wh2d*1Itw)e`IevhlE$?&XtrXCI7V$mBOQLBH}Wvp3heHLFU ze^qwp+j$UK9~&yrteR?w?CZBt{_3Y>G_y23w(EYJ1B0@vMTmd8y=pz?y2Ys8u_yfc zm`zIrTbqMU)6LY3bg`8kkg!t!>_kGW@TDw?#)lKDe?<(aB zRIlb7?#N}l#Hj&2@7Quk>*!TPaw)p36 zFBXF;w;TbvtV?#4T|>$0(9B$LNiA@6zbb#UdwJ$~dR3B~p$Q^tKU(%>&I$C4UVqo$Kk~fbMaF&|*^splDr8EwM7~)u-3F@DomPYCHz$xXnqNij zp|w&5SH>PCx+<=ErC0Mv#HR9P-hUj$<1m?(3>nM$JmnWp$}*!D|8`aKFVay{SZQ`AA`o#{9RNlDAsSllkT z*|(c%za^#J+W$p-Q5UVBYE!r3nPHGQjrgQ9o*p#pIxyrowcRycNC0p=m(MNs@leUQ zvp0)hkK*OZPz_D{V5fJS@nV=5Yzi0xjH(aPQ?^!o4 ze=9A4d7)9a)SEru@lnX(X5SGKaX*w4=evm*Se`^+V(d#%5toAx%0yA2!WRT8Bl>lL zA+VK$K20bxIr8T7#ZuiKiV0&71i||CxbFh@?9Zb=wJ`P!%HVz`_&+HoEVfw2Y`{Dz zBFSjJ92!dyzd`SpB*K<1*Pv%%xK}4hC9y^}NGL?{$$h4OA6mC(`!tOa>^r)0nx;9f zhKlgm{%Dha4@ZHR0Y3>&0&6s>^4{Awlzk3Hd#KdeZra$f_9&U7d&JuzjY4>q#sAb6 zS&*g~!OZ{HJ>8ey9K%ARgo&Gsaz!0hFHV%Eu@i%&w@9~dlroIoduLFl??KCAf~`5# zPl)UG#6$UGdf@!HfzSQezi*fpdvK!V_uhY9+DB#&9rXRQEC20KEv~;o!U6&(=1cFR zUQz;etDZxH$<zdc;KYJ&9l}mDEIv9vCFRRA)|R!IU{rybZ1d>-sOnZ z$bmBZH_)#)yC!YD%1nl{@an8jXZ84psks;=zt= z=|p&jc`ap-y4xxvyX03(1gh2oOmRoNT!-s)zK85Hb0@GcD=QeC21lPAr#TWD;Q!F1 z=)T)QS1m6zu!xq!k`yl_H13EW zI9t_J+AE#+j!1S8c+l#DGp8e6Ndg@j;uKRT0hN5RUS{?D2*PL7U%a{Bw07?+^?VD5 znA}~=_gw)?<&`b6)tZq752aJQzee(6>JMLww|uG9Rxx`;K3i_p9*s;}d3*J%*}La; zqZ3q{vaUa{*p^FS^8uee?D~MgJ0O$m;niwNN*}UmZlAm*J)I~2??cg4Kdd&T4J(cWb%Yp={#{a!9W9$E2kqO!={u?5bt+myECG(T1^yEUy z#$&I)oy$r2_Mu>Zuom^G?)Zf9C8o7p_B&~h*DYCLYu+3h%4>~$Ih>KVSw``%Mj+`K4!k1Z_evveyBMfwcjOqDYZ(hJp@=9`w z)-`lysl=@3A_2%rY2C|ydYom)K*oEQ-_lz=n+s-bIZvz*d>a#ww%gVKVEGxL1Qv~A zG7BSNkGolHfS^*xFQ3rxRXi(t?%6fU$Jk0ZgRox_NGO?yL^(0Vm?!LF4t()cEaUd9 zCe3F=w4F-Og4lBs;j)qPF%?pi=Zw*i2^jr(@lW7sz|&4Az5Bk`ivt8dGCY!N64(Y6 zJlsrZP)Im|3K!i}qHBDU4Q{r`!MY;pqhg~2Vt*b7_*L^ zah_|rb@kypJ(B8NL$WQz8DEoZanec4p1Gmz9ScKAts1I*wt(QgkYjaek605eLK1DF61fLw6!C`+WL& z|769#S3Wgnw{-tlp6HQP|AIljQA_U0F=bTm!M8e2sr3HzA@*tGmlgZE?Z`<|>%N!5 zER4xhDKlvg8)f$mKDEn>=56~Mhm>|$?G%QuPyOsn4joHdo6Hq|&kmYTJLtBXoG8<4 z`jYfPemwSK*^4Em3t@E)W_A)i_fMI3k^*JoK07Q!I+ey;i1cEcm;LZ?XG=@ed=^it zsO?pffv;!|e=b>UD2h0EaBi`zvpc}oZD*LZTb?5FOPAY?&G?IMu1ejJ0k>i1*UBp6 znPaPntZb3APB#ac@tHOd?8!fMFK$3ipT}TQj?~7>!JOiVaxD_nc=W`jJ28voq!@1P zTuUEUgkB#botNKoaJ#0CCyjwLI3nKr;1gAW{!m(+rZQc-&>|3j z18ydR)2LMJqVWk8N-K6oMfR@NEj57$HBuet!%m91cV@R_V{z8-xjRlpZb_uFAW`-KD**F2L{Z@MtjXz zoH1BJ$DGDH^4OWtU|mdXbB303l?HC=0byhRtk9CE)A+8;`hX z3F%54A*9MVnca!j6%?|68L_%q4Yz7Nj~5c1F)a4yHbH@JdYY+W;UK=kprORyrprRI z9M9qk=2JBNXk?2dR?qs%8jHAeDi*2fP457HDr6%H+3eB2EP_~!V!wDE#pH*XHIxEz zV}YSriL=rvW$oCEjX_vo6_5;jD5IYF2&Kg@;}z>V^iZ_3T? zSI^?D)!K{Z0%Co|Nr*+>Mp+P)UD|d3kn5_MLTJ-lU`%K-(YaeQOb8~g0 zjWqrzZSNV>WY_NPKetjs6GD+9EhH3CiZm%I1VRZ#kZvdu0Tr+y(nKK-5FpYC0)nDc zfkcP}ZV`pt1Ph71xg&H*v#Odo1rAk@ z)pEP^z7Z6v9Z@!ZIg37(0r}4) zT;+}RjrZkdabf1g?-gQd>%>sfPGkRsPg=(=+xpwaHbsaYBFZ&XB_Uw|Om`^J{g!#( z`%ZE1w_O76E7j2xIj%?48tARFw%?Lu%H8Y|qZpgcVshGsHR*6I&ytAPGMrHLFo zd)H+>yNYR!gmw;!KkkF)T$nQRF=fmbJPLV0T_cHd&cG0|gN~zdDWaYr)_KDprFE1S z3bB6yiVqY~j!5aA7%(!Wl)UqG=@B^!4W`VdvHI+voI`tW!lPM{3Sob%#+9V;uKG37 zCHli?8R7a^L|~N>u}4B?v09+9Qkf~?_j=TJaDslH;o_D;A(H1$UkMRMrk$=(D^%*2 z?j3}0nmaFYGsdN>WKA5u^>>8(+7o>uS$b;!?xbLBE=}!5=M15V{pZR8>FsHCWj*`* zQVuXE3E~S?UzCi3KG{P0t5-5Ao|SKv79J-w9<$r?eGI%c#`%mXR0cxrY2yk}u(LNq zqD*HTQ>qxAL|Y#*jrdc?T()n|u@b3AZcQL;Cx()UrA#Z6Z^s4+x8NMaiO; z#_{8Db&dM1cqT&C$I68s2!62Q#K;6zbZD7KRkz~xw-WcIg8AIiE-UMCL17ygD;98* zK8~@nQ!49lsl3&G;8onymgh#kq7eDQ(FU(c8djktxw$dwcp}2yR$)j$lp2IM=PTHe zyME~ocXdaaiyu@BnFUD!-h*xS6=ir<=4Ir~Hnk`RXXIvqGD36IS8C9uLbDU*jwn|@ z?lqFyPh%2UwvoT6-YLFf&uAHEPq@|}PS$&i*=-mb@3+dtf`KYAGMC#Q{K?n;0-l+1 z=BJ9&yA;&J5IjeWLXH$wpH6c4D&AzWD(vF>o^aqR(;}IjDI0CdyZAPwmTwY zRR!weS`Y(+*z@ayp1gzDYYvw;UZ2@Q=P5S9nOY%y;&$#z-H>#x%1oQX z7R$eK-|uE`$m%k1QRY5ir5!~MI$qXYMWAbFnuiXT9=H9|bJUnq4l>}&_1pM@IB)w2 zBmdu5`LtUJ8nTnLm*IG^Un!=DyI)?P5UfV6=uh zW@{gIqE@CRJ10`)#VC*OZ6$8Q%4N&#>*RL;W|4!r}Q2iN}{Q=JdHff7m^a8O+4rlk$2H zj{KPDEL%#NH+P{U%B-&?wflU`O*@f2C%(-kJYyt%dIN3WibXAuaie9mNhoUhJ5Ti7 z4T}&;%D2!<$(sN(FwDi7OQ5sY$@LD$x@6y4hD&o9c`%zW996a%BG3Ymm z2ZgP{lsf3fx(#*VY8h=jo8l_;uuS}E4&pdKDiWvRj(={R3}c6|Stvzpa5b3{BpZf* z-ToZS&R5JLhoVmu46qo&3@Pyz%4I*7uuS%!z9$76SX3P)%H&F+w;6bc-Gb}!!Zr7e z6F|@Oh;}iLT>tjH__Jpa;4tu(Kf{Z8;MULRZUEO=YpJsK@|yPA*iZ?qlrp)Pf;9$0 zl(m#`Ya8S$QoyFFw$yUBD*)(d(XeE4bSZrWt6hQ%(sOeN0RX$RK(CKwIQ$GO2a`Bn zk1raWHGnm~A7=PSMCQAr9qv|}rbZ>u0i}i6QjXK7N>PPRp&k#$^a=n&t_)8VePwm? z)~Pd3Brvn{y2J>AJ&kv~d&9GMzfmxD_xNI@`d$;ri6c{rZa*)XP?8`LY`YPk*Y3WC zM>@vSE2BD^EcIVD40lu=nf;25XQ$93_H5JBGuF^{nF|7yM~@!&7pD#)eLLju?1HSr zd*JU_W^1TM^X_8|id2ZbP8OFxd~|rTx$5z=ohLeL(mV$|$&xTVdnw()z<;v!N_5f2 zoyj6VL6CPmkX;I>inT)wn*wkUu6RiTF4fSGy?eCWm_iHUu9nX#dp8b;>9WNv{=zE} zN?y#&z{{()K&<`19GE^$)C(}mF+X_c$=@!zI3@YVxVfvJmCsI*fSPr}<($RQ@T6=p z7or#$EtUg?VxUND;C1RvxV|j!lz8jd*1;lU&ktx+PPcNQx4yHoK7|JCY0ym<1j`d2 zzAzuOneTMk&g3#v3RN$blgEIzY0dc0R&P+_smOpPlrZ4;pSz#BL$frbP}`xY8rZ-Q zk9#)i`&Mgr2+Cc=CrOm?1LqcG%u|HgCV^rg!KLT39nKne2m=bQ|QPvv2OR=JxaHTBC5 zwr$amXF+Q#rDXtWEqb5$A^{3xJN81onBaR5QGMJxrmW!8-&Ot|hrY;g*$*`Ai;alG zPOUAn3i+^@Z-B2A&WPj&)wwyt*9*D?oJ2 z$kb{mP~xi`zjvFaTNr_rbXL}6pgPwxM*-SB=qdb*8 zv+s`hwObp8hX(j^P780=!Cy3^5{OmK21^}rjyT;RXpJAMnTxEpQ{y$Zbph7?0L!Q# zzj!8yAqk0E0i zsc08~nE+oPvPejB8-+U2e{!mnv?n}ud>Bn~q6GCWL zcPu;@_hn+m8vQ9u8RElf|IA?4?0ybSrn9Tx%)ta|Plx6B=fJKq{TdYuJ;_W1kg3mi z(^?p)CU37UkGxI4ovmZsVQi)WJG8y7r79@v26sMQ%e8TKd8wtjKsKOke7R0y+)>eJEHFza}*1J)F-U6aR^_ zs&dWJa_%C_w0UXmhRnS}AjrV#GqFLsWGTZg1u)6SrpWU@KIm$F<70L(&sc-oD)8(u zw%iaJ3mQF0bBFX>DbiJ_Q7jJh^L2u_O@BfsgS-tFiSWHdv?Rro>?YsGt2pCFX5s(~ zel974wf}_f;cQB0f+$9v)fs1Eq9fzPW0^ysO`ak}YLw5<XxR25<0#l2vp)P_|L# zROy{4pC_g@t0KlyHLsV{?I30*IP`J`)vK>F$3W$L(^d@Q(}oX;jg#B!yiL2uu4!m^ zC}DM}`@G`}dDG}T&zce|J;#L(Yl`x~PUgas5TV~pWiI)zExI$@!?Mo7=*Q{aD!Z7& z{Q#R<&??Z`z`9XX$zFj9E|5| zX%&4h(MOCLLW5d9wvgM8a`5r*!DcB$x+CW&adgqrpJna9al@wfGWCj@O_5cEz872v z4{Ns~Uw3CcpA#5!XO`ni9~@3ei;dH2 zhoYziU(3*O-KM(s%_)jbX)HAn!ondc$+PQtdv!^2SAzVVGjqgR7;PREp z)#v_7@U+d{pmXDlXKi^@n#Po4gz;`-F`q{#QmRr2c$UDc)ssvUt$N|mS@+u(I`n>1 zJSzc>oml1H%3xpq%E_R0)x6xFixjr>FmZl?#eX`?;%Fj8n7;`ls1Pp&1Y@v;>YWWg z!nB8w-G5&vd)-tN0wE{3D&*5A`ltLlRXJ>VQ=e8mrDM||+CE{GvOBfgn&E|_S+YC3 zSfp+}1kuE=&{=O+B;18mCXzGIDQ3q++h>4JsTsDU5-VY?cH!dq&F}N1!Z1l8s0uL5 zw*BuZ%zOW{^;4+)`M;>2TA7>wPbkcs`loI&6 zR2-|gcx~sF(oZ%cPtR6YD8<;gy`RwY=BjKsgsEdZVtcP5DgrK=QWs0fk#yqv-b~#} z0-!V5GjVKyKGZB4o<#TYevzR(b!#YLqC?41h{_>w7-Rb)aP#=pMSd&0>AKg8bd*;^ zE}NxG=X2!qAQQkwh!=>X4ZStp5D>UaYrKw50*BKG{9I>6L6`lz!&3yUgs$EL)FYLX z8$gwt9yR@)+!rM3Xgb)UYsg%k>N~D=hAjY_Ho3o#Dmk@OW)J^I95=|5o$Hv}uU`#|b8SHf+AmmvA=b%Kybhg=YjAfLNjFQF0I zx-J8!EPkqCP6dlrAPjhNV9(Mddnve%_aP{}kQ-%6hd2PoFXZe5pZS|M?68k*&VvLz zPA-w$c|6+j185Kw;)l+DLj2u5P)Oa;nXv}71WT7}Q7^E>dvQecg)67hqj-3FX zx%B{3yfkzn%e7%>MlfTzT(3&9YA=W4BP+<6m?abz65j&E5DJ>sH_hGUF3te3ieGwST=Sk zhl+9e;9WrR(awNR&qf$$0O9@s>sinU#U7=12W z#K*dozbU-zce<6{`a;x$0xT2n{YVJj8IbPMyqGU8;sfRt(C`O-2>t0_8jU)_WK#iO zRevEf<=x_Rmm)kC?+HT>fLmI6%EgYG`ac#Kk<{%~j(EvM#tdQ!S~`Na^MZ18lswDh zXNY%1aGw=HG(Da0E(4o_R+Tf0*cG`rRTwBg#k|*(;GqB|Q)nU`m~O9Ap8lDxjU!B& z=uB79PfnD@o{W2R(K4>?h3fk68L`wB11aN$8#u&4s|T8v*{^bD&k|^zLE_)he3!#L zwC{wkAO?65X-L<3o;Y)uj23EIgFG3XF z#6f9~heYfYA@lgrHhCS=voM8D(<2!9P67y}cxLaV;W>K+lu!?Uh5H*RbEcplfwhkF z2MsqOF?*PU{w+MwCWR|v8AAYg5lyhoyS|lzd006h8t|0w6!dx4K&+ennK9dC8mQQJ zh9bJtPr_a9d~pWWLcfd3>sr02o6!0EiLp*3@TL9c=xruQGwI7zt(Y4tcdg=8rTjQ& z`T>I}qL6)1Y_Op8Y8PNMJ!@@E_oNCoi{+)tHX?$n5;lgZh~wg#PduJxjygTU5J0I%8QA=n48Dde>1 zgeDg#BHr71QMW&2^VekLk%6#VHw^aoeCeV1h+p$iigXwuSXwkTplj0nNRwi?fypJ?^2L7o&y zlS8F5-Boee)mE<&p{t0ZRL%bZ&2=_53Ah}h_I**!uvd#v#35b@jVOfRUxH6W-5U{^ zadFSQ^a(|n%X$A%vh~#uFrTExuxbdIf4cj!;R=V73S1)M$MFwhY>FD`?0&o0_eaQ zJnaRT<-C@t@#0XPCsDilmIxCd3_^8v?iYea^}lZ`@f15v2rnMkKv?7FhU^78t*xS&%Oi6EHOwnT z(BjvTQ9Ef0!4F|*&=@c%iK3no)tV|QsfZ5t>7DDrX0A#>1fGpBCYHbvxiKL@4~0yu zCSne!8}z5mUtM4FV6R7_)-uRr-1Y8e%GPVEZg|)Om8S;69 zyRDgFgvG_kosJeeuHcL6>+&r0Xlp+q7L=&R^Mh!AkU2f8JkXv^Tgs*c4s-w(TYq-r{S|b_bAdf0c`F128;BoRnY2}$NbWFnPSJ5M=4|~lO z`-MvDg5*vgADDeKurL2wJ~}&dhRp&#rcF9)bQ?wp9aQtVgoo>&uCnoL!pMct5T2)Y zb+?w8pohzCiUw_qdQ^`eEOK`Z=qEs&IWUWc=Dbzng9V5yXtgio$5QkoOdI{iIi*F(A>>SltFa1GDIZ$NRBx2gym z0|>jgTmhF!(V>TZz{mUbj3rJPT@Z0D>*m^)W&sN^9=)@(&~H+v5$et3F(&zAasmzhQ91PJw|>`5H6)!R59TpHLlL0W)()O25Ax1!L2E*c<3JKlmz z+Q~FZqs1D<=K>RgA~H~leeNmKTu}#;20|hh1(;8{d`WZwyP!`ch~g#4 z2i##0jCPven%Z%b97hw3l9-Et#;er~KN}aA2I4D>pltshSX8i|xkL2veN1`jkIqe^7~LF5_)$EGoVxAfiXNT4* zK9;K+lVPrT-?HTJgtcq1&Cc|HT%u%Q$70qGRT%w%7ma2@`FA974*@$9kgL z7cTW`AZu?PE0x@T{k8k>vT14TV`R?UKcgB!4TC3eQXEq}$xGkFt!x}E+?p|Fi{!n|ho#*DJ9ujpM- zec_X@O~_}tfxR*LktuN=>;6Ih=}>G%wqC$8<7m?PPdzN!B;w6HgRRcL9l zhuiYlh-m5n)051#{jT}i*%X!`5Tb3-8Myq!G8^z*zrNZKRoLN&8i%=7_=sW5>oYI3 zdp$$^HB3&Jj+`D2R_ZQqVMNL1K9G@2GAR!~|Nh_mEFfA%q4z^`(hU3WUqgO_;vz?{ zFIH_C((kpaAml-j`4zpuqGqeWV_SDB49f~kYr1slNtf_@gmq&ljBt?bBI3{!xY}Vd zTpLeYL6>)~E786P87Dh}T7JXTPoKCmm#1L8o`5+8S631h5L!W5$h$MM(GMS%8){}F%b_hub650y)&b2y??F0W zNEpb?Vx`=bIFSTp*dOKP96W7Fj+N~!nn?2(;AueRW?z=Oa|8dnv_u+0Quo-NH-|l6 z9d_GNn2dF?r);(s58g02yoAOK|G>{Ebc?*JH^9?|1m-~{k~0<(^xiy zzw=(+v*S&6(l>%x&G9YQ6b6p?uPz_ep@_7x6Qf95KCjujNSXqqoPmh%Zrp5^f9gHok_;RTs0a zx>sBrNG=}hc8^KEfNZk8IriD*-^VmWHD87KvW7hkKRdzhc}#bVxyx5%lO230O4DZe zE5r=J&V&?*f}d8)6SXw%oD+x+ce_V>l*A+_y9eS;NuR%sX{pNL4Vij^Jxhc@*`nK7 z)xTT0{%>XEgon;>3o<_s=7d5y?iU=dN4jJ-eJP6Q(VQ<6Cj9!Ty5od3SN75)anTat z(fv^MSv*HS2;+NqDgQihux)wSLmj-ZhS8XfrbzR2hE?e^`3hzleOx@pI4+HqnJ-I` zUyQYl5G5Wf4Tft4`Qc)wZ`EH_Sj|PqY#F#rz!!DdH-`4(VD9rjdK=-88&-}`SMwG{ zJ4%<3)eZXO_

D`l^O_g`XP*^2~I=y=g->cna}HCw*le~QVM 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 '0'); + VCnt <= (others => '0'); + HSync_t1 <= '0'; + Overlay_B1_VCnt <= false; + Overlay_B1 <= false; + elsif Clk'event and Clk = '1' then + HSync_t1 <= HSync; + HStart := (HSync_t1 = '0') and (HSync = '1'); + + if HStart then + HCnt <= (others => '0'); + else + HCnt <= HCnt + "1"; + end if; + + if (VSync = '0') then + VCnt <= (others => '0'); + elsif HStart then + VCnt <= VCnt + "1"; + end if; + + if HStart then + if (Vcnt >= x"C4") then + Overlay_B1_VCnt <= true; + else + Overlay_B1_VCnt <= false; + end if; + end if; + + if (HCnt <= x"0") and Overlay_B1_VCnt then + Overlay_B1 <= true; + elsif (HCnt >= x"228") then + Overlay_B1 <= false; + end if; + end if; + end process; + + p_video_out_comb : process(Video, Overlay_B1) + begin + if (Video = '0') then + VideoRGB <= "000"; + else + if Overlay_B1 then + VideoRGB <= "001"; + else + VideoRGB <= "111"; + end if; + end if; + end process; + + O_VIDEO_R <= VideoRGB(2) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_G <= VideoRGB(1) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_B <= VideoRGB(0) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_HSYNC <= HSync; + O_VSYNC <= VSync; + + +end; \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/D280ZZZAP_memory.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/D280ZZZAP_memory.sv new file mode 100644 index 00000000..fd2ac6a0 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/D280ZZZAP_memory.sv @@ -0,0 +1,104 @@ +module D280ZZZAP_memory( +input Clock, +input RW_n, +input [15:0]Addr, +input [15:0]Ram_Addr, +output [7:0]Ram_out, +input [7:0]Ram_in, +output [7:0]Rom_out +); + +wire [7:0]rom_data_0; +wire [7:0]rom_data_1; +wire [7:0]rom_data_2; +wire [7:0]rom_data_3; +wire [7:0]rom_data_4; +wire [7:0]rom_data_5; + + +sprom #( + .init_file("./roms/zzzap_h.hex"), + .widthad_a(10), + .width_a(8)) +u_rom_h ( + .clock(Clock), + .Address(Addr[9:0]), + .q(rom_data_0) + ); + +sprom #( + .init_file("./roms/zzzap_g.hex"), + .widthad_a(10), + .width_a(8)) +u_rom_g ( + .clock(Clock), + .Address(Addr[9:0]), + .q(rom_data_1) + ); + +sprom #( + .init_file("./roms/zzzap_f.hex"), + .widthad_a(10), + .width_a(8)) +u_rom_f ( + .clock(Clock), + .Address(Addr[9:0]), + .q(rom_data_2) + ); + +sprom #( + .init_file("./roms/zzzap_e.hex"), + .widthad_a(10), + .width_a(8)) +u_rom_e ( + .clock(Clock), + .Address(Addr[9:0]), + .q(rom_data_3) + ); + +sprom #( + .init_file("./roms/zzzap_d.hex"), + .widthad_a(10), + .width_a(8)) +u_rom_d ( + .clock(Clock), + .Address(Addr[9:0]), + .q(rom_data_4) + ); + +sprom #( + .init_file("./roms/zzzap_c.hex"), + .widthad_a(10), + .width_a(8)) +u_rom_c ( + .clock(Clock), + .Address(Addr[9:0]), + .q(rom_data_5) + ); + +always @(Addr, rom_data_0, rom_data_1, rom_data_2, rom_data_3, rom_data_4, rom_data_5) begin + Rom_out = 8'b00000000; + case (Addr[15:10]) + 6'b000000 : Rom_out = rom_data_0; //0 + 6'b000001 : Rom_out = rom_data_1; //0400 + 6'b000010 : Rom_out = rom_data_2; //0800 + 6'b000011 : Rom_out = rom_data_3; //0c00 + 6'b000100 : Rom_out = rom_data_4; //1000 + 6'b000101 : Rom_out = rom_data_5; //1400 + + default : Rom_out = 8'b00000000; + endcase +end + +spram #( + .addr_width_g(13), + .data_width_g(8)) +u_ram0( + .address(Ram_Addr[12:0]), + .clken(1'b1), + .clock(Clock), + .data(Ram_in), + .wren(~RW_n), + .q(Ram_out) + ); +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/D280ZZZAP_mist.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/D280ZZZAP_mist.sv new file mode 100644 index 00000000..da613e03 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/D280ZZZAP_mist.sv @@ -0,0 +1,228 @@ +module D280ZZZAP_mist( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "280ZZZAP;;", + "O34,Scanlines,Off,25%,50%,75%;", + "O5,Overlay, On, Off;", + "T6,Reset;", + "V,v0.00.",`BUILD_DATE +}; + +assign LED = 1; +assign AUDIO_R = AUDIO_L; + + +wire clk_core, clk_sys; +wire pll_locked; +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_core), + .c1(clk_sys) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0,joystick_1; +wire scandoublerD; +wire ypbpr; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; +wire [7:0] audio; +wire hsync,vsync; +wire hs, vs; +wire r,g,b; + +wire [15:0]RAB; +wire [15:0]AD; +wire [7:0]RDB; +wire [7:0]RWD; +wire [7:0]IB; +wire [5:0]SoundCtrl3; +wire [5:0]SoundCtrl5; +wire Rst_n_s; +wire RWE_n; +wire Video; +wire HSync; +wire VSync; +/* +Dip Switch:E3 +1 2 3 4 5 6 7 8 Function Option +Coinage +On On 1 Coin/1 Credit* +Off On 1 Coin/2 Credits +On Off 2 Coins/1 Credit +Off Off 2 Coins/3 Credits +Game Time + Off On Test Mode +When Extended Time At not set to None + Off Off 60 seconds + 30 extended + On On 80 seconds + 40 extended* + On Off 99 seconds + 50 extended +When Extended Time At set to None + Off Off 60 seconds + On On 80 seconds* + On Off 99 seconds +Extended Time At + Off On 2.00 + On On 2.50* + Off Off None + On Off None +Language + On On English* + On Off French + Off On German + Off Off Spanish +*/ + +invaderst invaderst( + .Rst_n(~(status[0] | status[6] | buttons[1])), + .Clk(clk_core), + .ENA(), + .Coin(btn_coin), + .Sel1Player(~btn_one_player), + .Sel2Player(~btn_two_players), + .Fire(~m_fire), + .MoveLeft(~m_left), + .MoveRight(~m_right), + .DIP("00000000"), + .RDB(RDB), + .IB(IB), + .RWD(RWD), + .RAB(RAB), + .AD(AD), + .SoundCtrl3(SoundCtrl3), + .SoundCtrl5(SoundCtrl5), + .Rst_n_s(Rst_n_s), + .RWE_n(RWE_n), + .Video(Video), + .HSync(HSync), + .VSync(VSync) + ); + +D280ZZZAP_memory D280ZZZAP_memory ( + .Clock(clk_core), + .RW_n(RWE_n), + .Addr(AD), + .Ram_Addr(RAB), + .Ram_out(RDB), + .Ram_in(RWD), + .Rom_out(IB) + ); + +invaders_audio invaders_audio ( + .Clk(clk_core), + .S1(SoundCtrl3), + .S2(SoundCtrl5), + .Aud(audio) + ); + +D280ZZZAP_Overlay D280ZZZAP_Overlay ( + .Video(Video), + .Overlay(~status[5]), + .CLK(clk_core), + .Rst_n_s(Rst_n_s), + .HSync(HSync), + .VSync(VSync), + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs) + ); + +mist_video #(.COLOR_DEPTH(3)) mist_video( + .clk_sys(clk_sys), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r,r}), + .G({g,g,g}), + .B({b,b,b}), + .HSync(hs), + .VSync(vs), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .scandoubler_disable(scandoublerD), + .scanlines(status[4:3]), + .ce_divider(0), + .ypbpr(ypbpr) + ); + +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac dac ( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +wire m_left = btn_left | joystick_0[1] | joystick_1[1]; +wire m_right = btn_right | joystick_0[0] | joystick_1[0]; +wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_left = 0; +reg btn_right = 0; +reg btn_fire1 = 0; +reg btn_coin = 0; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h6B: btn_left <= key_pressed; // left + 'h74: btn_right <= key_pressed; // right + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h29: btn_fire1 <= key_pressed; // Space + endcase + end +end + +endmodule diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T8080se.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T8080se.vhd new file mode 100644 index 00000000..65b92d54 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T8080se.vhd @@ -0,0 +1,194 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80_ALU.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80_ALU.vhd new file mode 100644 index 00000000..e09def1e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80_ALU.vhd @@ -0,0 +1,361 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80_MCode.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80_Pack.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80_Reg.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/T80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/invaders.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/invaders.vhd new file mode 100644 index 00000000..ce639856 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/invaders.vhd @@ -0,0 +1,245 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaderst is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire : in std_logic; + MoveLeft : in std_logic; + MoveRight : in std_logic; + DIP : in std_logic_vector(8 downto 1); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0); + SoundCtrl5 : out std_logic_vector(5 downto 0); + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic + ); +end invaderst; + +architecture rtl of invaderst is + + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(6 downto 2); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; +begin + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; + + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; + if WD_Cnt = 255 then + Rst_n_s_i <= '0'; + end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then + WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then + if Sounds(0) = '1' and Old_S0 = '0' then + WD_Cnt <= WD_Cnt + 1; + end if; + if PortWr(6) = '1' then + WD_Cnt <= (others => '0'); + end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: entity work.mw8080 + port map( + Rst_n => Rst_n,--Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + Video => Video, + HSync => HSync, + VSync => VSync); + + with AD_i(9 downto 8) select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + S when others; +--IN0 + GDB0(0) <= '0'; -- PEDAL + GDB0(1) <= '0'; -- PEDAL + GDB0(2) <= '0'; -- PEDAL + GDB0(3) <= '1'; -- PEDAL + GDB0(4) <= not Fire; -- fire + GDB0(5) <= '1'; -- UNUSED + GDB0(6) <= not Coin; -- coin + GDB0(7) <= not Sel1Player; -- start +--IN1 + GDB1(0) <= '0'; -- steering wheel + GDB1(1) <= '0'; -- steering wheel + GDB1(2) <= '0'; -- steering wheel + GDB1(3) <= '0'; -- steering wheel + GDB1(4) <= '0'; -- steering wheel + GDB1(5) <= '0'; -- steering wheel + GDB1(6) <= '0'; -- steering wheel + GDB1(7) <= '1'; -- steering wheel +--IN2 + GDB2(0) <= '0';--Coinage + GDB2(1) <= '0';--Coinage + GDB2(2) <= '1';--Game_Time + GDB2(3) <= '1';--Game_Time + GDB2(4) <= '1';--Extended Time At + GDB2(5) <= '1';--Extended Time At + GDB2(6) <= '0';--Language + GDB2(7) <= '0';--Language + + + + PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; + PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; + PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; + PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; + PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + OldSample := '0'; + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0); + end if; + if PortWr(4) = '1' and OldSample = '0' then + D5(15 downto 8) <= DB; + D5(7 downto 0) <= D5(15 downto 8); + end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0); + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/invaders_audio.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/mw8080.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/mw8080.vhd new file mode 100644 index 00000000..1d9ad578 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/mw8080.vhd @@ -0,0 +1,335 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n, Rd_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/pll.qip b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/pll.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/pll.vhd new file mode 100644 index 00000000..f8d0b139 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/pll.vhd @@ -0,0 +1,382 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + sub_wire2 <= sub_wire0(1); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + c1 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 20, + clk1_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire4, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "20.000000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "ps" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "20" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "20.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK1 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "20" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_c.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_c.hex new file mode 100644 index 00000000..11797d04 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_c.hex @@ -0,0 +1,65 @@ +:10000000821491141F139B14AA14BE145F13D014EE +:10001000931228142F143614051511151F152C15BD +:10002000D013D013870000000C313630404BCD0C7C +:10003000313230404BCD0D3830404BCD0A5A454916 +:100040005440505241454D49C50647414E474041F5 +:100050005546404C4F40534348414C5445CE0647CB +:10006000414E474041554640484940534348414C22 +:100070005445CE0947454C444045494E57455246A4 +:1000800045CE094B4E4F50464044525545434B4593 +:10009000CE0B535049454C454E44C5025A45495430 +:1000A0003A080350554E4B5445BA03484F45434810 +:1000B0005354454050554E4B545A41484CBA034C4A +:1000C00045545A54454050554E4B545A41484CBAE9 +:1000D0000247524154554C494552453F0253494508 +:1000E00040484142454E4045494E45CE044E455656 +:1000F000454E4052454B4F5244404155464745536B +:1001000054454C4CD40A3102414E4641454E474578 +:10011000D209320253504F52544641485245D209F7 +:10012000330252454E4E4641485245D206340247AC +:1001300052414E444050524958404641485245D29F +:100140000752414E47464F4C474540314042495384 +:100150004035BA97151D163C130516AC15CF158FF3 +:1001600016A316C7151F1389156E167E165F13E9A1 +:1001700015931228142F1436142E164116491656AC +:10018000165F165F16000000000254454D50533AAA +:100190000B53434F5245BA0654454D5053405355A7 +:1001A00050504C454D454E54414952C50350415362 +:1001B00053455A404C41405052454D4945524540A7 +:1001C000564954455353C50C5445524D494EC503E9 +:1001D00050415353455A404C41405345434F4E4480 +:1001E0004540564954455353C502425241564F3F2C +:1001F00002564F5553404156455A405245414C498D +:1002000053454055CE044E4F5556454155405245F5 +:10021000434F52444044454050495354C508564FFB +:100220005452454043415445474F524945BA0752FD +:10023000455052454E455A40554E45404C45434F1A +:10024000CE0C414D41544555D20A50524F4645536C +:1002500053494F4E45CC0C4348414D50494FCE0970 +:100260005355504552404348414D50494FCE03539A +:10027000434F5245404140424154545245BA0353C2 +:10028000434F524540505245434544454E54BA06AB +:10029000494E54524F4455495345524031404652BD +:1002A000414EC307504F555353455A404C45404269 +:1002B0004F55544FCEFC167617F4165F170D1728BE +:1002C00017DC17EC1740171F13EB16CE17BE175F7E +:1002D000135017931228142F14361483179717AB43 +:1002E00017BD17CD17CD1700000000025449454D2A +:1002F000504F3A060350554E54454FBA085449459D +:100300004D504F40455854454E444944CF03434116 +:100310004D4249454C4F4041404D454E4F5340564C +:10032000454C4F43494441C40443414D4249454C27 +:100330004F40414D41534056454C4F43494441C4C1 +:10034000084A5545474F405445524D494E4144CFC8 +:100350000946454C494349544143494F4E45D3050D +:100360004849434953544540554E404E5545564FD4 +:10037000405245434FD20A54554050554E54454F74 +:100380004045D3064C4C45564153404C41404445B2 +:100390004C414E544552C107564140454E4053458D +:1003A00047554E444F404C554741D2074C4C414E67 +:1003B0005441534043414C49454E5445D3060353A1 +:1003C0004547554E444F405055455354CF06035072 +:1003D00052494D4552405055455354CF08504F4E09 +:1003E0004741404C41404D4F4E4544C10841474173 +:1003F00043484140454C40424F544FCEFFFFFFFF22 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_d.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_d.hex new file mode 100644 index 00000000..c9b37f45 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_d.hex @@ -0,0 +1,65 @@ +:10000000DB02070707E6065F1600195E2356C93AAA +:100010004A20A7F8213620467E23BECA3710AE7884 +:10002000FA2B10BED22F1035C33010BED227103499 +:100030003A3920324A20C9237EA7C22710473A23E3 +:10004000204F07814F217C1009113620CD8810E602 +:1000500007CA6F10CD8810E67FD640121313CD88E3 +:1000600010A6121323CD8810A62386C6FC12C9122F +:100070001313CD8810E63FC620C3621003030003AC +:100080000300030102030003E5C521092006087EE1 +:10009000070707AE17172109207E1777237E1777EA +:1000A000237E1777237E177705C29010C1E1C921FF +:1000B0004421363511E710014000CDC91023EB066D +:1000C00008CDDF0AEB2B013EFF1AD5160407075FA8 +:1000D000E603A8F2D7103C862377157BC2CD10D15A +:1000E000130DC2C910C9D525555515151504511143 +:1000F00011044411041041041041010104040404DA +:10010000040101004010040100401001001004002F +:1001100040040010010010004001001000400100E8 +:10012000010004001000407F7974706B676460FE0A +:10013000EEA699655555545145111111044104100D +:100140004041004040100400400400100010001026 +:100150000001000004000004000000400000001046 +:1001600000000000400000000001000000818FA29C +:10017000ADB5BBC0C4C8CBCED0D3D5D7D9DBDCDEC0 +:10018000DFE1E2E3E4E6E7E8E9EAEBECEDEDEEEFF0 +:10019000F0F1F1F2F3F4F4F5F6F6F7F7F8F9F9FA0D +:1001A000FAFBFBFCFCFDFDFEFEFFFFFFFFFF010174 +:1001B0000101010101010101010202020202020228 +:1001C0000202020202020202030303030303030307 +:1001D00003040404040404040505050505060606D5 +:1001E0000606070707070808080909090A0A0A0B8B +:1001F0000B0C0C0C0D0D0E0E0F1010111112131311 +:10020000141516161718191A1B1C1D1E1F20212342 +:10021000242527282A2B2D2F30323436383A3C3EDD +:10022000414346484B4E5154575A5C616468000143 +:10023000131E262C313335393B3D3F414243444D5B +:1002400012F0135115B316C83AC83AC93ACA3AB8A7 +:1002500012DB133C138113C612E012FD12091315B1 +:10026000131F13351343134F135F1370139312812E +:10027000129412A6129C13A713B713C413D013D051 +:1002800013074D4158404355525645403136304092 +:100290004D5048C0074D4158404355525645403196 +:1002A0003230404D50C8074D415840435552564595 +:1002B00040403830404D50C80A455854454E44459A +:1002C000444054494DC5045348494654404745416C +:1002D0005240494E544F404C4F574053504545C4EF +:1002E00002534849465440544F40484947484046C5 +:1002F0004F52404D41584053434F5245BF0A494E1B +:100300005345525440434F49CE0A505553484042FA +:100310005554544FCE0C47414D45404F5645D2059C +:100320005B3B5C3B5D3B5E3B5F3C5B3C5C3C5D3C0C +:100330005E3C5F3DDB0254494D453A090353434F50 +:100340005245BA03484947484053434F5245BA03C0 +:1003500050524556494F55534053434F5245BA08A2 +:1003600044415453554E40323830405A5A5A41D085 +:1003700008434F4E47524154554C4154494F4E53F8 +:10038000BF03594F5540484156454053455440419D +:10039000404E4557405245434F5244BF0A310252E6 +:1003A0004F414440484FC708320246454E444552EB +:1003B0004042454E4445D2093302484F54405748C5 +:1003C00045454CD30A340250524F4052414345D226 +:1003D0000A35024348414D50494FCE06594F5552B8 +:1003E00040524154494E47403140544F4035BA0085 +:1003F00000003C144015A214EC1449145E1473144C +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_e.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_e.hex new file mode 100644 index 00000000..305e1499 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_e.hex @@ -0,0 +1,65 @@ +:10000000B60D3E033223203A4420324220F781CD00 +:10001000F10F2123207EFE01C03A3D20FE01D8349D +:10002000C9CD88103A4520E680C02130207EA7C87F +:1000300035310024AF3222202A3D202229201132DE +:10004000200628121305C2430C67DB020FE6066F79 +:1000500011D70F197E324220237E3244203E0032D7 +:100060002D203E20D302CD980E3E013223203EFFAC +:100070003241203EF8324820DB00E610CA810CF7FE +:1000800065EF04210B04224D203EE03254203EFF58 +:10009000322220EFE8CD800B2140217E23B6CAB06A +:1000A0000C3A3E21A7CAB00CCD330F0400C3B50CE7 +:1000B000CD330F00002122207EEE05C2C70C3A404E +:1000C00020A7C2C70C36017EEE02CA590E21482075 +:1000D0007EA7FAEE0C36F82A322023223220213E67 +:1000E000207EC6012777D2EB0C2B34CDDF0FCD77E6 +:1000F0000D3A3720CD87080F0F0F0FE603C610CD3E +:10010000480F3A452047E60F57074F07814F78E6DB +:10011000103A3E21CA390DFE28D2270DF7650E0090 +:100120003E20D302C34F0D79074F7AF610D3023E1B +:1001300001325A20F760C34F0DFE28DA430DF766EF +:10014000C3450DF7607AF620D3023E02325A207979 +:10015000323F213A4620CD600D2F323A20C3950C14 +:100160003A46202FC681FE81DA710DFEC0D03EC016 +:10017000C9FE40D83E3FC93A3E21470F0F0FE61F48 +:100180002F3C80214221BEC8DA8F0D34C3900D353B +:100190007E0F0F0FE61FC6A55F16397EE6074F06D6 +:1001A0000021950A097E2FEB0E1F11FF04772373A0 +:1001B0000915C2AD0DC93100243E04322220CD4BB9 +:1001C0000E322320CDF10FCD440F092A2B20EB2A2C +:1001D0003D207DBBDAEF0DC2DF0D7ABCD2EF0D22E0 +:1001E0002B20CD5700CD5A0F6FCD5A0F84EFFFCD86 +:1001F0005700CD5A0F623A34204F06FF582A32205A +:100200007CA7FA0A0E091CC3000E3A3520A77BC250 +:10021000130E3CC694CD5E0FEFFFEFFFCDB30E3E45 +:100220000A323120CD4B0E3A3020A7CA350ECD44CC +:100230000F08C3390ECD440F07EFFFCD440F0EEF6B +:10024000FF21312035C2240EC31C0ECD330F020016 +:100250003E02322D20AFD302C9310024CD330F032B +:100260003CCDC40321352034CD280FAFD302CD338C +:100270000F020ACD280FCD330F0A50CD280FCD988D +:100280000E3A2320FE013EFFCA8D0E3E78324020FA +:100290003E05322220C3950CCDDE0ECD5A0F4BCD3C +:1002A000F10FCDDF0F3E013222203A2320EE03C0B2 +:1002B000F781C9CDDE0ECD5A0F43F76CF78DCDDF38 +:1002C0000F212B2011B93CCDE50F21292011993E9A +:1002D000CDE50F3E033222203E50323F21C9AF32DE +:1002E0002220CD5F0101FF1411803ACD6501215A12 +:1002F000200EEAAF77230DC2F40E3E01325A2021C0 +:10030000622022272021D0202225202180002200C7 +:1003100020CD5A0F2AC9E37E23E3323F20CD800B44 +:100320003A3F20A7C21D0FC9CD800B3A2E20A7C28D +:10033000280FC9E34E234623E3212E207EA7C07059 +:1003400079D305C9E37E23E3CD910F77F501000A48 +:10035000114025CD6501F1C35E0FE37E23E3E50780 +:10036000F5070707E60E4F060021C50F095E235665 +:10037000F1E63ECA8F0FD54F213F12CD0010EB0999 +:100380005E2356EBD17ECD81037E23A7F2850FE15C +:10039000C9C5F5070707E6074F0600215B2009F1ED +:1003A000C1BEC0E1C9504F573F5A41503F57414D20 +:1003B0003F42414D3F5A4F524B42414E47424F4FB1 +:1003C0004D5A4F4E4B00244038C03AA03C803E016D +:1003D00001010202010203804001019950603021B5 +:1003E0003D2011D93ACD66033E3ECD810323C3742F +:1003F00003214712CD0010214220C36603A700004D +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_f.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_f.hex new file mode 100644 index 00000000..a5046190 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_f.hex @@ -0,0 +1,65 @@ +:10000000FF2A0020092200207CA7CA22083A2220C9 +:10001000EE05CA1A0821222034C97C2F6F2600223F +:1000200000207DCD8708FE287C8F324021C3310817 +:10003000F1214520DB007723DB0177CD4E08213FFE +:1000400020CD490823CD4908237EA7C835C9212ED4 +:10005000207EA7C835C03A2D20D305C9A7F5CD8786 +:10006000085F216D11197E4759212E121986F27BE6 +:10007000085AFEEEDA81081CC381085F21AE11190F +:100080005EF17BF02F3CC9A7F02FC93A2220A7F8D8 +:100090000FD02A272011460019CDC909CDC9092A38 +:1000A000252011460019CD5C0ACD5C0A2A272011B3 +:1000B0003C0019CDC909CDC9092A2520113C0019D8 +:1000C000CD5C0ACD5C0A2A2720EB2A252022272096 +:1000D000EB2225202260203E05D304AFD3033A0350 +:1000E00020CD0D092103207EC62077D2E108C92A40 +:1000F00060207CB5C83E05D304AFD3032103207E26 +:10010000E61F77CD0D092103207EC620774F06001C +:10011000214521094E3A022081A7F22B09FEEED299 +:10012000260968C331092E01C331094F21AE1109D7 +:100130006E603A3720A7F23F09AF956F789C67EB66 +:100140002A0020192204203A03204F214522097E4B +:10015000320820577E2106200FE67F5F0FE61F77CB +:10016000230F0FE6074F3C777A50835FD52A042090 +:1001700019E5097CE1CD8D09D1AF935F3E009A5717 +:10018000AF914F3E0098472A042009197CA7C2BCB2 +:1001900009EB2A60203A072077233A062077237B51 +:1001A000D303E60777233A0820D303DB037723AF93 +:1001B000D303DB03C6247723226020C92A602036BC +:1001C0000011050019226020C97EA7CA610A2346D2 +:1001D00023235E235623E5EB111F007223721905BA +:1001E000C2DB09E1C97EA7CA610A237E23235E23FD +:1001F0005623EB70093DC2F309EBC97EA7CA610A19 +:100200004F2346237E235E235623E5EBD304AFD34F +:100210000357E55921940A197ED303DB034FAFD36B +:10022000031E1FE17EB17723DB03B6771905C224D5 +:100230000AE1C97EA7CA610A2346237ED304AFD34D +:10024000033E01D303DB034F235E235623E5EB116B +:1002500020007EB1771905C2520AE1C97EA7C266A5 +:100260000A11050019C94F2346237E235E23562316 +:10027000E5D5D304AFD303575921940A197ED3038C +:10028000DB034FAFD303DB031E1FE1712377190597 +:10029000C28B0AE1C90103070F1F3F7FFFCDAA0AE6 +:1002A000CDE80A21DA06E3C33108214B2035F2BA42 +:1002B0000AEB2A4D200609CDDF0A2154203A4C20B2 +:1002C0008677234FE6077723790F0F0FE61FC6A027 +:1002D00077233629214F2035F0EB2A522006057E60 +:1002E00023121305C2DF0AC92A56207CB5C82A5832 +:1002F000207CB5CA080B012605111B007872233D2E +:10030000C2FD0A190DC2FC0A2A4D207CB5C2180B89 +:100310003E01322220C3520B2A50204E2346235E38 +:10032000235623E52A5620192258203A5520D30473 +:10033000AFD303D1C5E51A13D303DB0377230DC273 +:10034000360BAFD303DB0377012000E109C105C2FF +:10035000340B2A2520113C0019CDFB09CDFB09C91E +:100360007F0100FF310520CD6201310024CDAF10A7 +:1003700021FFFF220920220B20CDB30EFBC31F0E4D +:10038000D3072121207EA7CAB80BAF77473E0A3298 +:100390002E203E22D305DB0207E6064F21CF0F09B0 +:1003A0005E2356212F20347EBBC2B80B70237E8281 +:1003B000773A2320A7CA2A0CCD0F103A2320A7CAC8 +:1003C000210C2141207EA7C2120C363C213420355D +:1003D0002142207EC6992777C20F0C3A2320EE03D4 +:1003E000CAB60DDB020F0F0FE6064F0600211D00F7 +:1003F000094E213E207EE6F02B860F0F0F0FB9DA53 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_g.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_g.hex new file mode 100644 index 00000000..10f77477 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_g.hex @@ -0,0 +1,65 @@ +:1000000008112000711905C20404E76DFF190405E9 +:100010003E042B000527050F043B002704139D0514 +:100020002204271D06220436FE3504033E04300454 +:1000300003B40439047F0000000327052B040326C2 +:100040000000800100800700E00F00BC1F00E61BDD +:1000500000671B007F0F03EE81073CC00F10FC1FE1 +:1000600010C00F20400F40E00F80F00F80C10F80C4 +:10007000C10700030300830700FE3F00FE7F00E08E +:10008000EF0080CF0080CF0080CF0080CF0080DFE6 +:1000900000C0DF00C01F00E01F00F00E00700E0067 +:1000A000380E00381C00303800707000606000604E +:1000B0006000787803252000800100800700E00FB1 +:1000C00000BC1900F61900FF1F03EF8F07EEC10FE8 +:1000D0003CFC1F10C00F20400F40E00F80F00F804D +:1000E000C10F80C10700030300830700FE0F00FE5D +:1000F0000F00E00F00800F00800F00800F00800FC6 +:1001000000801F00801F00801F00801F00800F00E4 +:1001100080070080070080070080030000030000C4 +:100120000300000300C003032600008001008007D5 +:1001300000E00D00F81D009E1F009F1B00FF0F0335 +:10014000F681073CC00F10FC1F10C00F20400F406D +:10015000E00F80F00F80C10F80C107000303008310 +:100160000700FE0F00FE1F00E03F00806F00806F61 +:1001700000806F00806F00803F00801F00801F00A4 +:10018000C01F00C01F00C00700E00300E01900E02E +:100190001C006038006070006060007878041FDF29 +:1001A0000000003000000078000000FC0000C0FFEC +:1001B000013303FC003303F400CC00FE00CC00FF4D +:1001C000003303FC0033037C00CC003000CC00F88B +:1001D00000FFFFFF1F00F0FF3F0000FF700000FC6A +:1001E000E00000FCC00000F8810000F8810000F889 +:1001F000810000FC030000FC030000DE0300008E11 +:1002000003000007070080030E008001FC0080014E +:10021000F8008001800080018000E00180041FDF81 +:10022000009F0F3000930D7800830DFC0083CDFFFD +:10023000019B0DFC00930DF4009F0FFE000000FCDD +:10024000000020F80000807C00000030000000F872 +:1002500000FFFFFF1F33E3FF3F3303FF70CC00FCC1 +:10026000E0CC00FCC03303F8813303F881CC00F804 +:1002700081CC00FC030000FC030000DE0300008EC4 +:1002800003000007070080030E008001FC008001CE +:10029000F8008001800080018000E00180E0E5DB63 +:1002A0000047DB00A8E640C2BE0678212020AE70E1 +:1002B000E640CABE0678E640C2BE062336012124C7 +:1002C000207EA9C2DA067E21D206E5A7C28B08C32A +:1002D000E0062124207E3CE60177E1D1C1F1FBC993 +:1002E0003A2220A7FA9D0AC80FD231082A2720CD2A +:1002F000C909CDC909CDC909CDC909CDC909CDC91A +:1003000009012000CDE509CDE509CDE509CDE509D7 +:10031000CDE509CDE5092A2520CDFB09CDFB09CD89 +:10032000FB09CDFB09CDFB09CDFB09CD330ACD334C +:100330000ACD330ACD330ACD330ACD330ACDEF08C7 +:100340003A3E2121432135F26D073603213E217EBD +:1003500023BECA6D07DA6607FE04D26107AFC36B1E +:1003600007D604C36B075F3A5A20832B775F1600CA +:100370002A47207CA7CA7C07192247202A49207CCB +:10038000A7CA880719224920EB29292929EB2A3BEA +:100390002019223B207C2FE61FC6403203204A163C +:1003A000003A3720CD5C08F5783202203A2220EE60 +:1003B00003CA30083A3E21A7CA30083A372047CD51 +:1003C00087080F0F0FE6062F3CC60BB9D2E8072FA0 +:1003D0003C813C0FE6034F324121F17842A7F20104 +:1003E00008792F3C4FC3FF07AF324121790FE60751 +:1003F00081793A3A20CD5C0842D1824FF201080659 +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_h.hex b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_h.hex new file mode 100644 index 00000000..c013d6e0 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/roms/zzzap_h.hex @@ -0,0 +1,65 @@ +:100000000000AFD305C36400F5C5D50E00C39E063E +:10001000F5C5D50E01C39E06E3D5C5F5E92530200B +:10002000E1F1C1D1E1C93500C3160F05B4041404D0 +:10003000E37E23E3CD910F77DF215E207E23B6E6BA +:100040001FCA5D0001FF1DCD6201215E207ECD5ED5 +:100050000F237ECD5E0FE701FF1DC3620101001D6E +:10006000CD6201E7DB02E60CFE04C2610B06011162 +:100070000000210020D307707EA8CA8C004F7DE6C7 +:100080000179C28A00B257C38C00B35F237CFE4063 +:10009000C27500D3072B7CFE1FCAC9007EA8CAB058 +:1000A000004F7DE60179C2AE00B257C3B000B35F26 +:1000B000782F77AECA93004F7DE60179C2C400B2B3 +:1000C00057C3C600B35FC39300D307237CFE40CA67 +:1000D000EC00782FAECAE7004F7DE60179C2E5005B +:1000E000B257C3E700B35FAF77C3C900780747D201 +:1000F00072007AB3CA1B01EBF9110020060021003F +:1001000000390E10AF29DA0A012F12133E1812130C +:100110000DC2040105C2FE00C35401310024210CAC +:1001200028E5210000115901010004AF86D30723FF +:100130000DC22C0105C22C01A7CA46011AE3EBC56A +:10014000CD8103C1EBE3137CFE18C22801E17DFEE3 +:100150000CCA0000D307C354014847464544430135 +:1001600000E011004021000039EBF3F9EB7841C5C4 +:10017000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C53DB7 +:10018000C26F01F9FBC93C7E6666666666667E3CA8 +:10019000181C1818181818183C3C3C7E66607C3EE9 +:1001A00006067E7E3C7E6660387860667E3C6666CB +:1001B00066667E7E606060603E3E06063E7E6066ED +:1001C0007E3C3C3E06063E7E66667E3C7E7E6070E1 +:1001D0003038181C0C0C3C7E66663C7E66667E3CA5 +:1001E0003C7E66667E7C60607C3C001818000000E7 +:1001F00000181800FFFFFFFFFFFF7777FFFF7F7FEB +:100200007F7F7FFF7777FFFF1F7F1FDF1FFF7777DE +:10021000FFFF000000000000000018181818181850 +:10022000181800001818000000000000000000006E +:10023000183C7E6666667E7E66663E7E66663E7EAE +:1002400066667E3E3C7E6606060606667E3C3E7E12 +:100250006666666666667E3E7E7E06063E3E0606EE +:100260007E7E7E7E06063E3E060606063C7E6606D0 +:10027000067676667E3C666666667E7E6666666640 +:100280003C3C1818181818183C3C606060606060AE +:1002900060667E3C6666763E1E1E3E766666060696 +:1002A0000606060606067E7EC3C3E7E7FFFFDBC33E +:1002B000C3C366666E6E7E7E767666663C7E6666D6 +:1002C000666666667E3C3E7E66667E3E0606060680 +:1002D0003C7E6666666666667E5C3E7E66667E3EE2 +:1002E000766666663C7E66063E7C60667E3C7E7E0A +:1002F000181818181818181866666666666666660E +:100300007E3C66666666667E3C3C1818C3C3C3DBEB +:10031000FFFFE7E7C3C366667E3C18183C7E66664F +:1003200066667E3C1818181818187E7E6070381C97 +:100330000E067E7E1155555511FF7777F7F7115749 +:10034000515D11FF7777F7F71555515717FF7777FD +:10035000F7F7115D515511FF7777F7F711555155A3 +:1003600011FF7777F7F77EE6F0C275033E40CD8147 +:1003700003C37C037E07070707CD7D037EE60FC618 +:1003800030E67FFE300600D28F034FEB09EBC9E564 +:10039000D5CDB2037CFE3B3E00DA9D032F4FC51A3C +:1003A00013A97701200009C105C29E03D113E1C939 +:1003B0000600D6304F6069292929090901860109FB +:1003C000060AEBC9CD8810E61C4F060021A50F09CF +:1003D0001100280604CDE2037BC6085F2305C2D5C1 +:1003E00003C97EDFCDB003E51A131FDCFA0323A790 +:1003F000C2EA03E12405C2E703E7E5D5C5F501FF3D +:00000001FF diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/spram.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/sprom.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/sprom.vhd new file mode 100644 index 00000000..a81ac959 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/280ZZZAP_MiST/rtl/sprom.vhd @@ -0,0 +1,82 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_aclr_a : STRING; + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/BalloonBomber.qpf b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/BalloonBomber.qpf new file mode 100644 index 00000000..e97e5097 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/BalloonBomber.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 16:15:41 June 05, 2019 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "16:15:41 June 05, 2019" + +# Revisions + +PROJECT_REVISION = "BalloonBomber" diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/BalloonBomber.qsf b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/BalloonBomber.qsf new file mode 100644 index 00000000..37310fc8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/BalloonBomber.qsf @@ -0,0 +1,177 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 02:57:11 June 09, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# BalloonBomber_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name TOP_LEVEL_ENTITY BalloonBomber_mist +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== + set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# --------------------------- +# start ENTITY(OzmaWars_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top + set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top + set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(OzmaWars_mist) +# ------------------------- +set_global_assignment -name SYSTEMVERILOG_FILE rtl/BalloonBomber_mist.sv +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/BalloonBomber_memory.sv +set_global_assignment -name VHDL_FILE rtl/BalloonBomber_Overlay.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name QIP_FILE ../../../../common/mist/mist.qip +set_global_assignment -name VHDL_FILE rtl/roms/tn07.vhd +set_global_assignment -name VHDL_FILE rtl/roms/tn06.vhd +set_global_assignment -name VHDL_FILE "rtl/roms/tn05-1.vhd" +set_global_assignment -name VHDL_FILE rtl/roms/tn04.vhd +set_global_assignment -name VHDL_FILE rtl/roms/tn03.vhd +set_global_assignment -name VHDL_FILE rtl/roms/tn02.vhd +set_global_assignment -name VHDL_FILE rtl/roms/tn01.vhd +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/README Vortex.txt b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/README.txt similarity index 100% rename from Arcade_MiST/Midway-Taito 8080 Hardware/README Vortex.txt rename to Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/README.txt diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/clean.bat b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/clean.bat new file mode 100644 index 00000000..ac9bf0a8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/clean.bat @@ -0,0 +1,16 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +del /s build_id.v +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/BalloonBomber_Overlay.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/BalloonBomber_Overlay.vhd new file mode 100644 index 00000000..ceecfaf1 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/BalloonBomber_Overlay.vhd @@ -0,0 +1,366 @@ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + + + +--Not Cleaned, iam to lazy for this + + +entity BalloonBomber_Overlay is + port( + Video : in std_logic; + Overlay : in std_logic; + CLK : in std_logic; + Rst_n_s : in std_logic; + HSync : in std_logic; + VSync : in std_logic; + CAB : in std_logic_vector(9 downto 0); + O_VIDEO_R : out std_logic; + O_VIDEO_G : out std_logic; + O_VIDEO_B : out std_logic; + O_HSYNC : out std_logic; + O_VSYNC : out std_logic + ); +end BalloonBomber_Overlay; + +architecture rtl of BalloonBomber_Overlay is + + signal HCnt : std_logic_vector(11 downto 0); + signal VCnt : std_logic_vector(11 downto 0); + signal HSync_t1 : std_logic; + signal Overlay_A1 : boolean; + signal Overlay_A1_VCnt : boolean; + signal Overlay_A2 : boolean; + signal Overlay_A3 : boolean; + signal Overlay_A3_VCnt : boolean; + signal Overlay_A4 : boolean; + signal Overlay_A4_VCnt : boolean; + + signal Overlay_R1 : boolean; + signal Overlay_R1_VCnt : boolean; + signal Overlay_R2 : boolean; + signal Overlay_R3 : boolean; + + signal Overlay_Y1 : boolean; + signal Overlay_Y1_VCnt : boolean; + signal Overlay_Y2 : boolean; + signal Overlay_Y3 : boolean; + signal Overlay_Y4 : boolean; + signal Overlay_Y4_VCnt : boolean; + signal Overlay_Y5 : boolean; + signal Overlay_Y5_VCnt : boolean; + + signal Overlay_G1 : boolean; + signal Overlay_G1_VCnt : boolean; + signal Overlay_G2 : boolean; + signal Overlay_G3 : boolean; + signal Overlay_G4 : boolean; + signal Overlay_G4_VCnt : boolean; + + signal Overlay_P1 : boolean; + signal Overlay_P2 : boolean; + signal Overlay_P2_VCnt : boolean; + signal Overlay_P3 : boolean; + signal Overlay_P3_VCnt : boolean; + signal Overlay_P4 : boolean; + signal Overlay_P4_VCnt : boolean; + + signal VideoRGB : std_logic_vector(2 downto 0); + signal COLOR : std_logic_vector(3 downto 0); + +begin + process (Rst_n_s, Clk) + variable cnt : unsigned(3 downto 0); + begin + if Rst_n_s = '0' then + cnt := "0000"; + elsif Clk'event and Clk = '1' then + if cnt = 9 then + cnt := "0000"; + else + cnt := cnt + 1; + end if; + end if; + end process; + + p_overlay : process(Rst_n_s, Clk) + variable HStart : boolean; + begin + if Rst_n_s = '0' then + HCnt <= (others => '0'); + VCnt <= (others => '0'); + HSync_t1 <= '0'; + + Overlay_G1 <= false; + Overlay_G1_VCnt <= false; + Overlay_G2 <= false; + Overlay_G3 <= false; + Overlay_G4 <= false; + Overlay_G4_VCnt <= false; + + Overlay_A1 <= false; + Overlay_A1_VCnt <= false; + Overlay_A2 <= false; + Overlay_A3 <= false; + Overlay_A3_VCnt <= false; + Overlay_A4 <= false; + Overlay_A4_VCnt <= false; + + Overlay_R1 <= false; + Overlay_R1_VCnt <= false; + Overlay_R2 <= false; + Overlay_R3 <= false; + + Overlay_Y1 <= false; + Overlay_Y1_VCnt <= false; + Overlay_Y2 <= false; + Overlay_Y3 <= false; + Overlay_Y4 <= false; + Overlay_Y4_VCnt <= false; + Overlay_Y5 <= false; + Overlay_Y5_VCnt <= false; + + Overlay_P1 <= false; + Overlay_P3 <= false; + Overlay_P3_VCnt <= false; + Overlay_P4 <= false; + Overlay_P4_VCnt <= false; + + elsif Clk'event and Clk = '1' then + HSync_t1 <= HSync; + HStart := (HSync_t1 = '0') and (HSync = '1'); + + if HStart then + HCnt <= (others => '0'); + else + HCnt <= HCnt + "1"; + end if; + + if (VSync = '0') then + VCnt <= (others => '0'); + elsif HStart then + VCnt <= VCnt + "1"; + end if; + + if HStart then + if (Vcnt >= 0) and (Vcnt <= 99) then + Overlay_A1_VCnt <= true; + else + Overlay_A1_VCnt <= false; + end if; + + if (Vcnt >= 100) and (Vcnt <= 149 ) then + Overlay_R1_VCnt <= true; + else + Overlay_R1_VCnt <= false; + end if; + + if (Vcnt >= 150) and (Vcnt <= 240) then + Overlay_Y1_VCnt <= true; + else + Overlay_Y1_VCnt <= false; + end if; + + if (Vcnt >= 236) and (Vcnt <= 16) then + Overlay_G1_VCnt <= true; + else + Overlay_G1_VCnt <= false; + end if; + + if (Vcnt >= 0) and (Vcnt <= 72) then + Overlay_G4_VCnt <= true; + Overlay_Y5_VCnt <= true; + else + Overlay_G4_VCnt <= false; + Overlay_Y5_VCnt <= false; + end if; + + if (Vcnt >= 73) and (Vcnt <= 200) then + Overlay_P3_VCnt <= true; + else + Overlay_P3_VCnt <= false; + end if; + + if (Vcnt >= 224) and (Vcnt <= 230) then + Overlay_P4_VCnt <= true; + else + Overlay_P4_VCnt <= false; + end if; + + if (Vcnt >= 160) and (Vcnt <= 166 ) then + Overlay_A3_VCnt <= true; + else + Overlay_A3_VCnt <= false; + end if; + + if (Vcnt >= 24 ) and (Vcnt <= 230 ) then + Overlay_A4_VCnt <= true; + else + Overlay_A4_VCnt <= false; + end if; + + if (Vcnt >= 32 ) and (Vcnt <= 222 ) then + Overlay_P2_VCnt <= true; + else + Overlay_P2_VCnt <= false; + end if; + end if; + + if (Vcnt >= 42 ) and (Vcnt <= 216 ) then------------------------------------ + Overlay_Y4_VCnt <= true; + else + Overlay_Y4_VCnt <= false; + end if; + + if (HCnt = 518)then--ok + if Overlay_A1_VCnt then Overlay_A1 <= true; end if; + if Overlay_R1_VCnt then Overlay_R1 <= true; end if; + if Overlay_Y1_VCnt then Overlay_Y1 <= true; end if; + elsif (HCnt >= 540) then + if Overlay_A1_VCnt then Overlay_A1 <= false; end if; + if Overlay_R1_VCnt then Overlay_R1 <= false; end if; + if Overlay_Y1_VCnt then Overlay_Y1 <= false; end if; + end if; + + if (HCnt = 528)then--check + if Overlay_G1_VCnt then Overlay_G1 <= true; end if; + elsif (HCnt >= 540) then + if Overlay_G1_VCnt then Overlay_G1 <= false; end if; + end if; + + if (HCnt = 486) then--ok + Overlay_R2 <= true; + elsif (HCnt = 502) then + Overlay_R2 <= false; + end if; + + if (HCnt = 438) then--ok + Overlay_Y2 <= true; + elsif (HCnt = 470) then + Overlay_Y2 <= false; + end if; + + if (HCnt = 373) then--ok + Overlay_G2 <= true; + elsif (HCnt = 445) then + Overlay_G2 <= false; + end if; + + if (HCnt = 324) then--ok + Overlay_P1 <= true; + elsif (HCnt = 380) then + Overlay_P1 <= false; + end if; + + if (HCnt = 275) then--ok + Overlay_A2 <= true; + elsif (HCnt = 327) then + Overlay_A2 <= false; + end if; + + if (HCnt = 210) then--ok + Overlay_Y3 <= true; + elsif (HCnt = 274) then + Overlay_Y3 <= false; + end if; + + if (HCnt = 166) then--ok + Overlay_R3 <= true; + elsif (HCnt = 214) then + Overlay_R3 <= false; + end if; + + if (HCnt = 70) then--ok + Overlay_G3 <= true; + elsif (HCnt = 170) then + Overlay_G3 <= false; + end if; + + if (HCnt = 70) then--check + if Overlay_P4_VCnt then Overlay_P4 <= true; end if; + elsif (HCnt = 86) then + if Overlay_P4_VCnt then Overlay_P4 <= false; end if; + end if; + + if (HCnt = 0) then--ok + if Overlay_Y5_VCnt then Overlay_Y5 <= true; end if; + if Overlay_P3_VCnt then Overlay_P3 <= true; end if; + elsif (HCnt = 70) then + if Overlay_Y5_VCnt then Overlay_Y5 <= false; end if; + if Overlay_P3_VCnt then Overlay_P3 <= false; end if; + end if; + + if (HCnt = 164) then--check + if Overlay_A3_VCnt then Overlay_A3 <= true; end if; + elsif (HCnt = 172) then + if Overlay_A3_VCnt then Overlay_A3 <= false; end if; + end if; + + if (HCnt = 118) then--check + if Overlay_A4_VCnt then Overlay_A4 <= true; end if; + elsif (HCnt = 134) then + if Overlay_A4_VCnt then Overlay_A4 <= false; end if; + end if; + + if (HCnt = 102) then--check + if Overlay_P2_VCnt then Overlay_P2 <= true; end if; + elsif (HCnt = 118) then + if Overlay_P2_VCnt then Overlay_P2 <= false; end if; + end if; + + if (HCnt = 86) then--check + if Overlay_Y4_VCnt then Overlay_Y4 <= true; end if; + elsif (HCnt = 102) then + if Overlay_Y4_VCnt then Overlay_Y4 <= false; end if; + end if; + + if (HCnt = 486) then--ok + if Overlay_G4_VCnt then Overlay_G4 <= true; end if; + elsif (HCnt = 470) then + if Overlay_G4_VCnt then Overlay_G4 <= false; end if; + end if; + + end if; + end process; + + p_video_out_comb : process(Video) + begin + if (Video = '0') then + VideoRGB <= "000"; + elsif Overlay_R1 or Overlay_R2 or (Overlay_R3 and not Overlay_A3) then--Red + VideoRGB <= "100"; + elsif Overlay_A1 or Overlay_A2 or Overlay_A3 or Overlay_A4 then--Aqua + VideoRGB <= "011"; + elsif (Overlay_Y1 and not Overlay_G1) or Overlay_Y2 or Overlay_Y3 or Overlay_Y4 or Overlay_Y5 then--Yellow + VideoRGB <= "110"; + elsif Overlay_G1 or Overlay_G2 or (Overlay_G3 and not (Overlay_P4 or Overlay_A4 or Overlay_P2 or Overlay_Y4))-- or Overlay_G4 + then + VideoRGB <= "010"; + elsif Overlay_P1 or Overlay_P2 or Overlay_P3 or Overlay_P4 then--Purple + VideoRGB <= "101"; +-- elsif not (Overlay_G4) then--white + else + VideoRGB <= "111";-- end if; + end if; + end process; + +--colPROM: entity work.col +--port map( +-- clk => Clk, +-- addr => CAB, --should be Video Counters +-- data => COLOR +--); + O_VIDEO_R <= VideoRGB(2) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_G <= VideoRGB(1) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + O_VIDEO_B <= VideoRGB(0) when (Overlay = '1') else VideoRGB(0) or VideoRGB(1) or VideoRGB(2); + +-- O_VIDEO_R <= COLOR(2); +-- O_VIDEO_G <= COLOR(1); +-- O_VIDEO_B <= COLOR(0); + O_HSYNC <= HSync; + O_VSYNC <= VSync; + + +end; \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/BalloonBomber_memory.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/BalloonBomber_memory.sv new file mode 100644 index 00000000..2dda36ca --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/BalloonBomber_memory.sv @@ -0,0 +1,72 @@ + +module BalloonBomber_memory( +input Clock, +input RW_n, +input [15:0]Addr, +input [15:0]Ram_Addr, +output [7:0]Ram_out, +input [7:0]Ram_in, +output [7:0]Rom_out +); + +wire [7:0]rom_data_0; +wire [7:0]rom_data_1; +wire [7:0]rom_data_2; +wire [7:0]rom_data_3; +wire [7:0]rom_data_4; +wire [10:0]rom_addr = {Addr[11:10],~Addr[9],Addr[8:4],~Addr[3],Addr[2:1],~Addr[0]}; + +tn01 tn01 ( + .clk(Clock), + .addr(rom_addr), + .data(rom_data_0) +); + +tn02 tn02 ( + .clk(Clock), + .addr(rom_addr), + .data(rom_data_1) +); + +tn03 tn03 ( + .clk(Clock), + .addr(rom_addr), + .data(rom_data_2) +); + +tn04 tn04 ( + .clk(Clock), + .addr(rom_addr), + .data(rom_data_3) +); + +tn05_1 tn05_1 ( + .clk(Clock), + .addr(rom_addr), + .data(rom_data_4) +); + +always @(Addr, rom_data_0, rom_data_1, rom_data_2, rom_data_3, rom_data_4) begin + Rom_out = 8'b00000000; + case (Addr[15:11]) + 5'b00000 : Rom_out = rom_data_0; + 5'b00001 : Rom_out = rom_data_1; + 5'b00010 : Rom_out = rom_data_2; + 5'b00011 : Rom_out = rom_data_3; + 5'b01000 : Rom_out = rom_data_4;//0100 0000 0000 0000 + default : Rom_out = 8'b00000000; + endcase +end + +spram #( + .addr_width_g(13), + .data_width_g(8)) +u_ram0( + .address(Ram_Addr[12:0]), + .clken(1'b1), + .clock(Clock), + .data(Ram_in), + .wren(~RW_n), + .q(Ram_out) + ); +endmodule \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/BalloonBomber_mist.sv b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/BalloonBomber_mist.sv new file mode 100644 index 00000000..b596dae0 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/BalloonBomber_mist.sv @@ -0,0 +1,208 @@ +module BalloonBomber_mist( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "BallBomb;;", + "O34,Scanlines,Off,25%,50%,75%;", + "O5,Overlay, On, Off;", + "T6,Reset;", + "V,v1.20.",`BUILD_DATE +}; + +assign LED = 1; +assign AUDIO_R = AUDIO_L; + + +wire clk_sys, clk_core; +wire pll_locked; +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_core), + .c1(clk_sys) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0,joystick_1; +wire scandoublerD; +wire ypbpr; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; +wire [7:0] audio; +wire hs, vs; +wire r,g,b; + + +wire [15:0]RAB; +wire [15:0]AD; +wire [7:0]RDB; +wire [7:0]RWD; +wire [7:0]IB; +wire [5:0]SoundCtrl3; +wire [5:0]SoundCtrl5; +wire Rst_n_s; +wire RWE_n; +wire Video; +wire HSync; +wire VSync; + +invaderst invaderst( + .Rst_n(~(status[0] | status[6] | buttons[1])), + .Clk(clk_core), + .ENA(), + .Coin(btn_coin), + .Sel1Player(~btn_one_player), + .Sel2Player(~btn_two_players), + .Fire(~m_fire), + .MoveLeft(~m_left), + .MoveRight(~m_right), + .MoveUp(~m_up), + .MoveDown(~m_down), + .RDB(RDB), + .IB(IB), + .RWD(RWD), + .RAB(RAB), + .AD(AD), + .SoundCtrl3(SoundCtrl3), + .SoundCtrl5(SoundCtrl5), + .Rst_n_s(Rst_n_s), + .RWE_n(RWE_n), + .Video(Video), + .HSync(HSync), + .VSync(VSync) + ); + +BalloonBomber_memory BalloonBomber_memory ( + .Clock(clk_core), + .RW_n(RWE_n), + .Addr(AD), + .Ram_Addr(RAB), + .Ram_out(RDB), + .Ram_in(RWD), + .Rom_out(IB) + ); + +BalloonBomber_Overlay BalloonBomber_Overlay ( + .Video(Video), + .Overlay(~status[5]), + .CLK(clk_core), + .Rst_n_s(Rst_n_s), + .HSync(HSync), + .VSync(VSync), + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs) + ); + +invaders_audio invaders_audio ( + .Clk(clk_core), + .S1(SoundCtrl3), + .S2(SoundCtrl5), + .Aud(audio) + ); + +mist_video #(.COLOR_DEPTH(3)) mist_video( + .clk_sys(clk_sys), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r,r}), + .G({g,g,g}), + .B({b,b,b}), + .HSync(hs), + .VSync(vs), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .scandoubler_disable(scandoublerD), + .scanlines(status[4:3]), + .ce_divider(0), + .ypbpr(ypbpr) + ); + +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +dac dac ( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +wire m_up = status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_up | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_down | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_left | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_right | joystick_0[0] | joystick_1[0]; +wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; + + +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_left = 0; +reg btn_right = 0; +reg btn_down = 0; +reg btn_up = 0; +reg btn_fire1 = 0; +reg btn_coin = 0; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h75: btn_up <= key_pressed; // up + 'h72: btn_down <= key_pressed; // down + 'h6B: btn_left <= key_pressed; // left + 'h74: btn_right <= key_pressed; // right + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h29: btn_fire1 <= key_pressed; // Space + endcase + end +end + +endmodule diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T8080se.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T8080se.vhd new file mode 100644 index 00000000..65b92d54 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T8080se.vhd @@ -0,0 +1,194 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80_ALU.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80_ALU.vhd new file mode 100644 index 00000000..e09def1e --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80_ALU.vhd @@ -0,0 +1,361 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80_MCode.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80_Pack.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80_Reg.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/T80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/invaders.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/invaders.vhd new file mode 100644 index 00000000..ca17b82c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/invaders.vhd @@ -0,0 +1,281 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaderst is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire : in std_logic; + MoveLeft : in std_logic; + MoveRight : in std_logic; + MoveUp : in std_logic; + MoveDown : in std_logic; + DIP : in std_logic_vector(8 downto 1); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0); + SoundCtrl5 : out std_logic_vector(5 downto 0); + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic + ); +end invaderst; + +architecture rtl of invaderst is + + component mw8080 + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); + end component; + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(6 downto 2); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; + signal GDB_A : unsigned(1 downto 0); +begin + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; + + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; + if WD_Cnt = 255 then + Rst_n_s_i <= '0'; + end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then + WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then + if Sounds(0) = '1' and Old_S0 = '0' then + WD_Cnt <= WD_Cnt + 1; + end if; + if PortWr(6) = '1' then + WD_Cnt <= (others => '0'); + end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: mw8080 + port map( + Rst_n => '1',--Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + Video => Video, + HSync => HSync, + VSync => VSync); + +-- with AD_i(9 downto 8) select +-- GDB <= GDB0 when "00", +-- GDB1 when "01", +-- GDB2 when "10", +-- S when others; + + GDB_A <= not AD_i(9) & AD_i(8); + + with GDB_A select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + S when others; + GDB0(0) <= '0'; + GDB0(1) <= '0'; + GDB0(2) <= '0'; + GDB0(3) <= '0'; + GDB0(4) <= not Fire; + GDB0(5) <= not MoveLeft; + GDB0(6) <= not MoveRight; + GDB0(7) <= '0'; + + GDB1(0) <= Coin; + GDB1(1) <= not Sel2Player; + GDB1(2) <= not Sel1Player; + GDB1(3) <= '1'; + GDB1(4) <= not Fire;--controller + GDB1(5) <= not MoveLeft;--controller + GDB1(6) <= not MoveRight;--controller + GDB1(7) <= '1'; + + GDB2(0) <= '0';--active high + GDB2(1) <= '0';--active high + GDB2(2) <= '0';--active high + GDB2(3) <= '0';--active high + GDB2(4) <= '0';--active high + GDB2(5) <= '0';--active high + GDB2(6) <= '0';--active high + GDB2(7) <= '0';--active high + + PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; + PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; + PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; + PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; + PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + OldSample := '0'; + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0); + end if; + if PortWr(4) = '1' and OldSample = '0' then + D5(15 downto 8) <= DB; + D5(7 downto 0) <= D5(15 downto 8); + end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0); + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/invaders_audio.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/mw8080.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/mw8080.vhd new file mode 100644 index 00000000..b9a88f96 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/mw8080.vhd @@ -0,0 +1,336 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n, Rd_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/pll.qip b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/pll.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/pll.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/pll.vhd new file mode 100644 index 00000000..f8d0b139 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/pll.vhd @@ -0,0 +1,382 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + sub_wire2 <= sub_wire0(1); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + c1 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 20, + clk1_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire4, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "20.000000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "ps" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "20" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "20.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK1 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "20" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/ballbomb.zip b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/ballbomb.zip new file mode 100644 index 0000000000000000000000000000000000000000..02178e7f51e8d17d799287093b2e7ffbc81d32cd GIT binary patch literal 7424 zcmZ{pWl&wqwuLvY0fIXOm*DQYarZz7?(QDk-QAtw!FA&h+#P~D8wjp1=e+mo+>@%i z{&cOX{(5z-Sv^P3Ih16fpfRBU0C+&S)_3vb38VcG2moLO5&%E~0053A2F5lfjONZZ z*2yaJk(exKok*{tWMnkl*`EvyT-u>Vw>PjwV0(;s%X5N8iUys>8%}DP6Fyx+VY8=J zs8#57-c>w-o{V#ZPN1~)$R!obZNq0uWACyH1=a?FI&E)OY9*V{(opH2J)=rR)>TZ$ zI#&1zmHhcOVF&J`U4Y%NIM(U$q1>~_$H!Oe$D-;*PpFxhoAHPWFb5Y%+lD^xh7v+n zetkJH`NT`zk9bDUQiTj3@zt2|Na_`0u&PkpM2YEqMOi6**kxTIbIer^UiO;sIO#?f zh8!#QYF=9e)bh^zD|a)_tdrBw5XKT_vxgE&u!#j2ZdS1ukLtu;DYwo&^NgT{cA5&t z>6vj})`auJ1oHsz^2ASzk?=}MCOWEV=+1jOV&r4mPNBsaD=SZ3Ng3{ExIk*ZH_)SG zL-P;seDbA$I1B&xMjN6cBuKp2@^T=E;&kQfPDk1{A|=}a%wH&{Qq)1*(v%up_SmE$ z!9UJj7F~RuW(+&a<6n4^uve&bG*UMchJ+sBl>Q1A0P=UZ03B%`8iTRa8DW3N>Gv!2 z@4?xYnZ-t3-kJc2nX{a`%preT>1LrzFq7Vx*@VC$EhSc)L1~-FUJYo3SNjkIzg-H4 z5{=fYq{1YGQv`{QE{e$rEUTZ3M1n-YR3Bliu8)@}a1ad)oRhGeNeQ?w|KXn(#C4Ja zW%zM*v%?4MWoNqaH4yCz13o_)5Nu>o?b(;BxzMH*(jA1by-CwiaRJ7B1!$Mg?PmPw z7I|jhPYg3-9@6?LsT_U3`hFE}tA^@@i1xJ+-q3B9*fsw4A~f-n=(f@F>R|nJ-ABJ0 zqvc)PRS|l#4vetw*d_9xjkP({+aM=g7Ni`xU1nWZ>Y1Z2gcq^s!gG=M9j_FQ3vEnO zd1PO+d|tB#<~VowdwKVr(yT8ei?iEfvbirGtFvjFZ0P0FrML=dX)XH;U|Da>*k&{9-o5n;XvM?{f&7?{Ap@;bINVAx`NLaE5Drzc z*w16G46&E`p}@E#967U}s_X;#8y=5acuML0hw$-P6<=T1rnHy*Bmq6^+~Q*PT85!} zo^UC3mhQS|9b{PCuc+hJDYtSJ8wV{0{$dG%YbN+J%%}IlfnbgAx^yMd@)=i zR&f`>-{t+5d;QaRYN@Btv6hxCZFv_PG58C0?&K=tGq+)eo1}yUEQqsVXx?QV=)o0B z5#=y4&%g(U>}8Z!TC|zQT14n0EtnlaJv(-jBwkvbfA`S_3hEprEFBartA+1YOf}-O zGE-G5sbk1c*dB`blq)KgLf|-volaO7EP5avWuDs!_?2y4sIM*`vq3y1J!^ zMb95#q83}17j zLPpJdv?NrleE8;2px%Q7ZLyCsvk>~kJgF6fk^!T!^Ju%Uq6sD^)v(D7howg(5ovFZ z1ITCx&_mLFhHk{J*z1(M*LNJcHi#ynGBk*$^fwfpe@(S4&)piIwTqW4+4Kthi9NQt zAmZ*%(=2RsQ_j57E^?27Kg&zBF!g>S=tn&a;vOp1XimYU#;8z1@I>E=yxCLt1da1~ z`<{2&^CTgA7DRpO5za}7eN zcPYSNv|_4p9dkah04+kejq~GfbAaw9_^V6bApWfJIkl&ILccdTxTbcrqN> z1SHtM6WzjgW+2ptecg}{G^~XRru9bPWcVri0IAmr3_YlYN@Pm&u1f6K8`a%%U1>#0 z$e*`_C2ayYSQbiqASNm06+zx0D=meK{$S7M9sVgGkB`D-!Cp^YvxiBTEG+lN;BJGhT%G%8NLxWclUKr5%wD;JPk84KafVB*sLLIMIkUZL z8@r8?3i&-7m_zecH#O!0(H2Z*JdE}R+9~aO0{9e?DNaSQWCX319=CW%H}ixqi-ehz z0m5HqG|M-Uuy?!t>U)gI(m)4FQf&So4BlEF>wKs^6)kv*2adY610G=1 zcSzfgehW<}%<{)SZG@cbb!L{yRTQ_lVb!c%(`SC9WIRQbi1rtsGr3w_Gai<=ZI@OJ zZZj4^M`z}x66-x;A15%ez_DwgDh|Qja(AqO)DurfUE5V{e$3A#bTNv!$`#XQMHekh zL_7}^$oIt7x(*6J1?4FDmP>69P!=P}6;GziJ^_ z$W9A6%AzeFK`DpFmJ>3m4?yC41a>U%s94EW?H1n|Ql5d3JN$mij?@Bh^dD2njuO+# zFR-ipEssvpR{C|;(b7e?F$GvmW-nOH^I1ID8v{|};jlA!$KlQkrLZ|ZP8L|OxFmtu zehevI)xQZk7o1;*wVf(YUNk02EL<_-*nb8&sJQd2!0=wkhFyC>(#Ns4MKmE8H@|34 zaK+{PEWEzr-6fD7-piSD>0%ZmEdSPVE3_QYPeK`v_a#t{z;hoNHQ`z;KKKxGNB9^S z^_OuNS5LC%d+%qaDZo@E-d~ z#xmPmC6`vjH)(JO`d@pI-&qS^lM!&ky`AhjSbd+17*^(EY=&j96*G8bZBU({bNrrI z-#lj7o!^5Y6_JdQdcjVOBGQ+%e$^(yMx=0qRHV={t~*Bn!+<7Q2OrArjomBP4DX^H zQ+YWOp}hY&(*h&w@|3YJ`v?oUiCcD*bqJbJGJhpT=`03K&>*_xQ@bxxZ>;sJLXa8B zgBy9HDk#>5$|wTTWd3Aq09ngr1?lZhY&pqi8Ni+OaU+M<=eC=bToEWCgU8aq1It{Ni{QLas%Y{PJVRfFd1^hg;OG}|m@ zpC#o&?S&Z%JUZ6*Ew65?VlOE+m%+?pZpSvY`^cDpqw6oztUk5+ZAdU}V{rGnqmRuc zH{bL-i_`c+m2&XVgM$S&4>!YGX0J++%0=E+_AWDO58>C96&HRw7Pbt<&Gp9;`br3< z(SE7YcWKgZB!FoXdA0kuG<1*(F0=i+)L@fWbFjuZ!0P^$J*g0K=_B}*&=TAQW(*p~ zrV1jjsQeL4$5nPbrKMg~)uj9?5{7^^)4=8&ZGq2G49V`&Q1+%qC#8$>Zt@j;0Aa+ex%yxy9l zG7GF(U(cI?&>tc%7pa|{esX#BVLkTE3E%$VsQf4@2&*v zFT!)I(FNuyJY%?#j-1;x^}ERjC;h5nMp?#f_G`|0KNjJ^6jjcKf-11Y^tu#Pf~gE3 z5biMgr@@;JUNrt2HJ-7bvkeu+qh6S$@1SZFty&*hdOSfi3j;4n+(LA!E-6-WdcPEr z3luc{gQ>|7->g`WLD><%rXjEDn|m9b8M)i=@Fq1i2bU&_IzJ6y@HHVuTUVIyIz> zaM<}_?HmI?+9lCFmu$6L+=0jftg5|y3*e*H4|l9FU_DjDKO3aLCZu!0KcVrdozzm) zM3F0AP<9m&qiD>jr^gRSjF%BH+C-qgn}y?YR4s>_E=OFN@Bn|qyE%(cY^B8mmXw|w(VEq77w#E10Bt=Z)`f-?t{fwL7#GJ z*;NaIRnaIb)t4>v_KqB>{0L3Q3gA8=E*NDEKrY6M-A+HzjDNA z8xbDDoHBIg9_9sEpB5m=I`2qvp#%*K)DC}TTF#9u7H#vJntAKnO6;a3xj@0(JbO<{ zf6u^&<92wmMzZ=WkrpHTaO_;kKV&!d4q-3l>a!(u6glYYdPE5K5XzRiP22rlV@w48 zL({ZD6ew=-i%;deJH{cw)au1J5oT+-`gMPLd=Rx}j%?gShd{=KsMBsdKY{#3IXChk z0mzo}P^7FYLBAQ}*)i1lBe6;x*27$;A6^(eWE!SK?btn@*|SqX*7)iox6yH!T`BC+ z7W07sv~!wbq=2+*qEmv~mAPSeGN^OS4&7DUjeguSnz;5vVg~Ln zq;8YCa_l!w4NG%EMTLTOMX@cYhbR+$dwGJ>0v?0YEQGGW1Lcl)+-!&KU3M;+IjbwG z5U$)HC;qZo>7{l%d@TtXqP?E)LzIRiqx1r>Da)(J#=tNMELz@D=u4bly~se`w_P)Z z<4i&d%vGSq{QEPk6i0zJHI$D8HPbCIju`#6pc#EDLx^Kwjq-y;4bO)=oletjBj4i1 z<4UG_%1P8cK+DN0tJuJ=c^DsUK``Ut5)IV8U=0BfOkCh)QRpA4<&?pR*j#thbV`fc zF0Ke@$1&)(DJ(Tmb*Q|O%Y5-9cmbU5#OFUuSpx#oE2z!(n2MZWROvZ_@niC^JG}W; zvgRc1xzg!++R_zQqR_9iU>SHw-i7;GouJ<~%u&ZzG?J!Q!7#K+%AT_;fOKc?;j>gG zY3+jmf}$V{es5?dQrHWdurGamn%2~+$$$>bz$zo>8uSh?@ zKB)f|6|xNTsl(r`#{cMFv7g0n$zm7~4&}D5ub(^HPL!;!GoL$fPwUUjn3NKuM?{lS zlF>zYs@nw|%Ci-XZX8AirJ&vPdQL}<geZPd#$`iRg2Fq$JUw3fh9x#+BLe^U{ zkCtSh(z7b4!sed8C3-vj~#I)ANx*g5E%Ma|>(}#nskj z>1eo;R@hI%Sdd=u}jksJY23q(h;YW=!1_$qt35_4XTulQN7I0_Z{U|$S9Z_HH&1mRPvJQV% zRW9zeZ8i47Mmm)~t3B0gk{OZm^Kz%jfM4FiMirZ%JwGJ6j;HO)tnNSG?hu+qd~Ricuh3!an_v4+i*bK$NW9i(_yXv#1&XFsc8j`=idu~*Odo8kxkgeMic?7)rt;^+NVOwTHZ8z&%cNnnF? zEuP4QvGLLx-9hGyj*iDjY`cT;M>M3$9jDju4=4!QKew@VQj45-j8X2kC&oN8BN~fb zy0Y%>PayG!n3P>L4qp7Jurg&(U+XA(hC8*0klc(^8NkHmH>H&vfRGQn8ZCB1MCu~_&1NB){ndl7UMWd(1_-G5Zxmq}lAZ~pHj{B_Iv-O1%( zU|Cn|w!##_eBB>9W8Cl%is~8YT(xGG_*g()q9w8h42Pyis>A-+Aa{V}uiJ=_)+;2; z9$bYcOOU>15Ee&PH0?JS4P6(d5ior3ddFyKz)q!g-^s-X9{2inHa4+pfc!Jd-vJUd z9IVV3`SsIxqEh{{WFL(>RA%`v-CnKD_kTaG^Nfb0 zV5Bg43$q!I9@zgVEf`&~cSDQ)NncL(gYln%U2~%vgRm@d_s{&>cHj z)|pm^Mp%QE(yE|)YU0}k6Za&blolw#esB}Q@X*k6wj6djcrH>?R?}3|{ggfc<5w}^ zS77uI(7^3@ZRFPvqK+z?H|M}t&K;H=daT2*R8UYj-`UHkMCFaKm}gscxXKsvGmkJe zYH_G^D6nr~K^CtkI}aMGNj?+g4=5_3r*pGuIci94si?1H_wKn11{C?w@mmMY5TQq-2Y(9$qv}1@TlPI)xZIiH^)2*rk~=Js93TkL+jEIM^sXnM^q17iN_{-|?T! zbsuC@edo9hsk%tT)SYnraxuV9h5fF|B9}F`y4Iv*4^eh`Lq(_XHl`Rk$;LEYZfCP6 zrWw9uleHN;<*;wsLxPq`@834DH>cQnll-BpEjiJP?WH{1AdE}0%FaK*aeDRN5r7+4eFScx{=H~G zW$gy*zZc~?8>xE-AVr4iS#cx;cQg27p~)b2d1bF>CZW?wn*mwL>I2x?v$IY?cLbYU zt7pw!zc&g2DFpT3&9lEg005Bs75V=){)d(J7YG3ScN^!g>HquG{PyDhGIjnW{%q9! z|9k-84eoD(^-to@`t2VAALVa??N8!QasG#}!~C0I|C9JLiTy)(;QUSePHBHKf5!J8 zCISC%hVxJ2&*1$-9Q-fAr6ddUR}TGstAGcj|Net~1ONawKuu9a1*o8=Ev=*k6lW0Q L=HTF#;O71xv=XH& literal 0 HcmV?d00001 diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn01 b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn01 new file mode 100644 index 0000000000000000000000000000000000000000..44a8c6ac8e6d6beeff710e1fbe830b5681128890 GIT binary patch literal 2048 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 literal 0 HcmV?d00001 diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn02.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn02.vhd new file mode 100644 index 00000000..85fd82b9 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn02.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity tn02 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of tn02 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AF",X"BE",X"C2",X"0B",X"08",X"78",X"FE",X"3E",X"D2",X"69",X"08",X"78",X"FE",X"3C",X"DA",X"25", + X"08",X"2A",X"09",X"20",X"01",X"1E",X"02",X"CD",X"8C",X"08",X"21",X"05",X"20",X"36",X"00",X"21", + X"BF",X"20",X"36",X"00",X"C9",X"2A",X"07",X"20",X"EB",X"2A",X"09",X"20",X"01",X"1E",X"02",X"C3", + X"D5",X"01",X"36",X"FF",X"21",X"05",X"21",X"CD",X"A0",X"08",X"EB",X"2E",X"06",X"CD",X"52",X"1A", + X"E5",X"C1",X"0A",X"6F",X"03",X"0A",X"67",X"CD",X"D2",X"01",X"C3",X"25",X"08",X"36",X"FF",X"21", + X"09",X"21",X"CD",X"A0",X"08",X"EB",X"2E",X"0A",X"C3",X"3D",X"08",X"36",X"FF",X"21",X"0D",X"21", + X"CD",X"A0",X"08",X"EB",X"2E",X"0E",X"C3",X"3D",X"08",X"36",X"FF",X"21",X"11",X"21",X"CD",X"A0", + X"08",X"EB",X"2E",X"12",X"C3",X"3D",X"08",X"21",X"06",X"20",X"34",X"7E",X"E6",X"01",X"C2",X"85", + X"08",X"21",X"72",X"40",X"C9",X"21",X"36",X"40",X"C9",X"01",X"20",X"03",X"AF",X"C5",X"E5",X"77", + X"23",X"05",X"C2",X"8F",X"08",X"E1",X"01",X"20",X"00",X"09",X"C1",X"0D",X"C2",X"8D",X"08",X"C9", + X"7E",X"21",X"1D",X"41",X"3D",X"C8",X"11",X"60",X"00",X"19",X"C3",X"A4",X"08",X"AF",X"7C",X"1F", + X"57",X"7D",X"1F",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F",X"5F",X"7A",X"E6",X"0F",X"07",X"07",X"07", + X"07",X"B3",X"C9",X"11",X"DD",X"43",X"06",X"02",X"C3",X"AD",X"0E",X"11",X"DD",X"43",X"06",X"02", + X"C3",X"9A",X"19",X"CD",X"38",X"14",X"CD",X"53",X"14",X"CD",X"40",X"10",X"CD",X"42",X"09",X"CD", + X"F8",X"08",X"CD",X"65",X"09",X"3A",X"E4",X"20",X"A7",X"CA",X"22",X"05",X"CD",X"89",X"1A",X"CD", + X"13",X"09",X"CD",X"35",X"1B",X"C3",X"22",X"05",X"21",X"1F",X"20",X"7E",X"A7",X"C8",X"46",X"36", + X"00",X"21",X"24",X"20",X"7E",X"0F",X"D0",X"36",X"00",X"2A",X"22",X"20",X"EB",X"21",X"38",X"20", + X"C3",X"0D",X"0A",X"CD",X"52",X"1A",X"2E",X"24",X"7E",X"FE",X"03",X"D8",X"21",X"BF",X"20",X"AF", + X"BE",X"C0",X"34",X"21",X"35",X"09",X"C3",X"7B",X"1A",X"00",X"00",X"07",X"07",X"01",X"00",X"01", + X"00",X"06",X"06",X"01",X"00",X"00",X"00",X"04",X"04",X"01",X"00",X"00",X"02",X"00",X"01",X"01", + X"01",X"00",X"3A",X"E4",X"20",X"A7",X"C8",X"21",X"38",X"20",X"7E",X"FE",X"FF",X"CA",X"60",X"09", + X"0F",X"D2",X"59",X"09",X"3E",X"10",X"C3",X"0E",X"02",X"23",X"23",X"23",X"23",X"C3",X"4A",X"09", + X"3E",X"10",X"C3",X"17",X"02",X"21",X"04",X"20",X"34",X"7E",X"E6",X"03",X"77",X"A7",X"CA",X"28", + X"19",X"FE",X"01",X"CA",X"38",X"19",X"FE",X"02",X"CA",X"66",X"19",X"FE",X"03",X"CA",X"85",X"19", + X"C9",X"21",X"38",X"20",X"CD",X"21",X"0A",X"21",X"3C",X"20",X"CD",X"21",X"0A",X"11",X"9D",X"20", + X"CD",X"DF",X"09",X"CD",X"07",X"13",X"CD",X"6A",X"0A",X"C3",X"D9",X"09",X"21",X"40",X"20",X"CD", + X"21",X"0A",X"21",X"44",X"20",X"CD",X"21",X"0A",X"11",X"9E",X"20",X"CD",X"DF",X"09",X"2E",X"0C", + X"CD",X"52",X"1A",X"CD",X"6A",X"0A",X"CD",X"D9",X"09",X"C3",X"15",X"15",X"21",X"48",X"20",X"CD", + X"21",X"0A",X"21",X"4C",X"20",X"CD",X"21",X"0A",X"11",X"9F",X"20",X"CD",X"DF",X"09",X"2E",X"14", + X"CD",X"52",X"1A",X"CD",X"6A",X"0A",X"C3",X"D9",X"09",X"21",X"9C",X"20",X"36",X"00",X"C9",X"21", + X"9B",X"20",X"7E",X"A7",X"CA",X"EB",X"09",X"23",X"36",X"00",X"C9",X"EB",X"34",X"7E",X"FE",X"02", + X"D2",X"F8",X"09",X"EB",X"23",X"36",X"FF",X"C9",X"36",X"00",X"EB",X"23",X"36",X"00",X"C9",X"57", + X"3A",X"9C",X"20",X"A7",X"7A",X"C2",X"0A",X"0A",X"37",X"C9",X"37",X"3F",X"C9",X"78",X"3D",X"CA", + X"19",X"0A",X"23",X"23",X"23",X"23",X"C3",X"0E",X"0A",X"36",X"01",X"23",X"23",X"73",X"23",X"72", + X"C9",X"7E",X"0F",X"D0",X"23",X"23",X"E5",X"CD",X"6C",X"11",X"CD",X"5B",X"0A",X"E1",X"E5",X"CD", + X"6C",X"11",X"7D",X"FE",X"18",X"DA",X"48",X"0A",X"01",X"F9",X"FF",X"09",X"EB",X"E1",X"73",X"23", + X"72",X"EB",X"11",X"DA",X"43",X"C3",X"CF",X"0E",X"E1",X"E5",X"CD",X"6C",X"11",X"22",X"B7",X"20", + X"E1",X"2B",X"AF",X"77",X"2B",X"77",X"21",X"B5",X"20",X"34",X"C9",X"11",X"DA",X"43",X"C3",X"AB", + X"0E",X"7C",X"B5",X"37",X"C8",X"7B",X"95",X"7A",X"9C",X"C9",X"E5",X"7E",X"47",X"07",X"D2",X"8A", + X"0A",X"23",X"23",X"CD",X"15",X"0B",X"78",X"0F",X"0F",X"7A",X"D2",X"DA",X"0A",X"FE",X"4B",X"DA", + X"A1",X"0A",X"36",X"25",X"E1",X"E5",X"3E",X"DF",X"A6",X"77",X"21",X"37",X"20",X"34",X"E1",X"23", + X"23",X"23",X"23",X"3A",X"37",X"20",X"FE",X"02",X"DA",X"6A",X"0A",X"21",X"37",X"20",X"36",X"00", + X"C9",X"FE",X"3C",X"D2",X"CC",X"0A",X"78",X"0F",X"E1",X"E5",X"23",X"7E",X"23",X"4E",X"23",X"46", + X"2B",X"2B",X"DA",X"2F",X"0B",X"CD",X"FF",X"09",X"D2",X"BF",X"0A",X"3D",X"CA",X"23",X"0B",X"77", + X"CD",X"A1",X"08",X"EB",X"60",X"69",X"CD",X"D2",X"01",X"C3",X"8A",X"0A",X"E1",X"E5",X"CD",X"03", + X"0B",X"E1",X"E5",X"7E",X"0F",X"0F",X"0F",X"C3",X"8A",X"0A",X"2B",X"2B",X"2B",X"FE",X"25",X"DA", + X"EE",X"0A",X"FE",X"3C",X"DA",X"FB",X"0A",X"7E",X"0F",X"0F",X"0F",X"C3",X"8A",X"0A",X"CD",X"08", + X"0B",X"E1",X"E5",X"23",X"23",X"23",X"36",X"48",X"C3",X"8A",X"0A",X"46",X"3E",X"DF",X"A6",X"77", + X"C3",X"A6",X"0A",X"7E",X"07",X"07",X"07",X"D8",X"3E",X"20",X"B6",X"77",X"23",X"23",X"5E",X"23", + X"56",X"EB",X"C3",X"89",X"08",X"E5",X"5E",X"23",X"56",X"2A",X"28",X"21",X"19",X"EB",X"E1",X"73", + X"23",X"72",X"C9",X"36",X"01",X"2B",X"3E",X"01",X"B6",X"77",X"3E",X"01",X"C3",X"C0",X"0A",X"CD", + X"FF",X"09",X"D2",X"BF",X"0A",X"3C",X"FE",X"08",X"DA",X"BF",X"0A",X"36",X"07",X"2B",X"3E",X"FE", + X"A6",X"77",X"3E",X"07",X"C3",X"C0",X"0A",X"CD",X"56",X"0B",X"CD",X"AB",X"0B",X"CD",X"D6",X"0B", + X"CD",X"40",X"15",X"C3",X"27",X"16",X"AF",X"21",X"B5",X"20",X"BE",X"C8",X"23",X"34",X"7E",X"FE", + X"01",X"CA",X"01",X"0C",X"FE",X"04",X"CA",X"07",X"0C",X"FE",X"07",X"D8",X"11",X"3C",X"44",X"CD", + X"0A",X"0C",X"CD",X"E0",X"15",X"21",X"B8",X"20",X"D2",X"81",X"0B",X"CD",X"9B",X"0B",X"C3",X"84", + X"0B",X"CD",X"8B",X"0B",X"21",X"00",X"00",X"22",X"B5",X"20",X"C9",X"AF",X"3A",X"34",X"20",X"BE", + X"D8",X"7E",X"21",X"7D",X"20",X"BE",X"D8",X"77",X"C3",X"0D",X"16",X"AF",X"3A",X"34",X"20",X"BE", + X"D0",X"7E",X"21",X"7F",X"20",X"BE",X"D0",X"77",X"C3",X"ED",X"15",X"AF",X"21",X"1D",X"20",X"BE", + X"C8",X"23",X"34",X"7E",X"FE",X"01",X"CA",X"16",X"0C",X"FE",X"04",X"CA",X"1C",X"0C",X"FE",X"07", + X"D8",X"2A",X"22",X"20",X"CD",X"76",X"03",X"01",X"10",X"02",X"CD",X"8C",X"08",X"21",X"00",X"00", + X"22",X"1D",X"20",X"C3",X"7D",X"15",X"AF",X"21",X"27",X"20",X"BE",X"C8",X"23",X"34",X"7E",X"FE", + X"01",X"CA",X"2B",X"0C",X"FE",X"04",X"CA",X"47",X"0C",X"FE",X"07",X"D8",X"2A",X"2D",X"20",X"01", + X"10",X"02",X"CD",X"8C",X"08",X"21",X"00",X"00",X"22",X"27",X"20",X"CD",X"6F",X"1A",X"C3",X"7D", + X"15",X"11",X"0C",X"44",X"C3",X"0A",X"0C",X"11",X"24",X"44",X"2A",X"B7",X"20",X"CD",X"76",X"03", + X"01",X"0C",X"02",X"C3",X"D5",X"01",X"11",X"54",X"44",X"C3",X"1F",X"0C",X"11",X"74",X"44",X"2A", + X"22",X"20",X"CD",X"76",X"03",X"01",X"10",X"02",X"C3",X"D5",X"01",X"2A",X"29",X"20",X"11",X"DA", + X"43",X"CD",X"AD",X"0E",X"2A",X"29",X"20",X"CD",X"76",X"03",X"22",X"2D",X"20",X"11",X"94",X"44", + X"01",X"10",X"02",X"CD",X"D5",X"01",X"C9",X"2A",X"2D",X"20",X"11",X"B4",X"44",X"C3",X"40",X"0C", + X"3A",X"E4",X"20",X"A7",X"C8",X"3A",X"DB",X"20",X"0F",X"DB",X"01",X"D0",X"DB",X"02",X"C9",X"21", + X"2F",X"20",X"AF",X"BE",X"C8",X"23",X"BE",X"C2",X"6E",X"0C",X"34",X"CD",X"E4",X"0C",X"3A",X"E4", + X"20",X"A7",X"C2",X"9D",X"0C",X"2A",X"E2",X"20",X"3A",X"E1",X"20",X"3C",X"32",X"E1",X"20",X"E6", + X"0F",X"C2",X"8B",X"0C",X"7D",X"FE",X"13",X"CC",X"9A",X"0C",X"23",X"22",X"E2",X"20",X"7E",X"0F", + X"DA",X"06",X"0D",X"0F",X"DA",X"23",X"0D",X"C3",X"A9",X"0C",X"2E",X"00",X"C9",X"CD",X"50",X"0C", + X"07",X"07",X"DA",X"06",X"0D",X"07",X"DA",X"23",X"0D",X"06",X"00",X"21",X"32",X"20",X"70",X"CD", + X"E4",X"0C",X"21",X"31",X"20",X"CD",X"A1",X"0D",X"2A",X"33",X"20",X"11",X"BE",X"43",X"01",X"02", + X"0E",X"CD",X"71",X"03",X"C5",X"E5",X"1A",X"A6",X"CA",X"D0",X"0C",X"3E",X"01",X"32",X"35",X"20", + X"1A",X"AE",X"77",X"23",X"13",X"0D",X"C2",X"C6",X"0C",X"E1",X"01",X"20",X"00",X"09",X"C1",X"05", + X"C2",X"C4",X"0C",X"C9",X"2A",X"33",X"20",X"11",X"BE",X"43",X"01",X"02",X"0E",X"CD",X"71",X"03", + X"C5",X"E5",X"1A",X"AE",X"77",X"23",X"13",X"0D",X"C2",X"F2",X"0C",X"E1",X"01",X"20",X"00",X"09", + X"C1",X"05",X"C2",X"F0",X"0C",X"C9",X"3A",X"34",X"20",X"FE",X"DA",X"D2",X"A9",X"0C",X"2A",X"33", + X"20",X"01",X"F8",X"0F",X"09",X"CD",X"76",X"03",X"7E",X"FE",X"7F",X"C2",X"A9",X"0C",X"06",X"02", + X"C3",X"AB",X"0C",X"3A",X"34",X"20",X"FE",X"38",X"DA",X"A9",X"0C",X"2A",X"33",X"20",X"01",X"F8", + X"FC",X"09",X"CD",X"76",X"03",X"7E",X"FE",X"7F",X"C2",X"A9",X"0C",X"06",X"FE",X"C3",X"AB",X"0C", + X"23",X"23",X"5E",X"23",X"7E",X"C6",X"02",X"57",X"EB",X"CD",X"AD",X"08",X"57",X"7D",X"E6",X"1F", + X"07",X"07",X"07",X"5F",X"EB",X"C9",X"21",X"54",X"20",X"AF",X"BE",X"C8",X"23",X"BE",X"C2",X"73", + X"0D",X"34",X"23",X"BE",X"21",X"00",X"FD",X"22",X"58",X"20",X"21",X"C8",X"D0",X"C4",X"1A",X"0E", + X"22",X"5A",X"20",X"3A",X"56",X"20",X"A7",X"21",X"5B",X"20",X"7E",X"C2",X"AD",X"0D",X"FE",X"28", + X"DA",X"C9",X"0D",X"21",X"57",X"20",X"34",X"E6",X"01",X"21",X"AE",X"40",X"CC",X"C1",X"0D",X"22", + X"5C",X"20",X"21",X"5A",X"20",X"CD",X"F0",X"0D",X"CD",X"02",X"0E",X"CD",X"24",X"0E",X"21",X"58", + X"20",X"4E",X"23",X"46",X"23",X"79",X"86",X"77",X"23",X"78",X"86",X"77",X"C9",X"FE",X"D0",X"D2", + X"C9",X"0D",X"21",X"57",X"20",X"34",X"E6",X"01",X"21",X"36",X"40",X"CC",X"C5",X"0D",X"C3",X"8F", + X"0D",X"21",X"E5",X"40",X"C9",X"21",X"72",X"40",X"C9",X"2A",X"5A",X"20",X"01",X"1B",X"02",X"CD", + X"76",X"03",X"CD",X"8C",X"08",X"06",X"0C",X"21",X"54",X"46",X"11",X"54",X"20",X"CD",X"8B",X"03", + X"21",X"13",X"20",X"34",X"7E",X"E6",X"01",X"21",X"56",X"20",X"36",X"01",X"C0",X"36",X"00",X"C9", + X"E5",X"23",X"23",X"5E",X"23",X"56",X"23",X"4E",X"23",X"46",X"E1",X"D5",X"5E",X"23",X"56",X"EB", + X"D1",X"C9",X"CD",X"76",X"03",X"C5",X"E5",X"1A",X"77",X"23",X"13",X"0D",X"C2",X"07",X"0E",X"E1", + X"01",X"20",X"00",X"09",X"C1",X"05",X"C2",X"05",X"0E",X"C9",X"21",X"00",X"03",X"22",X"58",X"20", + X"21",X"C8",X"28",X"C9",X"3A",X"56",X"20",X"A7",X"C2",X"A1",X"0E",X"CD",X"35",X"0E",X"D6",X"0A", + X"B8",X"DA",X"3D",X"0E",X"C9",X"2A",X"34",X"20",X"44",X"3A",X"0A",X"20",X"C9",X"21",X"B0",X"20", + X"AF",X"BE",X"CA",X"47",X"0E",X"35",X"C9",X"E5",X"CD",X"4B",X"1A",X"23",X"7E",X"FE",X"04",X"06", + X"50",X"D2",X"56",X"0E",X"06",X"60",X"E1",X"70",X"FE",X"0B",X"D2",X"7A",X"0E",X"FE",X"09",X"CD", + X"52",X"1A",X"2E",X"24",X"7E",X"FE",X"04",X"D2",X"8F",X"0E",X"21",X"60",X"20",X"34",X"2E",X"67", + X"34",X"2E",X"6E",X"34",X"21",X"95",X"20",X"36",X"00",X"C9",X"21",X"FB",X"03",X"22",X"63",X"20", + X"21",X"FA",X"02",X"22",X"6A",X"20",X"21",X"FB",X"FA",X"22",X"71",X"20",X"C3",X"6A",X"0E",X"21", + X"FC",X"02",X"22",X"63",X"20",X"21",X"FB",X"01",X"22",X"6A",X"20",X"21",X"FB",X"FD",X"C3",X"89", + X"0E",X"CD",X"35",X"0E",X"C6",X"08",X"B8",X"D2",X"3D",X"0E",X"C9",X"06",X"03",X"CD",X"71",X"03", + X"C5",X"E5",X"1A",X"D3",X"04",X"DB",X"03",X"2F",X"A6",X"77",X"23",X"13",X"AF",X"D3",X"04",X"DB", + X"03",X"2F",X"A6",X"77",X"E1",X"01",X"20",X"00",X"09",X"C1",X"05",X"C2",X"B0",X"0E",X"C9",X"06", + X"03",X"CD",X"71",X"03",X"C5",X"E5",X"1A",X"D3",X"04",X"DB",X"03",X"AE",X"77",X"23",X"13",X"AF", + X"D3",X"04",X"DB",X"03",X"AE",X"77",X"E1",X"01",X"20",X"00",X"09",X"C1",X"05",X"C2",X"D4",X"0E", + X"C9",X"21",X"60",X"20",X"AF",X"BE",X"C8",X"23",X"BE",X"C2",X"FE",X"0E",X"35",X"C9",X"23",X"BE", + X"C2",X"0A",X"0F",X"34",X"CD",X"33",X"0F",X"22",X"65",X"20",X"CD",X"3B",X"0F",X"21",X"66",X"20", + X"7E",X"FE",X"30",X"DC",X"46",X"0F",X"FE",X"E8",X"D4",X"53",X"0F",X"2B",X"7E",X"FE",X"18",X"DA", + X"5E",X"0F",X"21",X"63",X"20",X"CD",X"A1",X"0D",X"2A",X"65",X"20",X"11",X"DA",X"0F",X"06",X"08", + X"C3",X"D1",X"0E",X"2A",X"5A",X"20",X"01",X"00",X"08",X"09",X"C9",X"2A",X"65",X"20",X"11",X"DA", + X"0F",X"06",X"08",X"C3",X"AD",X"0E",X"F5",X"E5",X"2A",X"65",X"20",X"CD",X"3E",X"0F",X"E1",X"36", + X"E0",X"F1",X"C9",X"E5",X"2A",X"65",X"20",X"CD",X"3E",X"0F",X"E1",X"36",X"34",X"C9",X"CD",X"3B", + X"0F",X"21",X"60",X"46",X"11",X"60",X"20",X"06",X"07",X"C3",X"8B",X"03",X"21",X"67",X"20",X"AF", + X"BE",X"C8",X"23",X"BE",X"CA",X"79",X"0F",X"35",X"C9",X"23",X"BE",X"C2",X"85",X"0F",X"34",X"CD", + X"33",X"0F",X"22",X"6C",X"20",X"2A",X"6C",X"20",X"CD",X"3E",X"0F",X"21",X"6D",X"20",X"7E",X"FE", + X"30",X"DC",X"BC",X"0F",X"FE",X"E8",X"D4",X"C4",X"0F",X"2B",X"7E",X"47",X"CD",X"52",X"1A",X"2E", + X"24",X"7E",X"FE",X"05",X"0E",X"13",X"D2",X"AB",X"0F",X"0E",X"18",X"78",X"B9",X"DA",X"CB",X"0F", + X"21",X"6A",X"20",X"CD",X"A1",X"0D",X"2A",X"6C",X"20",X"C3",X"2B",X"0F",X"F5",X"E5",X"2A",X"6C", + X"20",X"C3",X"57",X"0F",X"E5",X"2A",X"6C",X"20",X"C3",X"4B",X"0F",X"2A",X"6C",X"20",X"CD",X"3E", + X"0F",X"21",X"67",X"46",X"11",X"67",X"20",X"C3",X"67",X"0F",X"60",X"F0",X"F0",X"F0",X"F0",X"60", + X"90",X"90",X"21",X"6E",X"20",X"AF",X"BE",X"C8",X"23",X"BE",X"CA",X"EF",X"0F",X"35",X"C9",X"23", + X"BE",X"C2",X"FB",X"0F",X"34",X"CD",X"33",X"0F",X"22",X"73",X"20",X"2A",X"73",X"20",X"CD",X"3E"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn03 b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn03 new file mode 100644 index 0000000000000000000000000000000000000000..e0ab28e6a5cb5e8be440d36bb172a55933488eca GIT binary patch literal 2048 zcmYjReQXnD7{BXXuid2d-d=m#D&X_pjj3%YV;qZVNL@@FF=#|%{D_MFLkNZd6SaV@ zI2Q*7i1CZ~kBOR?fnW6xV^CP#dT!x{uV{xbPoh-qzz`$*10$Ka`n>I2yj<^n`h5JJ z-}AiB`-bULkoP*z8>)BdOhQfOy;gUXO8bDl6H4p^I~l%O94}mxnDQ6xk!4In`c9I2|9U(`mv5>8J$5b}ocrA8rBTX;`e} zhbLDP)8wI9l6V@3EVQ8^RO%phUma+D1L)oc&_l$TO(v7w0(*iOHv_#9EXOoAn)hFJ zSU@v!2w9~!fK|x{&c8(xxdvbk0e2JBW85!MyFZ4}&v|RV9cOohjNLFscLVQFbFut6 z!G6FH_Qm~*IR9%?d5T-iy5%P%QKd`4!W|KXznTmKFjIaeoI_mpQm~TD_=naZ;<57L z2-_UD7iqK|EcO_eQtj;Cc-~XW?GdM%UJAogN@;ndg3Ll~>`s9`%eT9i2%xND2PC?t zm#hJ$mx}|vWB`;~xrj5tmPHXL)nVn=h26eL(%R((zt%J_j34$<1iMl13vGg(=98ID z_I;H4!OHV=ha;G!TS%?6Qc=viEADWl<$3Qq_jn{D<<@xt*N!MkruD4kFO5g;u7h3P z(s3gbq||cGKO82PvhME@@^==E>`xzlQ7MApdJ*wLjow82%pLX#Atl?0&1<%>e>Eoi zGBTSJ*_e<4z7EFO34v|VP%HaV9d&H?4vj`SNwi0i?R!vML0Ws1X7;#`eI{UwGS6c% z>{X3+ViB_rmD-IJlrHHpR?@|Nsd z0{8rmdltCs$h_;@nvT!kG>iC zWLkpZ(N#jbB9G(VjQLA*T1M=W07=ggqlfC9ip*;m6YN$2NsB+n$E)3f=`VFe>p75T zd(>eY7R{)WcSUiJ3&l~hIBJ=eLt|K~Lv>W0G>fGzQ7f?;MAhG9#OJRC9L4l~Fx+3- zAN4Mj4@D=W?P#-41-()GxhPtV5unF$w)9@2gA%ZDijL32jUe0z5Ed1KB6~)%zZVO+ zWDZsH{|^R_K2qH4?ajZ@B|uuJkL+~Rp)c@w9P_h5ItayYCnCjZeqzo_C^r?S6N6wJ z0`_n-I^sQc0FP=Tq<&tjXsD2DwKiiA`n}fjZOz6$pf5sqt?uri$cwe|o;W!e^W@S) zG18v3hhkn}nyk&Tp%}jv2f%m{*o7F~59K{Eb}_~ecRL~S^GPVm_VZFr~25zAjdrbbO0gP_BcDoG0E#$bg^HGVJ`QNm>tp^1Md{l z7M4z*$D`#*ZY|a=WG*F#a*pTATyf`O4f{0BH|#g)Xpha?L+^FcI=t}mXZ>$aq{eTiCFT&mmUVo>~40_ zB80<=6rNW6_zU2#$w3=WTAVzpuW=AiY!z8qM{Tz-Uuzu^+ktK4JsQzbZltlXK?4{* ziVdjdy;|uHz2XGiYkI}R$No*PR9R2xt}Ne_z2L5FN%iNCm1p${`ItMam zy(_5QL2EVK#ER4KQMiw-x1`^P;gj@TU{^xy(H8nKtjQ0T9%!*&XrXU|{Z6QVCNSm0 zn#Zg0Dfvg~vz)0F8bSrHpe8(gn_8U25x5*r6kx^V7cE8sx;_RiJ`)azU$%4z+ncIm z2-TdE%;uaH->$_s8}Gtp(>MZ7q3eBc1Rp+v&l5a+1kWe>@U4kn&BIr$`D(RxYW=QcDeryrF4CmxgopQ8LB%5VM)flmWo literal 0 HcmV?d00001 diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn03.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn03.vhd new file mode 100644 index 00000000..d35cb0d4 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn03.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity tn03 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of tn03 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"21",X"74",X"20",X"7E",X"FE",X"30",X"DC",X"22",X"10",X"FE",X"E8",X"D4",X"2A",X"10",X"2B", + X"7E",X"FE",X"18",X"DA",X"31",X"10",X"21",X"71",X"20",X"CD",X"A1",X"0D",X"2A",X"73",X"20",X"C3", + X"2B",X"0F",X"F5",X"E5",X"2A",X"73",X"20",X"C3",X"4B",X"0F",X"E5",X"2A",X"73",X"20",X"C3",X"57", + X"0F",X"2A",X"73",X"20",X"CD",X"3E",X"0F",X"21",X"6E",X"46",X"11",X"6E",X"20",X"C3",X"67",X"0F", + X"21",X"11",X"20",X"AF",X"BE",X"C8",X"36",X"00",X"21",X"14",X"20",X"34",X"21",X"00",X"00",X"22", + X"16",X"20",X"2A",X"1A",X"20",X"CD",X"C3",X"08",X"21",X"60",X"20",X"AF",X"BE",X"CA",X"B0",X"10", + X"21",X"65",X"20",X"CD",X"8F",X"10",X"D4",X"6C",X"10",X"C3",X"B0",X"10",X"CD",X"96",X"10",X"DA", + X"73",X"10",X"C9",X"CD",X"9D",X"10",X"D2",X"7A",X"10",X"C9",X"CD",X"A9",X"10",X"DA",X"81",X"10", + X"C9",X"E1",X"2A",X"65",X"20",X"22",X"93",X"20",X"21",X"91",X"20",X"34",X"C3",X"5E",X"0F",X"3A", + X"1A",X"20",X"C6",X"08",X"BE",X"C9",X"F5",X"3E",X"10",X"86",X"C3",X"A5",X"10",X"3A",X"1B",X"20", + X"23",X"F5",X"7E",X"D6",X"08",X"47",X"F1",X"B8",X"C9",X"F5",X"3E",X"10",X"86",X"C3",X"A5",X"10", + X"21",X"67",X"20",X"AF",X"BE",X"CA",X"E7",X"10",X"21",X"6C",X"20",X"CD",X"8F",X"10",X"D4",X"C4", + X"10",X"C3",X"E7",X"10",X"CD",X"96",X"10",X"DA",X"CB",X"10",X"C9",X"CD",X"9D",X"10",X"D2",X"D2", + X"10",X"C9",X"CD",X"A9",X"10",X"DA",X"D9",X"10",X"C9",X"E1",X"2A",X"6C",X"20",X"22",X"93",X"20", + X"21",X"91",X"20",X"34",X"C3",X"CB",X"0F",X"21",X"6E",X"20",X"AF",X"BE",X"CA",X"1E",X"11",X"21", + X"73",X"20",X"CD",X"8F",X"10",X"D4",X"FB",X"10",X"C3",X"1E",X"11",X"CD",X"96",X"10",X"DA",X"02", + X"11",X"C9",X"CD",X"9D",X"10",X"D2",X"09",X"11",X"C9",X"CD",X"A9",X"10",X"DA",X"10",X"11",X"C9", + X"E1",X"2A",X"73",X"20",X"22",X"93",X"20",X"21",X"91",X"20",X"34",X"C3",X"31",X"10",X"21",X"38", + X"20",X"22",X"75",X"20",X"0E",X"06",X"7E",X"A7",X"CA",X"33",X"11",X"23",X"23",X"CD",X"8F",X"10", + X"D4",X"44",X"11",X"2A",X"75",X"20",X"11",X"04",X"00",X"19",X"22",X"75",X"20",X"0D",X"C2",X"26", + X"11",X"C3",X"71",X"11",X"CD",X"96",X"10",X"DA",X"4B",X"11",X"C9",X"CD",X"9D",X"10",X"D2",X"52", + X"11",X"C9",X"CD",X"A9",X"10",X"DA",X"59",X"11",X"C9",X"F1",X"2B",X"2B",X"2B",X"36",X"00",X"CD", + X"6A",X"11",X"22",X"29",X"20",X"21",X"27",X"20",X"34",X"C9",X"23",X"23",X"5E",X"23",X"56",X"EB", + X"C9",X"CD",X"07",X"13",X"22",X"77",X"20",X"0E",X"06",X"E5",X"21",X"1F",X"20",X"34",X"E1",X"7E", + X"07",X"DC",X"9D",X"11",X"2A",X"77",X"20",X"11",X"04",X"00",X"19",X"22",X"77",X"20",X"0D",X"C2", + X"79",X"11",X"21",X"1F",X"20",X"36",X"00",X"CD",X"E2",X"14",X"C3",X"7D",X"15",X"CD",X"6A",X"11", + X"7C",X"FE",X"3C",X"D0",X"C5",X"CD",X"49",X"0D",X"22",X"79",X"20",X"C1",X"21",X"79",X"20",X"3A", + X"1A",X"20",X"C6",X"0A",X"BE",X"D2",X"B9",X"11",X"C9",X"F5",X"3E",X"20",X"86",X"47",X"F1",X"B8", + X"DA",X"C4",X"11",X"C9",X"3A",X"1B",X"20",X"23",X"F5",X"7E",X"D6",X"08",X"47",X"F1",X"B8",X"D2", + X"D3",X"11",X"C9",X"F5",X"3E",X"23",X"86",X"47",X"F1",X"B8",X"DA",X"DE",X"11",X"C9",X"F1",X"E5", + X"21",X"1D",X"20",X"34",X"2A",X"1A",X"20",X"01",X"00",X"F6",X"09",X"22",X"22",X"20",X"2A",X"77", + X"20",X"7E",X"E6",X"0F",X"77",X"CD",X"6A",X"11",X"CD",X"89",X"08",X"E1",X"2B",X"3E",X"05",X"86", + X"47",X"3A",X"1A",X"20",X"B8",X"D2",X"0E",X"12",X"CD",X"67",X"1A",X"C3",X"0C",X"13",X"21",X"24", + X"20",X"34",X"CD",X"5F",X"1A",X"C3",X"0C",X"13",X"2E",X"24",X"CD",X"52",X"1A",X"7E",X"FE",X"06", + X"D2",X"24",X"12",X"C9",X"E5",X"3A",X"1D",X"20",X"A7",X"D3",X"06",X"C2",X"25",X"12",X"E1",X"36", + X"00",X"CD",X"0D",X"19",X"CD",X"4C",X"00",X"21",X"7B",X"20",X"34",X"21",X"00",X"46",X"11",X"00", + X"20",X"06",X"31",X"CD",X"8B",X"03",X"21",X"35",X"46",X"11",X"35",X"20",X"06",X"46",X"CD",X"8B", + X"03",X"21",X"81",X"46",X"11",X"81",X"20",X"06",X"3F",X"CD",X"8B",X"03",X"21",X"14",X"20",X"34", + X"CD",X"1E",X"14",X"CD",X"52",X"1A",X"2E",X"26",X"34",X"7E",X"47",X"0F",X"DA",X"71",X"12",X"2B", + X"34",X"78",X"FE",X"08",X"CC",X"13",X"13",X"FE",X"0F",X"CC",X"13",X"13",X"CD",X"AD",X"12",X"CD", + X"07",X"13",X"23",X"23",X"5E",X"23",X"56",X"21",X"09",X"20",X"73",X"23",X"72",X"3E",X"30",X"CD", + X"D5",X"14",X"21",X"05",X"20",X"34",X"7E",X"A7",X"D3",X"06",X"C2",X"96",X"12",X"21",X"7B",X"20", + X"36",X"00",X"2E",X"2F",X"34",X"2E",X"14",X"36",X"00",X"CD",X"78",X"1A",X"C9",X"CD",X"52",X"1A", + X"2E",X"25",X"7E",X"FE",X"0B",X"DA",X"BB",X"12",X"3E",X"03",X"77",X"47",X"FE",X"07",X"DA",X"C3", + X"12",X"06",X"06",X"3E",X"18",X"D6",X"03",X"05",X"C2",X"C5",X"12",X"4F",X"CD",X"07",X"13",X"23", + X"23",X"EB",X"69",X"26",X"27",X"CD",X"00",X"03",X"2E",X"25",X"CD",X"52",X"1A",X"7E",X"0F",X"0F", + X"11",X"E8",X"44",X"DA",X"E9",X"12",X"11",X"F8",X"44",X"CD",X"07",X"13",X"CD",X"EF",X"02",X"CD", + X"07",X"13",X"7E",X"0F",X"0F",X"01",X"20",X"00",X"DA",X"FE",X"12",X"01",X"E0",X"FF",X"21",X"28", + X"21",X"71",X"23",X"70",X"C3",X"BC",X"00",X"2E",X"04",X"C3",X"52",X"1A",X"2E",X"24",X"CD",X"52", + X"1A",X"34",X"C9",X"F5",X"3E",X"FF",X"CD",X"04",X"02",X"3E",X"04",X"CD",X"FB",X"01",X"CD",X"C1", + X"00",X"3E",X"20",X"CD",X"FB",X"01",X"CD",X"83",X"1A",X"CD",X"BC",X"00",X"CD",X"69",X"13",X"3E", + X"04",X"CD",X"04",X"02",X"2E",X"26",X"CD",X"52",X"1A",X"7E",X"0F",X"DA",X"49",X"13",X"21",X"12", + X"30",X"11",X"14",X"40",X"06",X"04",X"C3",X"51",X"13",X"21",X"12",X"2D",X"11",X"18",X"40",X"06", + X"0A",X"CD",X"60",X"02",X"CD",X"B6",X"00",X"CD",X"4C",X"00",X"3E",X"80",X"CD",X"D5",X"14",X"CD", + X"92",X"13",X"21",X"30",X"20",X"36",X"00",X"F1",X"C9",X"21",X"03",X"24",X"22",X"2D",X"21",X"21", + X"1C",X"40",X"22",X"2F",X"21",X"0E",X"71",X"C5",X"2A",X"2D",X"21",X"CD",X"BB",X"13",X"22",X"2D", + X"21",X"2A",X"2F",X"21",X"CD",X"CF",X"13",X"22",X"2F",X"21",X"C1",X"0D",X"C2",X"77",X"13",X"CD", + X"FC",X"00",X"0E",X"79",X"21",X"1C",X"33",X"22",X"2D",X"21",X"21",X"03",X"32",X"22",X"2F",X"21", + X"C5",X"AF",X"2A",X"2D",X"21",X"CD",X"D1",X"13",X"22",X"2D",X"21",X"AF",X"2A",X"2F",X"21",X"CD", + X"BD",X"13",X"22",X"2F",X"21",X"C1",X"0D",X"C2",X"A0",X"13",X"C9",X"3E",X"FF",X"06",X"1A",X"E5", + X"77",X"23",X"CD",X"E3",X"13",X"05",X"C2",X"C0",X"13",X"E1",X"11",X"20",X"00",X"19",X"C9",X"3E", + X"FF",X"06",X"1A",X"E5",X"77",X"2B",X"CD",X"E3",X"13",X"05",X"C2",X"D4",X"13",X"E1",X"11",X"E0", + X"FF",X"19",X"C9",X"1E",X"20",X"D3",X"06",X"1D",X"C2",X"E5",X"13",X"C9",X"DB",X"02",X"E6",X"04", + X"C8",X"3A",X"03",X"20",X"A7",X"C0",X"31",X"00",X"24",X"06",X"04",X"C5",X"CD",X"1E",X"14",X"C1", + X"05",X"C2",X"FB",X"13",X"3E",X"01",X"32",X"03",X"20",X"CD",X"B6",X"00",X"FB",X"11",X"22",X"40", + X"21",X"16",X"30",X"06",X"04",X"CD",X"60",X"02",X"CD",X"C1",X"00",X"C3",X"18",X"00",X"21",X"03", + X"24",X"01",X"DF",X"1A",X"C5",X"E5",X"36",X"00",X"23",X"05",X"C2",X"26",X"14",X"E1",X"11",X"20", + X"00",X"19",X"C1",X"0D",X"C2",X"24",X"14",X"C9",X"CD",X"50",X"0C",X"E6",X"10",X"CA",X"4D",X"14", + X"21",X"14",X"20",X"AF",X"BE",X"C0",X"23",X"BE",X"C0",X"34",X"23",X"34",X"C9",X"21",X"15",X"20", + X"36",X"00",X"C9",X"21",X"16",X"20",X"AF",X"BE",X"C8",X"23",X"BE",X"C2",X"69",X"14",X"34",X"2A", + X"33",X"20",X"01",X"10",X"05",X"09",X"22",X"1A",X"20",X"2A",X"1A",X"20",X"CD",X"C3",X"08",X"2A", + X"1A",X"20",X"3A",X"54",X"20",X"A7",X"7D",X"C2",X"88",X"14",X"FE",X"E0",X"D2",X"8D",X"14",X"C6", + X"03",X"6F",X"22",X"1A",X"20",X"C3",X"CB",X"08",X"FE",X"C0",X"C3",X"7C",X"14",X"2A",X"1A",X"20", + X"22",X"BD",X"20",X"21",X"BB",X"20",X"34",X"21",X"16",X"46",X"11",X"16",X"20",X"06",X"07",X"C3", + X"8B",X"03",X"21",X"BB",X"20",X"AF",X"BE",X"C8",X"23",X"BE",X"C2",X"BD",X"14",X"34",X"2A",X"BD", + X"20",X"11",X"CD",X"14",X"01",X"08",X"01",X"CD",X"76",X"03",X"C3",X"D5",X"01",X"AF",X"77",X"2B", + X"77",X"2A",X"BD",X"20",X"01",X"08",X"01",X"CD",X"76",X"03",X"C3",X"8C",X"08",X"A9",X"5C",X"BE", + X"7F",X"FE",X"7F",X"7E",X"95",X"32",X"00",X"20",X"3A",X"00",X"20",X"A7",X"D3",X"06",X"C2",X"D8", + X"14",X"C9",X"21",X"82",X"20",X"AF",X"BE",X"C8",X"3A",X"1A",X"20",X"D6",X"08",X"21",X"83",X"20", + X"BE",X"D0",X"C6",X"12",X"BE",X"D8",X"3A",X"1B",X"20",X"23",X"D6",X"03",X"BE",X"D0",X"C6",X"09", + X"BE",X"D8",X"2A",X"83",X"20",X"22",X"8D",X"20",X"CD",X"5B",X"0A",X"21",X"82",X"20",X"36",X"00", + X"21",X"8B",X"20",X"34",X"C9",X"21",X"82",X"20",X"AF",X"BE",X"C8",X"23",X"5E",X"23",X"56",X"EB", + X"E5",X"CD",X"5B",X"0A",X"E1",X"11",X"F9",X"FF",X"19",X"22",X"83",X"20",X"7D",X"FE",X"18",X"D2", + X"42",X"0A",X"22",X"87",X"20",X"21",X"85",X"20",X"36",X"FF",X"21",X"82",X"20",X"36",X"00",X"C9", + X"21",X"85",X"20",X"AF",X"BE",X"C8",X"23",X"34",X"7E",X"FE",X"01",X"CA",X"83",X"15",X"FE",X"04", + X"C2",X"59",X"15",X"11",X"24",X"44",X"C3",X"86",X"15",X"FE",X"07",X"D8",X"11",X"3C",X"44",X"CD", + X"86",X"15",X"21",X"00",X"00",X"22",X"81",X"20",X"22",X"85",X"20",X"CD",X"E0",X"15",X"21",X"88", + X"20",X"D2",X"7A",X"15",X"CD",X"E7",X"15",X"C3",X"7D",X"15",X"CD",X"07",X"16",X"21",X"14",X"20", + X"36",X"00",X"C9",X"11",X"0C",X"44",X"2A",X"87",X"20",X"CD",X"76",X"03",X"01",X"0C",X"02",X"C3", + X"D5",X"01",X"21",X"8B",X"20",X"AF",X"BE",X"C8",X"23",X"34",X"7E",X"FE",X"01",X"CA",X"CE",X"15", + X"FE",X"04",X"C2",X"AB",X"15",X"11",X"B4",X"44",X"C3",X"D1",X"15",X"FE",X"07",X"D8",X"2A",X"8D", + X"20",X"CD",X"76",X"03",X"01",X"10",X"02",X"CD",X"8C",X"08",X"21",X"00",X"00",X"22",X"8B",X"20", + X"21",X"81",X"20",X"36",X"00",X"CD",X"6F",X"1A",X"CD",X"D7",X"15",X"C3",X"7D",X"15",X"11",X"94", + X"44",X"2A",X"8D",X"20",X"C3",X"89",X"15",X"CD",X"E0",X"15",X"DA",X"ED",X"15",X"C3",X"0D",X"16", + X"CD",X"07",X"13",X"7E",X"0F",X"0F",X"C9",X"AF",X"3A",X"34",X"20",X"BE",X"D0",X"21",X"80",X"20", + X"34",X"7E",X"FE",X"03",X"DA",X"FF",X"15",X"36",X"00",X"3E",X"E8",X"2B",X"86",X"77",X"C9",X"FE", + X"02",X"3E",X"F0",X"DA",X"FB",X"15",X"C9",X"AF",X"3A",X"34",X"20",X"BE",X"D8",X"21",X"7E",X"20", + X"34",X"7E",X"FE",X"03",X"DA",X"1F",X"16",X"36",X"00",X"3E",X"15",X"2B",X"86",X"77",X"C9",X"FE", + X"02",X"3E",X"0D",X"DA",X"1B",X"16",X"C9",X"21",X"91",X"20",X"AF",X"BE",X"C8",X"23",X"34",X"7E", + X"FE",X"01",X"CA",X"BA",X"16",X"FE",X"04",X"CA",X"C9",X"16",X"FE",X"07",X"D8",X"CD",X"CF",X"16", + X"21",X"00",X"00",X"22",X"91",X"20",X"CD",X"5F",X"1A",X"21",X"95",X"20",X"34",X"7E",X"FE",X"03", + X"D2",X"5E",X"16",X"3E",X"50",X"32",X"C2",X"20",X"CD",X"8C",X"02",X"C3",X"7D",X"15",X"CD",X"88", + X"16",X"21",X"C1",X"20",X"70",X"78",X"C6",X"20",X"CD",X"2E",X"03",X"2A",X"93",X"20",X"CD",X"76", + X"03",X"CD",X"45",X"03",X"11",X"34",X"04",X"CD",X"45",X"03",X"11",X"34",X"04",X"CD",X"45",X"03", + X"21",X"96",X"20",X"34",X"23",X"36",X"0A",X"C9",X"3A",X"01",X"20",X"0F",X"0F",X"06",X"03",X"0F", + X"D8",X"06",X"05",X"0F",X"D8",X"06",X"07",X"0F",X"D8",X"06",X"09",X"C9",X"21",X"96",X"20",X"AF", + X"BE",X"C8",X"23",X"BE",X"CA",X"A9",X"16",X"35",X"C9",X"CD",X"8C",X"02",X"01",X"18",X"01",X"CD", + X"D2",X"16",X"21",X"96",X"20",X"36",X"00",X"C3",X"7D",X"15",X"11",X"94",X"44",X"2A",X"93",X"20", + X"CD",X"76",X"03",X"01",X"10",X"02",X"C3",X"D5",X"01",X"11",X"B4",X"44",X"C3",X"BD",X"16",X"01", + X"10",X"02",X"2A",X"93",X"20",X"CD",X"76",X"03",X"C3",X"8C",X"08",X"21",X"81",X"20",X"AF",X"BE", + X"C0",X"CD",X"07",X"13",X"E5",X"7E",X"FE",X"FF",X"C2",X"ED",X"16",X"E1",X"C9",X"07",X"DA",X"F9", + X"16",X"E1",X"23",X"23",X"23",X"23",X"C3",X"E4",X"16",X"E1",X"E5",X"CD",X"40",X"0D",X"4D",X"44", + X"CD",X"E0",X"15",X"21",X"7F",X"20",X"DA",X"2F",X"17",X"2E",X"7D",X"7E",X"B8",X"D2",X"F1",X"16", + X"C6",X"04",X"B8",X"DA",X"F1",X"16",X"21",X"83",X"20",X"71",X"23",X"78",X"FE",X"30",X"DA",X"F1", + X"16",X"FE",X"F0",X"D2",X"F1",X"16",X"70",X"21",X"FF",X"FF",X"22",X"81",X"20",X"E1",X"C9",X"7E", + X"B8",X"D2",X"F1",X"16",X"C6",X"06",X"B8",X"DA",X"F1",X"16",X"C3",X"16",X"17",X"3A",X"AA",X"20", + X"A7",X"C8",X"21",X"A2",X"20",X"CD",X"F0",X"0D",X"CD",X"5D",X"17",X"21",X"AE",X"20",X"35",X"7E", + X"A7",X"C2",X"57",X"17",X"C3",X"82",X"17",X"21",X"A0",X"20",X"C3",X"A1",X"0D",X"7D",X"E6",X"07", + X"D3",X"02",X"CD",X"76",X"03",X"C5",X"E5",X"1A",X"D3",X"04",X"DB",X"03",X"B6",X"77",X"23",X"13", + X"AF",X"D3",X"04",X"DB",X"03",X"B6",X"77",X"E1",X"01",X"20",X"00",X"09",X"C1",X"05",X"C2",X"65", + X"17",X"C9",X"2A",X"A8",X"20",X"EB",X"1A",X"2A",X"AF",X"20",X"2D",X"CA",X"BA",X"17",X"22",X"AF", + X"20",X"32",X"AE",X"20",X"13",X"1A",X"E6",X"0F",X"07",X"01",X"BF",X"17",X"26",X"00",X"6F",X"09", + X"E5",X"C1",X"21",X"A0",X"20",X"0A",X"77",X"03",X"23",X"0A",X"77",X"13",X"1A",X"6F",X"13",X"1A", + X"67",X"22",X"A2",X"20",X"EB",X"23",X"22",X"A8",X"20",X"C9",X"AF",X"32",X"AA",X"20",X"C9",X"00", + X"02",X"02",X"02",X"02",X"00",X"02",X"FE",X"00",X"FE",X"FE",X"FE",X"FE",X"00",X"FE",X"02",X"01", + X"02",X"02",X"01",X"02",X"FF",X"01",X"FE",X"FF",X"FE",X"FE",X"FF",X"FE",X"01",X"FF",X"02",X"FF", + X"FF",X"24",X"06",X"D7",X"30",X"10",X"00",X"D7",X"30",X"04",X"07",X"D7",X"50",X"0A",X"06",X"CF", + X"58",X"04",X"05",X"BC",X"58",X"04",X"07",X"B4",X"50",X"0A",X"06",X"AC",X"58",X"04",X"05",X"98"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn04 b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn04 new file mode 100644 index 0000000000000000000000000000000000000000..2097c45c4a73bfbba52d9c0bcf036a18403f133a GIT binary patch literal 2048 zcmeHF!E4iC6#tSYX|i?gI=8h=ndDp9$|iJJw_39`4B41Pa6?2?6g}xh5HEHzjPtS` z99RdUhv~sXyMx*x9(EX|O{_MB4?5?hSYcG0AQNY!m$xJoLfi_j|wh<$W)| zp%mOadqPU3}s55|Xp*FE(vqEx-?+9YrO)(Xh$&d@}h1h}! zA@aekFl2-3JRp&47CXC|a~3_z9GzRG8fdaiDJ)rTtYlg3g?lkusnedgO?`?dS)?#J zL*p(fgaVBrWXLWlsnFU61*+TvoYKF#Wj_$!BzJd-vO*YISAxZX%j>Te>BXbvrrg(H}RGGalS6sezm6(knh@Z1WrG;yd8vy64Y; z8G)3W^~(;Kh2hLU!xsed(Lqku=`+ppnB*|XRZDJFTw=r=kjl?qhRJcV=YEiGgCdwg93^5gyv5^WM b#C;~=2WJLf4Vpi5HL4C&9jH3+-#PFbu86>U literal 0 HcmV?d00001 diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn04.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn04.vhd new file mode 100644 index 00000000..de61c21a --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn04.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity tn04 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of tn04 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"58",X"10",X"00",X"90",X"31",X"0C",X"06",X"D0",X"38",X"08",X"00",X"D0",X"38",X"08",X"00",X"D0", + X"38",X"04",X"07",X"D0",X"48",X"05",X"06",X"C8",X"50",X"04",X"05",X"BE",X"4E",X"08",X"00",X"B8", + X"38",X"0C",X"06",X"B0",X"38",X"08",X"00",X"B0",X"38",X"04",X"07",X"B0",X"48",X"05",X"06",X"A8", + X"50",X"04",X"05",X"9E",X"4E",X"08",X"00",X"98",X"38",X"0C",X"09",X"90",X"59",X"0C",X"0E",X"A6", + X"67",X"08",X"00",X"98",X"60",X"0B",X"06",X"A6",X"78",X"0A",X"00",X"90",X"78",X"0B",X"06",X"A6", + X"90",X"0A",X"00",X"90",X"90",X"0C",X"06",X"A6",X"A8",X"0A",X"00",X"A6",X"A8",X"0C",X"06",X"A6", + X"BC",X"0B",X"00",X"90",X"A8",X"0C",X"06",X"A6",X"C0",X"0A",X"00",X"A6",X"C0",X"0C",X"06",X"A6", + X"D4",X"0B",X"00",X"90",X"C0",X"0C",X"06",X"A6",X"D8",X"0C",X"07",X"A6",X"D8",X"0C",X"06",X"A6", + X"F0",X"00",X"00",X"00",X"00",X"92",X"18",X"01",X"04",X"E1",X"17",X"00",X"00",X"00",X"00",X"00", + X"17",X"00",X"1E",X"1E",X"1E",X"1E",X"FF",X"FF",X"FF",X"FF",X"36",X"00",X"CD",X"DC",X"18",X"3E", + X"04",X"CD",X"FB",X"01",X"2A",X"33",X"20",X"CD",X"76",X"03",X"0E",X"05",X"E5",X"C5",X"11",X"D0", + X"19",X"D5",X"06",X"02",X"C5",X"E5",X"01",X"12",X"02",X"CD",X"D5",X"01",X"3E",X"05",X"CD",X"D5", + X"14",X"E1",X"C1",X"05",X"C2",X"B4",X"18",X"D1",X"C1",X"E1",X"0D",X"C2",X"AC",X"18",X"01",X"12", + X"02",X"CD",X"8C",X"08",X"CD",X"C1",X"00",X"3E",X"04",X"C3",X"04",X"02",X"21",X"2F",X"20",X"36", + X"00",X"2E",X"14",X"36",X"00",X"C9",X"3A",X"17",X"20",X"A7",X"3E",X"02",X"C2",X"FB",X"01",X"C3", + X"04",X"02",X"3A",X"1D",X"20",X"A7",X"3E",X"01",X"C3",X"EC",X"18",X"3A",X"27",X"20",X"A7",X"3E", + X"08",X"C3",X"EC",X"18",X"3A",X"91",X"20",X"A7",X"3E",X"08",X"C3",X"EC",X"18",X"3E",X"DF",X"CD", + X"04",X"02",X"3E",X"DF",X"C3",X"17",X"02",X"3A",X"E4",X"20",X"A7",X"C8",X"3A",X"54",X"20",X"A7", + X"3E",X"01",X"C2",X"0E",X"02",X"C3",X"17",X"02",X"CD",X"95",X"19",X"D8",X"CD",X"5F",X"0C",X"CD", + X"47",X"0B",X"CD",X"17",X"19",X"C3",X"92",X"15",X"CD",X"C2",X"07",X"CD",X"95",X"19",X"D8",X"CD", + X"81",X"09",X"CD",X"F1",X"0E",X"CD",X"4B",X"19",X"C3",X"A2",X"14",X"CD",X"5A",X"19",X"21",X"34", + X"20",X"7E",X"2E",X"7F",X"BE",X"D8",X"C6",X"08",X"77",X"C9",X"21",X"34",X"20",X"7E",X"2E",X"7D", + X"BE",X"D0",X"D6",X"08",X"77",X"C9",X"CD",X"79",X"19",X"CD",X"95",X"19",X"D8",X"CD",X"5F",X"0C", + X"CD",X"9C",X"09",X"CD",X"DB",X"16",X"C3",X"6C",X"0F",X"3A",X"05",X"20",X"A7",X"3E",X"04",X"C2", + X"0E",X"02",X"C3",X"17",X"02",X"CD",X"95",X"19",X"D8",X"CD",X"BC",X"09",X"CD",X"E2",X"0F",X"CD", + X"56",X"0D",X"C3",X"9C",X"16",X"3A",X"7B",X"20",X"0F",X"C9",X"CD",X"71",X"03",X"C5",X"E5",X"1A", + X"D3",X"04",X"DB",X"03",X"A6",X"CA",X"AD",X"19",X"3E",X"01",X"32",X"11",X"20",X"DB",X"03",X"AE", + X"77",X"23",X"13",X"AF",X"D3",X"04",X"DB",X"03",X"A6",X"CA",X"C1",X"19",X"3E",X"01",X"32",X"11", + X"20",X"DB",X"03",X"AE",X"77",X"E1",X"01",X"20",X"00",X"09",X"C1",X"05",X"C2",X"9D",X"19",X"C9", + X"00",X"00",X"07",X"00",X"00",X"00",X"42",X"00",X"00",X"00",X"15",X"02",X"11",X"49",X"8F",X"00", + X"EF",X"05",X"2F",X"08",X"D1",X"21",X"1D",X"20",X"00",X"00",X"17",X"00",X"09",X"11",X"07",X"00", + X"07",X"00",X"47",X"00",X"00",X"02",X"21",X"40",X"49",X"10",X"05",X"00",X"00",X"80",X"01",X"08", + X"09",X"40",X"07",X"00",X"03",X"00",X"01",X"00",X"49",X"02",X"49",X"44",X"00",X"80",X"09",X"02", + X"00",X"40",X"87",X"08",X"02",X"00",X"03",X"00",X"DB",X"02",X"E6",X"03",X"21",X"27",X"21",X"F5", + X"86",X"77",X"F1",X"2E",X"27",X"26",X"22",X"86",X"77",X"C9",X"CD",X"44",X"1A",X"7E",X"3D",X"C8", + X"4F",X"21",X"01",X"25",X"11",X"26",X"40",X"C5",X"01",X"10",X"01",X"CD",X"D5",X"01",X"C1",X"0D", + X"C2",X"34",X"1A",X"C9",X"CD",X"52",X"1A",X"2E",X"27",X"7E",X"C9",X"CD",X"52",X"1A",X"2E",X"25", + X"7E",X"C9",X"3A",X"DB",X"20",X"0F",X"DA",X"5C",X"1A",X"26",X"21",X"C9",X"26",X"22",X"C9",X"3E", + X"50",X"32",X"C2",X"20",X"C3",X"8C",X"02",X"3E",X"01",X"32",X"C1",X"20",X"C3",X"8C",X"02",X"21", + X"01",X"50",X"22",X"C1",X"20",X"C3",X"8C",X"02",X"21",X"29",X"09",X"11",X"36",X"21",X"06",X"06", + X"C3",X"8B",X"03",X"21",X"2F",X"09",X"C3",X"7B",X"1A",X"21",X"12",X"20",X"AF",X"BE",X"3E",X"10", + X"CA",X"04",X"02",X"35",X"C3",X"FB",X"01",X"21",X"E9",X"20",X"3A",X"DB",X"20",X"0F",X"D0",X"23", + X"C9",X"CD",X"97",X"1A",X"AF",X"BE",X"C8",X"CD",X"52",X"1A",X"21",X"C4",X"20",X"D2",X"B2",X"1A", + X"2E",X"C7",X"7E",X"06",X"15",X"B8",X"D8",X"CD",X"44",X"1A",X"34",X"CD",X"2A",X"1A",X"CD",X"97", + X"1A",X"36",X"00",X"21",X"12",X"20",X"36",X"50",X"C9",X"FE",X"FF",X"CA",X"25",X"1B",X"FE",X"FE", + X"CA",X"1A",X"1B",X"21",X"3B",X"21",X"36",X"80",X"23",X"77",X"23",X"EB",X"21",X"5D",X"1B",X"87", + X"4F",X"06",X"00",X"09",X"7E",X"23",X"66",X"6F",X"C3",X"F9",X"1A",X"3A",X"3B",X"21",X"A7",X"C8", + X"21",X"3D",X"21",X"35",X"C0",X"EB",X"2A",X"3E",X"21",X"7E",X"A7",X"CA",X"25",X"1B",X"FE",X"FF", + X"CA",X"14",X"1B",X"12",X"23",X"7E",X"06",X"08",X"D3",X"01",X"07",X"05",X"C2",X"08",X"1B",X"23", + X"22",X"3E",X"21",X"C9",X"3A",X"3C",X"21",X"F2",X"D3",X"1A",X"3E",X"01",X"32",X"3D",X"21",X"3E", + X"80",X"32",X"3B",X"21",X"C9",X"3E",X"FF",X"06",X"08",X"D3",X"01",X"07",X"05",X"C2",X"29",X"1B", + X"AF",X"32",X"3B",X"21",X"C9",X"21",X"39",X"21",X"7E",X"3D",X"77",X"C0",X"2B",X"7E",X"23",X"77", + X"23",X"7E",X"A7",X"C2",X"49",X"1B",X"C3",X"EB",X"1A",X"3A",X"36",X"21",X"CD",X"C9",X"1A",X"AF", + X"32",X"3A",X"21",X"C9",X"AF",X"32",X"37",X"21",X"3C",X"32",X"3A",X"21",X"C9",X"08",X"45",X"9C", + X"45",X"C6",X"45",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn05-1 b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn05-1 new file mode 100644 index 0000000000000000000000000000000000000000..a52cdde55931b1d23ed2b5c06b7b38b64e5bd67d GIT binary patch literal 2048 zcmds2y=xpt6#vb~?Jl{?efTWAWbalhTaj@g`+{Ap!FZPh2a_s=Ni9f`l5%)zh?B#G!aEC~gtI$fZMh9Zn+B^8d4J zobM87kEsWxp}vDE1J1bBebgg7OpxhOGa!vL0U}VUQxQW-%?9Or2y_{`+z(|Gt|Zuc z7yie|#6ZlU7!>>%(c%51`%-s*)nTT?x5)?omH?_c3yR9>Zz0khYzEZl-UH}qV6Fc4PyKi52aG(~Ig%Op`yw|zC6YPI!o0CXe-@AQf6Q1G z!YM?7pj-9Nk#?$h_GO*#pUWYaAjJ4zaKf7Qr|qzP*%*Fan0)Q=3Bbve$#=lqi+$-X b4odFTzU5vYa5w4;_tw9Afe0omJ}l)8E8A7m literal 0 HcmV?d00001 diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn05-1.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn05-1.vhd new file mode 100644 index 00000000..0efc0ad1 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn05-1.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity tn05_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of tn05_1 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"01",X"01",X"00",X"00",X"02",X"02",X"01",X"00",X"01",X"02",X"02",X"02",X"02",X"00",X"00",X"01", + X"01",X"00",X"00",X"00",X"06",X"0E",X"0E",X"03",X"15",X"04",X"11",X"18",X"1B",X"1B",X"05",X"08", + X"0D",X"04",X"13",X"08",X"0B",X"13",X"00",X"00",X"07",X"07",X"02",X"1C",X"8B",X"77",X"8B",X"1C", + X"02",X"07",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"00",X"F0", + X"00",X"70",X"00",X"30",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"1C",X"00",X"1C",X"00",X"1C", + X"00",X"3E",X"00",X"BE",X"00",X"E0",X"00",X"9C",X"00",X"9C",X"00",X"9C",X"80",X"B0",X"C0",X"AD", + X"C0",X"DC",X"00",X"9E",X"00",X"9E",X"00",X"1E",X"00",X"04",X"00",X"38",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"00",X"F0",X"00",X"70",X"00",X"30", + X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"1C",X"00",X"1C",X"00",X"1C",X"00",X"3E",X"00",X"BE", + X"00",X"E0",X"00",X"9C",X"00",X"9C",X"00",X"9C",X"80",X"B0",X"C0",X"AD",X"C0",X"DC",X"00",X"9E", + X"00",X"9E",X"00",X"1E",X"00",X"04",X"80",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38", + X"00",X"04",X"00",X"1E",X"00",X"9E",X"00",X"9E",X"C0",X"DC",X"C0",X"AD",X"80",X"B0",X"00",X"9C", + X"00",X"9C",X"00",X"9C",X"00",X"E0",X"00",X"BE",X"00",X"3E",X"00",X"1C",X"00",X"1C",X"00",X"1C", + X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"30",X"00",X"70",X"00",X"F0",X"00",X"38",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"03",X"00",X"04",X"00",X"1E",X"00",X"9E",X"00",X"9E",X"C0", + X"DC",X"C0",X"AD",X"80",X"B0",X"00",X"9C",X"00",X"9C",X"00",X"9C",X"00",X"E0",X"00",X"BE",X"00", + X"3E",X"00",X"1C",X"00",X"1C",X"00",X"1C",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"30",X"00", + X"70",X"00",X"F0",X"00",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"60",X"00",X"00",X"30",X"00",X"80",X"1B",X"00",X"C0",X"FF",X"00",X"C0", + X"67",X"00",X"C0",X"0B",X"00",X"00",X"08",X"00",X"00",X"08",X"00",X"00",X"08",X"00",X"00",X"10", + X"1E",X"00",X"10",X"3F",X"00",X"90",X"7F",X"00",X"E0",X"FF",X"00",X"E0",X"FF",X"00",X"E0",X"FF", + X"00",X"C0",X"FF",X"00",X"C0",X"FF",X"00",X"80",X"7F",X"00",X"00",X"3F",X"00",X"00",X"1E",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"80", + X"01",X"00",X"80",X"07",X"00",X"80",X"03",X"00",X"F0",X"00",X"00",X"78",X"01",X"00",X"78",X"02", + X"1E",X"38",X"04",X"3F",X"38",X"88",X"7F",X"00",X"D0",X"FF",X"00",X"E0",X"FF",X"00",X"E0",X"FF", + X"00",X"C0",X"FF",X"00",X"C0",X"FF",X"00",X"80",X"7F",X"00",X"00",X"3F",X"00",X"00",X"1E",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"40",X"02",X"00",X"C0",X"01",X"00",X"C0",X"00", + X"1E",X"40",X"00",X"3F",X"F0",X"81",X"7F",X"78",X"C6",X"FF",X"78",X"D8",X"FF",X"38",X"E0",X"FF", + X"38",X"C0",X"FF",X"00",X"C0",X"FF",X"00",X"80",X"7F",X"00",X"00",X"3F",X"00",X"00",X"1E",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"00",X"00",X"34",X"00", + X"1E",X"34",X"00",X"3F",X"3C",X"80",X"7F",X"3C",X"C0",X"FF",X"18",X"C0",X"FF",X"F8",X"FF",X"FF", + X"1C",X"C0",X"FF",X"3C",X"C0",X"FF",X"3C",X"80",X"7F",X"38",X"00",X"3F",X"10",X"00",X"1E",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1E",X"00",X"00",X"3F",X"00",X"80",X"7F",X"00",X"C0",X"FF",X"00",X"C0",X"FF",X"20",X"E0",X"FF", + X"24",X"D8",X"FF",X"38",X"C6",X"FF",X"B0",X"81",X"7F",X"60",X"00",X"3F",X"E0",X"00",X"1E",X"E0", + X"00",X"00",X"E0",X"01",X"00",X"E0",X"01",X"00",X"C0",X"01",X"00",X"80",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1E",X"00",X"00",X"3F",X"00",X"80",X"7F",X"00",X"C0",X"FF",X"00",X"C0",X"FF",X"00",X"E0",X"FF", + X"00",X"E0",X"FF",X"00",X"D0",X"FF",X"40",X"88",X"7F",X"40",X"04",X"3F",X"40",X"02",X"1E",X"F8", + X"01",X"00",X"E0",X"00",X"00",X"80",X"03",X"00",X"80",X"07",X"00",X"00",X"07",X"00",X"00",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1E",X"00",X"00",X"3F",X"00",X"80",X"7F",X"00",X"C0",X"FF",X"00",X"C0",X"FF",X"00",X"E0",X"FF", + X"00",X"E0",X"FF",X"00",X"E0",X"FF",X"00",X"90",X"7F",X"00",X"10",X"3F",X"00",X"10",X"1E",X"00", + X"08",X"00",X"00",X"08",X"00",X"80",X"05",X"00",X"00",X"0B",X"00",X"00",X"06",X"00",X"C0",X"7F", + X"00",X"00",X"FB",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"15",X"00", + X"1F",X"00",X"1F",X"00",X"06",X"00",X"F2",X"00",X"2D",X"C0",X"DE",X"7F",X"DE",X"7F",X"2D",X"C0", + X"F2",X"00",X"06",X"00",X"1F",X"00",X"1F",X"00",X"15",X"00",X"DE",X"3F",X"DE",X"7C",X"7C",X"7C", + X"12",X"02",X"0E",X"11",X"04",X"1C",X"21",X"1B",X"1B",X"07",X"08",X"1C",X"12",X"02",X"0E",X"11", + X"04",X"1B",X"1B",X"12",X"02",X"0E",X"11",X"04",X"1C",X"22",X"00",X"00",X"03",X"30",X"03",X"30", + X"1D",X"26",X"1D",X"29",X"1D",X"2F",X"05",X"23",X"1D",X"26",X"00",X"00",X"7F",X"04",X"0F",X"03", + X"83",X"40",X"01",X"38",X"11",X"0C",X"01",X"00",X"01",X"01",X"03",X"8C",X"07",X"1A",X"0F",X"40", + X"0F",X"20",X"9F",X"0C",X"FF",X"00",X"1F",X"00",X"0F",X"20",X"27",X"00",X"07",X"00",X"13",X"04", + X"03",X"00",X"07",X"00",X"13",X"01",X"07",X"20",X"1F",X"00",X"7F",X"00",X"7F",X"00",X"3F",X"00", + X"0F",X"00",X"01",X"00",X"03",X"00",X"03",X"00",X"03",X"00",X"03",X"00",X"07",X"00",X"0F",X"00", + X"3F",X"00",X"7F",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"A4",X"04",X"00",X"10", + X"C8",X"54",X"E0",X"1B",X"E0",X"03",X"8C",X"01",X"20",X"12",X"00",X"0C",X"30",X"11",X"00",X"00", + X"00",X"00",X"00",X"00",X"0C",X"C0",X"07",X"F1",X"0F",X"11",X"56",X"00",X"82",X"21",X"08",X"45", + X"0A",X"00",X"A0",X"63",X"B0",X"42",X"40",X"01",X"04",X"00",X"0E",X"70",X"4A",X"78",X"03",X"31", + X"0B",X"C0",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"A0",X"13",X"C8",X"04", + X"E0",X"01",X"50",X"07",X"A0",X"1E",X"C0",X"0B",X"C0",X"02",X"88",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"10",X"90",X"1C",X"38",X"48",X"21",X"04",X"8C",X"20", + X"18",X"40",X"08",X"08",X"24",X"00",X"20",X"1C",X"14",X"48",X"68",X"20",X"22",X"01",X"00",X"0B", + X"08",X"43",X"00",X"00",X"0F",X"0B",X"00",X"18",X"04",X"11",X"1B",X"1E",X"1B",X"1F",X"1B",X"06", + X"00",X"0C",X"04",X"1B",X"0E",X"15",X"04",X"11",X"C3",X"01",X"C2",X"04",X"C3",X"05",X"C2",X"06", + X"C3",X"02",X"C2",X"03",X"FF",X"FF",X"FF",X"FF",X"C1",X"02",X"C0",X"05",X"C1",X"06",X"C0",X"01", + X"C1",X"03",X"C0",X"04",X"FF",X"FF",X"FF",X"FF",X"02",X"DD",X"01",X"FF",X"01",X"D7",X"02",X"CC", + X"01",X"FF",X"01",X"D7",X"02",X"DD",X"01",X"FF",X"01",X"D7",X"02",X"CC",X"01",X"FF",X"01",X"D7", + X"02",X"DD",X"02",X"FF",X"02",X"E1",X"02",X"FF",X"06",X"E1",X"02",X"FF",X"02",X"DD",X"01",X"FF", + X"01",X"D7",X"02",X"CC",X"01",X"FF",X"01",X"D7",X"02",X"DD",X"01",X"FF",X"01",X"D7",X"02",X"CC", + X"01",X"FF",X"01",X"D7",X"02",X"D2",X"02",X"FF",X"02",X"DD",X"02",X"FF",X"06",X"B9",X"02",X"FF", + X"02",X"DD",X"01",X"FF",X"01",X"D7",X"02",X"CC",X"01",X"FF",X"01",X"D7",X"02",X"DD",X"01",X"FF", + X"01",X"D7",X"02",X"CC",X"01",X"FF",X"01",X"D7",X"02",X"DD",X"02",X"FF",X"02",X"E1",X"02",X"FF", + X"06",X"E4",X"02",X"FF",X"02",X"E6",X"02",X"FF",X"01",X"E4",X"01",X"E1",X"01",X"DD",X"01",X"D9", + X"02",X"D7",X"01",X"FF",X"01",X"D2",X"02",X"CC",X"01",X"FF",X"01",X"C9",X"02",X"CC",X"02",X"FF", + X"02",X"E6",X"02",X"FF",X"03",X"CC",X"06",X"FF",X"FF",X"00",X"00",X"00",X"04",X"D9",X"02",X"D7", + X"01",X"FF",X"01",X"D9",X"01",X"D2",X"01",X"FF",X"04",X"D9",X"01",X"DD",X"01",X"FF",X"01",X"DF", + X"01",X"FF",X"01",X"E1",X"01",X"FF",X"01",X"E2",X"01",X"FF",X"01",X"E4",X"01",X"FF",X"02",X"E6", + X"07",X"FF",X"FF",X"00",X"00",X"00",X"01",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"18",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"C8",X"D0",X"00",X"00",X"02",X"1B", + X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"04",X"00",X"FD",X"00",X"00",X"00",X"00",X"08", + X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"00",X"E8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"B1",X"46",X"10",X"02",X"E1",X"17",X"00",X"00",X"00",X"00",X"00",X"29", + X"00",X"03",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1D",X"25", + X"1D",X"38",X"1D",X"2E",X"00",X"00",X"00",X"00",X"C5",X"26",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"C3",X"01",X"18",X"27",X"C2",X"04",X"18",X"2D",X"C3",X"05",X"18",X"33", + X"C2",X"06",X"18",X"39",X"C3",X"02",X"18",X"3F",X"C2",X"03",X"18",X"45",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn06 b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn06 new file mode 100644 index 00000000..2000072a --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn06 @@ -0,0 +1 @@ +                                                                                                                    \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn06.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn06.vhd new file mode 100644 index 00000000..0715686a --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn06.vhd @@ -0,0 +1,86 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity tn06 is +port ( + clk : in std_logic; + addr : in std_logic_vector(9 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of tn06 is + type rom is array(0 to 1023) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0E",X"0E",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0E",X"0E",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0E",X"0E",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0E",X"0E",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0E",X"0E",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D", + X"0B",X"0B",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D", + X"0F",X"0F",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D", + X"0F",X"0F",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D", + X"0F",X"0F",X"0D",X"0E",X"0E",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn07 b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn07 new file mode 100644 index 00000000..7d88e647 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn07 @@ -0,0 +1 @@ +                                                                                                                 \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn07.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn07.vhd new file mode 100644 index 00000000..580a92a7 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/roms/tn07.vhd @@ -0,0 +1,86 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity tn07 is +port ( + clk : in std_logic; + addr : in std_logic_vector(9 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of tn07 is + type rom is array(0 to 1023) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0D",X"0D",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0D",X"0D",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0D",X"0D",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0D",X"0D",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0D",X"0D",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0E",X"0E", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"09",X"09", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D", + X"0B",X"0B",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0D",X"09",X"09",X"09",X"09",X"0D",X"0D",X"0D",X"0F",X"0F",X"0F",X"0D", + X"0D",X"0D",X"0B",X"0B",X"0B",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"0E",X"09",X"0F",X"0D",X"0D"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/spram.vhd b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/spram.vhd new file mode 100644 index 00000000..d8043481 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BalloonBomber_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/BlueShark.qpf b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/BlueShark.qpf new file mode 100644 index 00000000..9f69ea50 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/BlueShark.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2013 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.0 Build 162 10/23/2013 SJ Web Edition +# Date created = 21:27:39 November 20, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "21:27:39 November 20, 2017" + +# Revisions + +PROJECT_REVISION = "BlueShark" diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/BlueShark.qsf b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/BlueShark.qsf new file mode 100644 index 00000000..981a7773 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/BlueShark.qsf @@ -0,0 +1,172 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 15:17:52 June 06, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# BlueShark_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/BlueShark_mist.sv +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/BlueShark_memory.sv +set_global_assignment -name VHDL_FILE rtl/sprom.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/BlueShark_Overlay.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name QIP_FILE ../../../../common/mist/mist.qip + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name TOP_LEVEL_ENTITY BlueShark_mist + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" + +# Advanced I/O Timing Assignments +# =============================== +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall + +# start EDA_TOOL_SETTINGS(eda_simulation) +# --------------------------------------- + + # EDA Netlist Writer Assignments + # ============================== + set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# ---------------------------- +# start ENTITY(BlueShark_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top + set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top + set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(BlueShark_mist) +# -------------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/BlueShark.sdc b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/BlueShark.sdc new file mode 100644 index 00000000..f91c127c --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/BlueShark.sdc @@ -0,0 +1,126 @@ +## Generated SDC file "vectrex_MiST.out.sdc" + +## Copyright (C) 1991-2013 Altera Corporation +## Your use of Altera Corporation's design tools, logic functions +## and other software and tools, and its AMPP partner logic +## functions, and any output files from any of the foregoing +## (including device programming or simulation files), and any +## associated documentation or information are expressly subject +## to the terms and conditions of the Altera Program License +## Subscription Agreement, Altera MegaCore Function License +## Agreement, or other applicable license agreement, including, +## without limitation, that your use is for the sole purpose of +## programming logic devices manufactured by Altera and sold by +## Altera or its authorized distributors. Please refer to the +## applicable agreement for further details. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition" + +## DATE "Sun Jun 24 12:53:00 2018" + +## +## DEVICE "EP3C25E144C8" +## + +# Clock constraints + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty + +# tsu/th constraints + +# tco constraints + +# tpd constraints + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + + + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] + +#************************************************************** +# Create Generated Clock +#************************************************************** + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + +#************************************************************** +# Set Input Delay +#************************************************************** + +set_input_delay -add_delay -clock_fall -clock [get_clocks {CLOCK_27}] 1.000 [get_ports {CLOCK_27}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {CONF_DATA0}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DI}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SCK}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}] + +#************************************************************** +# Set Output Delay +#************************************************************** + +set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_L}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_R}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {LED}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {VGA_*}] + +#************************************************************** +# Set Clock Groups +#************************************************************** + +set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}] + +#************************************************************** +# Set False Path +#************************************************************** + + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + +set_multicycle_path -to {VGA_*[*]} -setup 2 +set_multicycle_path -to {VGA_*[*]} -hold 1 + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/README.txt b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/README.txt new file mode 100644 index 00000000..07c9cf12 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/README.txt @@ -0,0 +1,26 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Blue Shark port to MiST by Gehstock +-- 05 June 2019 +-- +--------------------------------------------------------------------------------- +-- +-- Midway 8080 Hardware +-- Audio based on work by Paul Walsh. +-- Audio and scan converter by MikeJ. +--------------------------------------------------------------------------------- +-- +-- +-- Keyboard inputs : +-- +-- F1 : Start +-- SPACE : Fire +-- RIGHT/LEFT : Movement +-- +-- Joystick support. +-- +-- +--------------------------------------------------------------------------------- +ToDo: Color Prom + Controls + DIP + diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/Snapshot/BlueShark.rbf b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/Snapshot/BlueShark.rbf new file mode 100644 index 0000000000000000000000000000000000000000..5eec0415a4ed61c547821e69ebed2d11ce2f87ee GIT binary patch literal 241979 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 A?f?J) literal 0 HcmV?d00001 diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/clean.bat b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/doc/Blue_Shark_-_1978_-_Midway_Games.pdf b/Arcade_MiST/Midway-Taito 8080 Hardware/BlueShark_MiST/doc/Blue_Shark_-_1978_-_Midway_Games.pdf new file mode 100644 index 0000000000000000000000000000000000000000..efc34017048fb9085f060aa6794231c68af43df2 GIT binary patch literal 2564891 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