1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-01-20 01:34:38 +00:00

Defender HW: single RBF

This commit is contained in:
Gyorgy Szombathelyi 2020-02-11 12:48:06 +01:00
parent 4adec34f5b
commit ab5003701b
8 changed files with 310 additions and 61 deletions

View File

@ -119,8 +119,8 @@ set_clock_groups -asynchronous -group [get_clocks $sdram_clk] -group [get_clocks
set_multicycle_path -from [get_clocks $game_clk] -to [get_clocks $sdram_clk] -setup 2
set_multicycle_path -from [get_clocks $game_clk] -to [get_clocks $sdram_clk] -hold 1
set_multicycle_path -to {VGA_*[*]} -setup 2
set_multicycle_path -to {VGA_*[*]} -hold 1
set_multicycle_path -to {VGA_*[*]} -setup 3
set_multicycle_path -to {VGA_*[*]} -hold 2
#**************************************************************
# Set Maximum Delay

View File

@ -3,6 +3,16 @@
-- Arcade: Defender port to MiST by Gehstock
-- 11 June 2019
--
--
-- Usage:
-- - Create ROM and ARC files from the MRA files in the meta directory
-- using the MRA utility.
-- Example: mra -A -z /path/to/mame/roms Defender.mra
-- - Copy the ROM files to the root of the SD Card
-- - Copy the RBF and ARC files to the same folder on the SD Card
--
-- MRA utility: https://github.com/sebdel/mra-tools-c/
--
---------------------------------------------------------------------------------
-- A simulation model of Williams 6809 hardware
-- by Dar (darfpga@aol.fr)

View File

@ -0,0 +1,33 @@
<misterromdescription>
<name>Colony 7 (set 1)</name>
<mameversion>0216</mameversion>
<setname>colony7</setname>
<mratimestamp>201911270000</mratimestamp>
<year>1981</year>
<manufacturer>Taito</manufacturer>
<category>Space / Shooter</category>
<rbf>defender</rbf>
<rom index="1"><part>1</part></rom>
<switches>
<dip bits="10" name="Lives" ids="2,3"/>
<dip bits="11" name="Bonus" ids="20k/40k(30k/50k),30k/50k(40k/70k)"/>
</switches>
<rom index="0" zip="colony7.zip" md5="a7d3286ded800538d379816ade2c0d12" type="merged|nonmerged">
<part name="cs03.bin"/>
<part name="cs02.bin"/>
<part name="cs01.bin"/>
<part name="cs06.bin"/>
<part name="cs04.bin"/>
<part name="cs07.bin"/>
<part name="cs05.bin"/>
<part name="cs08.bin" repeat="4"/>
<part name="cs10.bin"/>
<part name="decoder.3"/>
<part name="cs11.bin"/>
</rom>
</misterromdescription>

View File

@ -0,0 +1,37 @@
<misterromdescription>
<name>Defender (Red label)</name>
<mameversion>0216</mameversion>
<mratimestamp>201911270000</mratimestamp>
<year>1980</year>
<manufacturer>Williams</manufacturer>
<category>Space / Defender</category>
<rbf>defender</rbf>
<rom index="1"><part>0</part></rom>
<switches>
<dip bits="7" name="Auto up" ids="Off,On"/>
<dip bits="8" name="Advance"/>
<dip bits="9" name="HS Reset"/>
</switches>
<rom index="0" zip="defender.zip" md5="2173eef0c95ff44752cd36981c909c6d" type="merged|nonmerged">
<part name="defend.1"/>
<part name="defend.4"/>
<part name="defend.2"/>
<part name="defend.3"/>
<part name="defend.9"/>
<part name="defend.12"/>
<part name="defend.8"/>
<part name="defend.11"/>
<part name="defend.7"/>
<part name="defend.10"/>
<part name="defend.6"/>
<part name="defend.6"/>
<part name="decoder.2"/>
<part name="decoder.3"/>
<part name="defend.snd"/>
</rom>
</misterromdescription>

View File

@ -0,0 +1,29 @@
<misterromdescription>
<name>Jin</name>
<mameversion>0216</mameversion>
<setname>jin</setname>
<mratimestamp>201911270000</mratimestamp>
<year>1982</year>
<manufacturer>Falcon</manufacturer>
<category>Maze / Qix</category>
<rbf>defender</rbf>
<rom index="1"><part>3</part></rom>
<switches>
<dip bits="10" name="Lives" ids="3,4"/>
<dip bits="11,12" name="Level complete" ids="85%,75%,65%,55%"/>
</switches>
<rom index="0" zip="jin.zip" md5="9dd8c4ad8ed7f3c9f392d1790c61e4a8" type="merged|nonmerged">
<part name="jin11.6c"/>
<part name="jin12.7c"/>
<part name="jin13.6d"/>
<part name="jin14.4c" repeat=4/>
<part name="jin.1a"/>
<part name="jin.1l"/>
<part name="jin15.3f"/>
</rom>
</misterromdescription>

View File

@ -0,0 +1,93 @@
<misterromdescription>
<name>Mayday (set 1)</name>
<mameversion>0216</mameversion>
<setname>mayday</setname>
<mratimestamp>201911270000</mratimestamp>
<year>1980</year>
<manufacturer>Hoei</manufacturer>
<category>Space / Defender</category>
<rbf>defender</rbf>
<rom index="1"><part>2</part></rom>
<rom index="0" zip="mayday.zip" md5="732cf6e3f85c3ff6e37a8e6c84fad349" type="merged|nonmerged">
<part name="ic03-3.bin"/>
<part name="ic02-2.bin"/>
<part name="ic01-1.bin"/>
<part name="ic04-4.bin"/>
<part name="ic05-5.bin"/>
<part name="ic06-6.bin"/>
<part name="ic07-7d.bin"/>
<part>
00 40 80 01 41 81 02 42 82 03 43 83 04 44 84 05
45 85 06 46 86 07 47 87 08 48 88 09 49 89 0a 4a
8a 0b 4b 8b 0c 4c 8c 0d 4d 8d 0e 4e 8e 0f 4f 8f
10 50 90 11 51 91 12 52 92 13 53 93 14 54 94 15
55 95 16 56 96 17 57 97 18 58 98 19 59 99 1a 5a
9a 1b 5b 9b 1c 5c 9c 1d 5d 9d 1e 5e 9e 1f 5f 9f
20 60 a0 21 61 a1 22 62 a2 23 63 a3 24 64 a4 25
65 a5 26 66 a6 27 67 a7 28 68 a8 29 69 a9 2a 6a
aa 2b 6b ab 2c 6c ac 2d 6d ad 2e 6e ae 2f 6f af
30 70 b0 31 71 b1 32 72 b2 33 73 b3 34 74 b4 35
75 b5 36 76 b6 37 77 b7 38 78 b8 39 79 b9 3a 7a
ba 3b 7b bb 3c 7c bc 3d 7d bd 3e 7e be 3f 7f bf
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 40 80 01 41 72 32 b1 71 31 b0 70 30 af 6f 2f
ae 6e 2e ad 6d 2d ac 6c 2c ab 6b 2b aa 6a 2a a9
69 29 a8 68 28 a7 67 27 a6 66 26 a5 65 25 a4 64
24 a3 63 23 a2 62 22 a1 61 21 a0 60 20 9f 5f 1f
9e 5e 1e 9d 5d 1d 9c 5c 1c 9b 5b 1b 9a 5a 1a 99
59 19 98 58 18 97 57 17 96 56 16 95 55 15 94 54
14 93 53 13 92 52 12 91 51 11 90 50 10 8f 4f 0f
8e 4e 0e 8d 4d 0d 8c 4c 0c 8b 4b 0b 8a 4a 0a 89
49 09 88 48 08 87 47 07 86 46 06 85 45 05 84 44
04 83 43 03 82 42 02 81 b2 33 73 b3 34 74 b4 35
75 b5 36 76 b6 37 77 b7 38 78 b8 39 79 b9 3a 7a
ba 3b 7b bb 3c 7c bc 3d 7d bd 3e 7e be 3f 7f bf
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
</part>
<part>
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f
80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f
90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f
a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af
b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf
c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf
d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df
e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef
f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff
fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee ed ec
eb ea e9 e8 e7 e6 e5 e4 e3 e2 e1 e0 df de dd dc
db da d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 cf ce cd cc
cb ca c9 c8 c7 c6 c5 c4 c3 c2 c1 c0 bf be bd bc
bb ba b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 af ae ad ac
ab aa a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 9f 9e 9d 9c
9b 9a 99 98 97 96 95 94 93 92 91 90 8f 8e 8d 8c
8b 8a 89 88 87 86 85 84 83 82 81 80 7f 7e 7d 7c
7b 7a 79 78 77 76 75 74 73 72 71 70 6f 6e 6d 6c
6b 6a 69 68 67 66 65 64 63 62 61 60 5f 5e 5d 5c
5b 5a 59 58 57 56 55 54 53 52 51 50 4f 4e 4d 4c
4b 4a 49 48 47 46 45 44 43 42 41 40 3f 3e 3d 3c
3b 3a 39 38 37 36 35 34 33 32 31 30 2f 2e 2d 2c
2b 2a 29 28 27 26 25 24 23 22 21 20 1f 1e 1d 1c
1b 1a 19 18 17 16 15 14 13 12 11 10 0f 0e 0d 0c
0b 0a 09 08 07 06 05 04 03 02 01 00 fc fd fe ff
</part>
<part name="ic28-8.bin"/>
</rom>
</misterromdescription>

View File

@ -34,21 +34,31 @@ module Defender_MiST(
`include "rtl/build_id.v"
//`define CORE_NAME "DEFENDER"
//`define CORE_NAME "COLONY7"
//`define CORE_NAME "MAYDAY"
`define CORE_NAME "JIN"
`define CORE_NAME "DEFENDER"
localparam CONF_STR = {
`CORE_NAME,";ROM;",
"O2,Rotate Controls,Off,On;",
"O34,Scanlines,Off,25%,50%,75%;",
"O5,Blend,Off,On;",
"DIP;",
"T0,Reset;",
"V,v1.2.",`BUILD_DATE
};
wire rotate = status[2];
wire rotate = status[2];
wire [1:0] scanlines = status[4:3];
wire blend = status[5];
wire autoup = status[7];
wire adv = status[8];
wire hsr = status[9];
wire advance, hsreset;
trigger adv_button(clk_sys, adv, advance);
trigger hsr_button(clk_sys, hsr, hsreset);
wire [6:0] core_mod;
reg [8*8-1:0] core_name;
reg [7:0] input0;
reg [7:0] input1;
reg [7:0] input2;
@ -61,7 +71,10 @@ always @(*) begin
input1 = 0;
input2 = 0;
orientation = 2'b10;
if (`CORE_NAME == "DEFENDER") begin
case (core_mod)
7'h0: // DEFENDER
begin
/*
-- pia rom board port a - input0
-- bit 0 Auto Up / manual Down
@ -73,7 +86,7 @@ always @(*) begin
-- bit 6 led 2 (output)
-- bit 7 led 1 (output)
*/
input0 = { 3'b000, m_coin1, 1'b0/*btn_score_reset*/, 1'b0, m_fireF, m_fireE };
input0 = { 3'b000, m_coin1, /*btn_score_reset*/hsreset, 1'b0, advance, autoup };
/*
-- pia io port a - input1
-- bit 0 Fire
@ -93,36 +106,45 @@ always @(*) begin
-- other <= GND
*/
input2 = { 7'b000000, m_up };
end else if (`CORE_NAME == "COLONY7") begin
end
7'h1: // COLONY7
begin
orientation = 2'b01;
input0 = { 3'b000, m_coin1, 4'b0001 };
input0 = { 3'b000, m_coin1, 2'b00, /*bonus at*/status[11], /*lives23*/status[10] };
input1 = { m_fireB, m_fireA, m_one_player, m_two_players, m_up, m_left, m_right, m_down };
input2 = { 7'b000000, m_fireC };
end else if (`CORE_NAME == "MAYDAY") begin
end
7'h2: // MAYDAY
begin
mayday = 1;
input0 = { 2'b00, m_coin2, m_coin1, 1'b0, 1'b0/*service*/, m_fireF, m_fireE };
input0 = { 2'b00, m_coin2, m_coin1, 1'b0, hsreset, advance, autoup };
input1 = { m_down, 1'b0, m_one_player, m_two_players, m_fireB, m_fireC, m_right, m_fireA };
input2 = { 7'b000000, m_up };
end else if (`CORE_NAME == "JIN") begin
end
7'h3: // JIN
begin
orientation = 2'b11;
input0 = { 3'b000, m_coin2, m_coin1, 3'b000 };
input1 = { m_fireB, m_fireA, m_one_player, m_two_players, m_right, m_left, m_down, m_up };
//unknown/Level completed/Level completed/unknown/Lives/Coinage/Coinage/Coinage
input2 = 0;
input2 = { 1'b0, ~status[12:11], 1'b0, status[10], 3'b000 };
end
default: ;
endcase
end
assign LED = ~ioctl_downl;
assign SDRAM_CLK = clk_sys;
assign SDRAM_CLK = clk_mem;
assign SDRAM_CKE = 1;
wire clk_sys, clk_6, clk_0p89;
wire clk_sys, clk_vid, clk_mem = clk_vid, clk_0p89;
wire pll_locked;
pll_mist pll(
.inclk0(CLOCK_27),
.areset(0),
.c0(clk_sys),//54
.c1(clk_6),//6
.c0(clk_vid),//72
.c1(clk_sys),//6
.c2(clk_0p89),//0.89
.locked(pll_locked)
);
@ -134,15 +156,34 @@ wire [7:0] joystick_0;
wire [7:0] joystick_1;
wire scandoublerD;
wire ypbpr;
wire [7:0] audio;
wire hs, vs;
wire blankn;
wire [2:0] r,g;
wire [1:0] b;
wire no_csync;
wire key_pressed;
wire [7:0] key_code;
wire key_strobe;
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 ),
.no_csync (no_csync ),
.core_mod (core_mod ),
.key_strobe (key_strobe ),
.key_pressed (key_pressed ),
.key_code (key_code ),
.joystick_0 (joystick_0 ),
.joystick_1 (joystick_1 ),
.status (status )
);
wire ioctl_downl;
wire [7:0] ioctl_index;
wire ioctl_wr;
@ -179,7 +220,7 @@ wire [15:0] snd_do;
sdram #(.MHZ(54)) sdram(
.*,
.init_n ( pll_locked ),
.clk ( clk_sys ),
.clk ( clk_mem ),
// port1 used for main CPU
.port1_req ( port1_req ),
@ -231,8 +272,14 @@ always @(posedge clk_sys) begin
reset <= status[0] | buttons[1] | ioctl_downl | ~rom_loaded;
end
wire [7:0] audio;
wire hs, vs;
wire blankn;
wire [2:0] r,g;
wire [1:0] b;
defender defender (
.clock_6 ( clk_6 ),
.clock_6 ( clk_sys ),
.clk_0p89 ( clk_0p89 ),
.reset ( reset ),
.video_r ( r ),
@ -263,7 +310,7 @@ defender defender (
);
mist_video #(.COLOR_DEPTH(3), .SD_HCNT_WIDTH(11)) mist_video(
.clk_sys ( clk_sys ),
.clk_sys ( clk_vid ),
.SPI_SCK ( SPI_SCK ),
.SPI_SS3 ( SPI_SS3 ),
.SPI_DI ( SPI_DI ),
@ -279,42 +326,22 @@ mist_video #(.COLOR_DEPTH(3), .SD_HCNT_WIDTH(11)) mist_video(
.VGA_HS ( VGA_HS ),
.rotate ( {orientation[1],rotate} ),
.scandoubler_disable( scandoublerD ),
.scanlines ( status[4:3] ),
.blend ( status[5] ),
.no_csync ( no_csync ),
.scanlines ( scanlines ),
.blend ( blend ),
.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 )
);
wire dac_o;
assign AUDIO_L = dac_o;
assign AUDIO_R = dac_o;
dac #(
.C_bits(8))
.C_bits(11))
dac(
.clk_i(clk_0p89),
.res_n_i(1),
.dac_i(audio),
.dac_i({3'b000, audio}), // silence by 9dB
.dac_o(dac_o)
);
@ -338,4 +365,24 @@ arcade_inputs inputs (
.player2 ( {m_fire2F, m_fire2E, m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2} )
);
endmodule
endmodule
module trigger (
input clk,
input btn,
output trigger
);
reg [23:0] counter;
assign trigger = (counter != 0);
always @(posedge clk) begin
reg btn_d;
btn_d <= btn;
if (~btn_d & btn) counter <= 24'hfffff;
if (counter != 0) counter <= counter - 1'd1;
end
endmodule

View File

@ -156,9 +156,9 @@ BEGIN
altpll_component : altpll
GENERIC MAP (
bandwidth_type => "AUTO",
clk0_divide_by => 1,
clk0_divide_by => 3,
clk0_duty_cycle => 50,
clk0_multiply_by => 2,
clk0_multiply_by => 8,
clk0_phase_shift => "0",
clk1_divide_by => 9,
clk1_duty_cycle => 50,
@ -255,7 +255,7 @@ END SYN;
-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000"
-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000"
-- Retrieval info: PRIVATE: DUTY_CYCLE2 STRING "50.00000000"
-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "54.000000"
-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "72.000000"
-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "6.000000"
-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "0.890110"
-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0"
@ -284,14 +284,14 @@ END SYN;
-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0"
-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0"
-- Retrieval info: PRIVATE: MIRROR_CLK2 STRING "0"
-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "6"
-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "4"
-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "2"
-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "3"
-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1"
-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "36.00000000"
-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "72.00000000"
-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "6.00000000"
-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "0.89000000"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz"
@ -343,9 +343,9 @@ END SYN;
-- 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 "1"
-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "3"
-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50"
-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "2"
-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8"
-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0"
-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9"
-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50"