Space Invaders arcade machine
This is a Clash implementation of the 1978 Space Invaders arcade machine by Taito.
This code is part of the book Retrocomputing with Clash: Haskell for FPGA Hardware Design at https://unsafePerform.IO/retroclash/.
- CPU: Intel 8080.
- Video: 256x224 monochrome at 60 FPS, backed by a 7168x8 bit framebuffer. IRQs triggered on lines 96 and 224. The screen was rotated 90 degrees to be in portrait orientation.
- Sound: TI SN76477 connected to the CPU via two 8-bit ports
- Inputs: coin deposit detector, two sets of buttons for starting the game, and moving and firing, for two-player mode.
- CPU: Implemented based on abstract descriptions of Intel 8080 ISA, with no reference to real implementation. Not cycle-accurate, but aims to pass various functional tests.
- Video: Standard 640x480@60Hz VGA, with 25.175MHz pixel clock. Logical "pixels" are scaled 2x2, but the layout is not rotated to keep interrupt timings.
- Framebuffer: The video system has priority over the CPU: memory reads from the framebuffer area will block the CPU until the video system is done reading.
- Sound: Unimplemented.
- Direct pushbuttons
- PS/2 keyboard:
Cto deposit a coin,
Enterto start 1P game, and
RCtrlto move and fire with P1.
This implementation doesn't aim to be cycle-accurate; it wouldn't matter for much anyway, since the CPU runs at the VGA output pixel clock of 25 MHz, whereas the real cabinet ran at 2 MHz. Luckily, Space Invaders does all animations keyed to two 60 Hz timers triggered by the video system.
Sound is not implemented at all.
The back-panel DIP switches are not yet mapped to anything.
Included are rudimentary Shake rules to build for various hobbyist FPGA dev boards:
The Xilinx Spartan-6 based Papilio Pro or the Spartan-3 based Papilio One, both with the Arcade mega-wing. These use the Xilinx ISE toolchain.
The Xilinx Artrix-7 based Nexys A7. This uses the Xilinx Vivado toolchain.
Make a file called
build.mk with content similar to the following:
TARGET = papilio-pro-arcade CLASH = stack exec -- ISE = ~/prog/docker/xilinx-14.7-ubuntu-12.04/run VIVADO = ~/prog/docker/xilinx-2019.1-ubuntu-18.04/run
VIVADO fields are to optionally wrap
invocations of the Clash compiler and the Xilinx ISE / Vivado
toolchain in case you want to run them via Stack, Docker, Nix, etc.
Then you can build for the Papilio Pro by running the included