diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/DefenderHardware.sdc b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/DefenderHardware.sdc index 1c565ca0..13477d83 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/DefenderHardware.sdc +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/DefenderHardware.sdc @@ -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 diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/ReadMe.txt b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/ReadMe.txt index 2265b0dd..57f083ff 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/ReadMe.txt +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/ReadMe.txt @@ -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) diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Colony7.mra b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Colony7.mra new file mode 100644 index 00000000..a38f9e3f --- /dev/null +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Colony7.mra @@ -0,0 +1,33 @@ + + Colony 7 (set 1) + 0216 + colony7 + 201911270000 + 1981 + Taito + Space / Shooter + defender + + 1 + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Defender.mra b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Defender.mra new file mode 100644 index 00000000..a817d89e --- /dev/null +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Defender.mra @@ -0,0 +1,37 @@ + + Defender (Red label) + 0216 + 201911270000 + 1980 + Williams + Space / Defender + defender + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Jin.mra b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Jin.mra new file mode 100644 index 00000000..bbe18afe --- /dev/null +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Jin.mra @@ -0,0 +1,29 @@ + + Jin + 0216 + jin + 201911270000 + 1982 + Falcon + Maze / Qix + defender + + 3 + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Mayday.mra b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Mayday.mra new file mode 100644 index 00000000..adf130be --- /dev/null +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Mayday.mra @@ -0,0 +1,93 @@ + + Mayday (set 1) + 0216 + mayday + 201911270000 + 1980 + Hoei + Space / Defender + defender + + 2 + + + + + + + + + + +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 + + +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 + + + + + + diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/rtl/Defender_MiST.sv b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/rtl/Defender_MiST.sv index d7006e43..042e85af 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/rtl/Defender_MiST.sv +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/rtl/Defender_MiST.sv @@ -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 diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/rtl/pll_mist.vhd b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/rtl/pll_mist.vhd index c6ccb266..cb9f503e 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/rtl/pll_mist.vhd +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/rtl/pll_mist.vhd @@ -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"