FPGA core for Darius (Taito Corporation, 1986) targeting the MiSTer FPGA platform (Terasic DE10-Nano).
Darius runs on a dual 68000 + Z80 ×2 board with two PC080SN tile layers, PC090OJ sprites, PC060HA master/slave communication, and YM2203 ×2 + MSM5205 audio, driving the game's signature triple-screen ultra-wide display. This core reimplements the hardware in SystemVerilog from MAME references and hardware observation on original PCBs.
Darius is Taito's landmark horizontal shoot-'em-up, famous for its three-monitor ultra-wide screen and its all-aquatic-themed mechanical bosses. You pilot the Silver Hawk starfighter through a branching tree of zones (pick your path at the end of each stage), fighting waves of enemies to a memorable Zuntata soundtrack, with the iconic "Warning!! A huge battleship is approaching" boss cadence. The board composes three horizontal panels into one continuous 864-pixel-wide playfield.
Current version: 1.8 (July 2026)
The core runs the full game end-to-end on all supported ROM sets and has been tested on real MiSTer hardware. Since v1.1 the audio path, the sprite engine and the video/CRT tooling have been substantially reworked, and an experimental savestate system (16 slots) has been added.
- Sprite engine fixes — the sprite object RAM is now double-buffered and latched at vblank (buffered sprite RAM, like the original hardware). This removes a rare but real defect where a mid-frame CPU update of the sprite list produced inconsistent scanlines (part of the screen using the old sprite data, part the new). Line preparation was also reworked with a shadow-scan FIFO and a small sprite-ROM cache to reduce SDRAM contention.
- Audio mixer rework — a new per-channel mixer (9 channels: FM ×2, PSG/SSG ×6, MSM5205 ADPCM) with per-channel volume and pan exposed in the OSD, a linear/transparent gain chain and a final soft-clip stage sized on the real worst case (no more square-wave saturation when many voices sum). The ADPCM ROM was moved into BRAM for deterministic latency, and various sound path fixes improve accuracy.
- Experimental savestate — 16 slots — full video / CPU state plus a deterministic audio restore. Select the slot from the OSD. Still experimental: see Known issues.
- CRT Adjust module — a core-side analog CRT alignment tool (validated and released, see the dedicated section below), bringing H-Size, H-Position and V-Shift together in one line-buffer module that never desyncs the CRT. Alongside it, an experimental set of single-screen views for the triple screen — Screen Jump, triple-screen wide and a follow-cam mode that tracks the Silver Hawk — opt-in from the OSD.
- DSP / BRAM optimizations across the audio mixer and video path.
- Savestate is experimental. It works across the 16 slots but is not guaranteed solid in every situation; loading a state saved by an older build is not supported. Kept under observation.
- Experimental single-screen views — the triple-screen views (Screen Jump, wide zoom, follow-cam) are opt-in and still being refined. (CRT Adjust itself — H-Size / H-Position / V-Shift — is validated and released, not experimental.)
- 15 kHz CRT output — the native 864-pixel triple-panel resolution is hard on the MiSTer analog I/O board, but the new experimental CRT views (wide zoom, Triple CRT Wide, follow-cam) make 15 kHz usable — a lot more than before. The single-screen follow-cam / wide modes in particular give a proper CRT-friendly picture. This is via experimental features and not yet guaranteed in every mode.
- Boots and plays the full game with accurate video and controls on all sets
- Dual 68000 main/sub with shared RAM (FX68K core), PC060HA master/slave communication reproduced from MAME
- Three horizontal panels composed into the continuous 864-pixel screen
- Sprite renderer with priority, flip, 16×16 4bpp tiles, buffered (vblank-latched) sprite RAM, shadow-scan FIFO and sprite-ROM cache
- FG text / HUD layer with local BRAM text ROM
- Palette with MAME-verified byte order
- Full audio chain: YM2203 ×2 (FM + SSG/PSG) + MSM5205 ADPCM, per-channel mixer with volume/pan
- Experimental 16-slot savestate (video + CPU + deterministic audio)
- CRT Adjust (validated / released) — core-side analog geometry (H-Size, H-Position, V-Shift) that never desyncs the CRT
- Experimental single-screen views for a triple-screen game — wide zoom modes (288/320/432), Screen Jump, Triple CRT Wide, and a follow-cam that tracks the Silver Hawk: play the ultra-wide triple game on one monitor / CRT
- Make the savestate solid enough to drop the "experimental" tag
- Finish and stabilize the single-screen / follow-cam views
- Optional high-score saving (NVRAM) — under evaluation, deliberately non-invasive (no CPU pause), not in this release
Features
- Dual 68000 main/sub @ 8 MHz with shared RAM (FX68K core)
- Two Z80 sound CPUs (music + ADPCM/FX)
- Three horizontal panels composed into the 864-pixel virtual screen
- Sprite renderer with priority, flip, 16×16 4bpp tiles, buffered sprite RAM
- FG text/HUD layer with local BRAM text ROM
- Palette with MAME-verified byte order
- Audio: YM2203 ×2 (FM + PSG) + MSM5205 ADPCM with per-channel volume/pan mixer
- PC060HA main/sub communication
- SDRAM arbitration for tile/sprite ROM and main/sub CPU fetch
- Experimental savestate (16 slots) from the OSD
- CRT Adjust (H-Size / H-Position / V-Shift) — validated and released
- Experimental single-screen views (Screen Jump, triple wide, follow-cam)
- Inputs (coin, start, 8-way joystick) and full DIP switch support
- MiSTer OSD with video, audio-mix, pause and DIP options
- Pause overlay with project logo, scrolling supporters list and social links
- "Clean Pause" OSD option (pause without dim/logo overlay)
ROM sets supported
- Darius (World) — reference set
- Darius (US)
- Darius (Japan rev 1 — dariusj)
- Darius (Japan pure — dariuso)
- Darius Extra Version (dariuse)
CRT Adjust is a core-side analog CRT geometry / alignment tool exposed in the OSD — validated and released (not experimental). It is the evolution of the earlier "Analog H-Size" module: a single always-on line buffer that provides three live controls for lining the image up perfectly on a real CRT.
| Control | What it does |
|---|---|
| H-Size | Horizontal stretch / squeeze — bidirectional, integer (every source pixel is emitted for a whole number of pixel clocks) |
| H-Position | Horizontal image shift — moves the picture content, not the sync |
| V-Shift | Vertical line shift |
Why it never desyncs the CRT. The picture content is shifted and resized through the line buffer while the horizontal/vertical sync signals stay native. The CRT keeps its lock at all times, so you can slide and resize the image live without the screen rolling or losing hold — unlike moving the blanking / sync windows.
Because the resize is integer (no fractional ratio, no per-pixel nearest-neighbor) and the output is the byte-exact source pixel, there is no shimmering on moving content and no blending / blur — the image stays sharp while you stretch it.
The module is inserted core-side at the video-output boundary, with zero
sys/ framework changes (MiSTer-devel compliant — the framework is never
modified). The trade-off is that the adjustment reaches the analog DAC and
HDMI follows it too: leave CRT Adjust Off (default) for an untouched HDMI
image, and turn it on when aligning on an analog CRT. Cost is about 1 M10K,
~50 ALM, 0 DSP.
Darius is a three-monitor game: its native picture is an 864-pixel-wide triple panel. On a single modern display that means a very wide, short image. This core adds a unique set of display modes — as far as we know nothing else on MiSTer does this — that reshape the triple screen for a single monitor without touching the game logic and while keeping the native 15.7 kHz line rate (so it stays CRT-friendly and never desyncs).
The picture is captured after the compositor, buffered per line (lossless), and re-emitted into a wider active window with integer pixel repeat — so the image genuinely grows on a CRT with no blur and no shimmer.
| Mode | What you get |
|---|---|
| Triple | Native triple panel (864 px) — bypass, unchanged |
| Wide 288 ×4 | Single-panel window, panel proportions, zoomed |
| Wide 320 ×4 | "4:3-pushed" window (1280 active slots) |
| Wide 432 ×3 | ~1.5-screen window (1296 active slots) |
| Screen Jump | Single-panel view that jumps panel-to-panel with the action |
| Triple CRT Wide | Native triple re-emitted at a wider integer rate (864 active over ~1018 slots) so the whole triple screen fills a CRT line — integer 1:1 repeat, no scaling |
- Follow-cam — instead of showing all three panels, the view becomes a single zoomed screen that follows the Silver Hawk: the camera tracks the ship (deadzone + smooth slew, updated at end of vblank) and eases back to the playfield center when the ship is absent (title / death). It turns the ultra-wide triple game into a normal-proportioned single-screen experience you can actually play comfortably on one monitor / CRT.
All of the above are experimental, opt-in from the OSD, and leave the default Triple view untouched.
![]() |
![]() |
| Title screen | Attract — Silver Hawk briefing |
![]() |
![]() |
| Zone C | Zone I |
![]() |
![]() |
| Zone S | Zone G |
| Component | Spec |
|---|---|
| Main CPU | Motorola 68000 @ 8 MHz (FX68K) |
| Sub CPU | Motorola 68000 @ 8 MHz (FX68K) |
| Sound CPU | Z80 ×2 (music + ADPCM/FX) |
| Sound chip 1 | Yamaha YM2203 OPN ×2 — FM + SSG/PSG (jt12) |
| Sound chip 2 | OKI MSM5205 ADPCM (jt5205) |
| Tilemaps | Taito PC080SN ×2 (two scrolling tile layers) |
| Sprites | Taito PC090OJ (16×16 4bpp, buffered sprite RAM) |
| Comms | Taito PC060HA (master/slave) |
| Display | Triple horizontal panels → 864×224 |
- Terasic DE10-Nano
- MiSTer I/O board (recommended)
- SDRAM module (128 MB, 64 MB or 32 MB)
- HDMI display (recommended), or HDMI→VGA adapter for 31 kHz VGA monitors
Note on video output: The core works on standard HDMI displays. For 31 kHz VGA monitors, use an HDMI→VGA adapter — do not enable Direct Video. 15 kHz CRT output is not currently supported because the 864×224 triple-panel resolution is incompatible with the MiSTer analog I/O board.
Requires Quartus Prime Lite 17.0.x for Cyclone V (5CSEBA6U23I7).
cd Arcade-Darius_MiSTer
quartus_sh --flow compile Darius -c DariusOutput: output_files/Darius.rbf (~3.9 MB).
The releases/ folder contains the pre-built bitstream and the parent MRA for the reference ROM set:
Darius_YYYYMMDD.rbf— pre-built core bitstreamDarius (World).mra— parent MRA (reference set)
Alternative ROM sets are provided in releases/alternatives/:
Darius (US).mraDarius (Japan).mraDarius (Japan, rev 1).mraDarius Extra Version (Japan).mra
Following the MiSTer-devel convention, the alternative sets are also mirrored to the official MRA-Alternatives_MiSTer repository, where they are picked up automatically by Update_All.
Steps:
- Copy the
.rbfto_Arcade/cores/on the MiSTer SD card. - Copy the desired
.mrafile(s) to_Arcade/on the MiSTer SD card. - Provide your legally-owned Darius ROM files where each MRA expects them
(usually in
games/mame/). - For HDMI displays, no special setup is required. For 31 kHz VGA monitors, use an HDMI→VGA adapter (do not enable Direct Video). 15 kHz CRT output is not currently supported (see Hardware requirements).
- The core OSD defaults to Narrower HV-Integer scale, which gives a proper integer-scaled image on modern HDMI displays. Other Scale options (V-Integer, HV-Integer) are available for custom setups.
ROMs are NOT included in this repository. You must provide them yourself.
Arcade-Darius_MiSTer/
├── rtl/
│ ├── darius/ Darius-specific core RTL (Umberto Parisi)
│ ├── fx68k/ M68000 core (Jorge Cwik)
│ ├── jt12/ YM2203 FM synth (Jose Tejada)
│ ├── jt5205/ MSM5205 ADPCM (Jose Tejada)
│ ├── jtframe/ JTFRAME framework modules (Jose Tejada)
│ ├── t80/ Z80 core
│ ├── pll/ Clock PLL
│ └── sdram.sv SDRAM controller (Sorgelig)
├── sys/ MiSTer framework (Sorgelig / MiSTer-devel)
├── releases/ Pre-built .rbf + parent MRA
│ └── alternatives/ MRA files for alternate ROM sets
├── docs/ Screenshots
├── Darius.qpf Quartus project
├── Darius.qsf Quartus assignments
├── Template.sv Top-level wrapper
├── Template.sdc Timing constraints
├── files.qip HDL file list
├── build_id.v Build version stamp
├── LICENSE GNU GPL v3
├── AUTHORS.md Credits and third-party licenses
└── README.md This file
Distributed under GNU General Public License v3 or later. See LICENSE and AUTHORS.md for credits and third-party licensing.
GPL-3 is chosen to stay compatible with upstream GPL-3 dependencies (JTFRAME, FX68K, Sorgelig's sdram and sys framework).
- Jorge Cwik — FX68K (M68000 core)
- Jose Tejada (@jotego) — JTFRAME, JT12 (YM2203), JT5205 (MSM5205)
- Sorgelig and the MiSTer-devel team — framework, SDRAM controller and Template
- Andrea Bogazzi (@asturur) — help with the core-side CRT Adjust / Analog H-Size implementation
- The MAMEDev team — invaluable reference on the Taito PC080SN / PC090OJ / PC060HA hardware, memory maps and timing
Full list in AUTHORS.md.
If you enjoy this core and want to support its development:
- GitHub
- Twitch — live streams
- YouTube — playlists and videos
- X / Twitter
Original Darius arcade hardware © Taito Corporation, 1986.





