1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-05-01 22:26:35 +00:00

Merge pull request #75 from gyurco/mcrcontrols

Some controls update, fix Pooyan, add DIP switches to Konami Classic
This commit is contained in:
Marcel
2020-02-16 11:18:37 +01:00
committed by GitHub
11 changed files with 286 additions and 231 deletions

View File

@@ -1,4 +1,5 @@
Test Test
*.rom *.rom
*.arc *.arc
*.ROM
*.ARC

View File

@@ -41,6 +41,11 @@ localparam CONF_STR = {
"V,v1.0.",`BUILD_DATE "V,v1.0.",`BUILD_DATE
}; };
wire [1:0] scanlines = status[4:3];
wire joyswap = status[6];
wire rotate = 0;
wire blend = status[5];
assign LED = ~ioctl_downl; assign LED = ~ioctl_downl;
assign SDRAM_CLK = clk_sd; assign SDRAM_CLK = clk_sd;
assign SDRAM_CKE = 1; assign SDRAM_CKE = 1;
@@ -59,15 +64,37 @@ pll_mist pll(
wire [31:0] status; wire [31:0] status;
wire [1:0] buttons; wire [1:0] buttons;
wire [1:0] switches; wire [1:0] switches;
wire [7:0] joy_0; wire [7:0] joystick_0;
wire [7:0] joy_1; wire [7:0] joystick_1;
wire scandoublerD; wire scandoublerD;
wire ypbpr; wire ypbpr;
wire [15:0] audio; wire no_csync;
wire hs, vs, hb, vb; wire key_pressed;
wire blankn = ~(hb | vb); wire [7:0] key_code;
wire [2:0] g, r; wire key_strobe;
wire [1:0] b;
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 ),
.key_strobe (key_strobe ),
.key_pressed (key_pressed ),
.key_code (key_code ),
.joystick_0 (joystick_0 ),
.joystick_1 (joystick_1 ),
.status (status )
);
wire [15:0] rom_addr; wire [15:0] rom_addr;
wire [15:0] rom_do; wire [15:0] rom_do;
wire [15:0] gfx_addr; wire [15:0] gfx_addr;
@@ -144,7 +171,12 @@ always @(posedge clk_sd) begin
reset <= status[0] | buttons[1] | ~rom_loaded; reset <= status[0] | buttons[1] | ~rom_loaded;
end end
wire [10:0] INP = ~{status[2],1'b1, btn_coin, m_left2, m_right2, m_down2, m_fire2, m_left1, m_right1, m_down1, m_fire1}; wire [10:0] INP = ~{status[2],1'b1, m_coin1 | m_coin2, m_left2, m_right2, m_down2, m_fire2A, m_left, m_right, m_down, m_fireA};
wire [15:0] audio;
wire hs, vs, hb, vb;
wire blankn = ~(hb | vb);
wire [2:0] g, r;
wire [1:0] b;
FPGA_ATetris FPGA_ATetris( FPGA_ATetris FPGA_ATetris(
.MCLK(clk_sys), // 14.318MHz .MCLK(clk_sys), // 14.318MHz
@@ -200,33 +232,13 @@ mist_video #(.COLOR_DEPTH(3), .SD_HCNT_WIDTH(10)) mist_video(
.VGA_VS ( VGA_VS ), .VGA_VS ( VGA_VS ),
.VGA_HS ( VGA_HS ), .VGA_HS ( VGA_HS ),
.ce_divider ( 1'b1 ), .ce_divider ( 1'b1 ),
.blend ( status[5] ), .blend ( blend ),
.no_csync ( no_csync ),
.scandoubler_disable(scandoublerD ), .scandoubler_disable(scandoublerD ),
.scanlines ( status[4:3] ), .scanlines ( scanlines ),
.ypbpr ( ypbpr ) .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 (joy_0 ),
.joystick_1 (joy_1 ),
.status (status )
);
dac #( dac #(
.C_bits(16)) .C_bits(16))
dac_l( dac_l(
@@ -236,49 +248,24 @@ dac_l(
.dac_o(AUDIO_L) .dac_o(AUDIO_L)
); );
wire [7:0] joystick_0 = status[6] ? joy_1 : joy_0; wire m_up, m_down, m_left, m_right, m_fireA, m_fireB, m_fireC, m_fireD;
wire [7:0] joystick_1 = status[6] ? joy_0 : joy_1; wire m_up2, m_down2, m_left2, m_right2, m_fire2A, m_fire2B, m_fire2C, m_fire2D;
wire m_tilt, m_coin1, m_coin2, m_coin3, m_coin4, m_one_player, m_two_players, m_three_players, m_four_players;
wire m_down1 = btn_down | joystick_0[2]; arcade_inputs inputs (
wire m_left1 = btn_left | joystick_0[1]; .clk ( clk_sys ),
wire m_right1 = btn_right | joystick_0[0]; .key_strobe ( key_strobe ),
wire m_fire1 = btn_fire1 | joystick_0[4]; .key_pressed ( key_pressed ),
.key_code ( key_code ),
wire m_down2 = joystick_1[2]; .joystick_0 ( joystick_0 ),
wire m_left2 = joystick_1[1]; .joystick_1 ( joystick_1 ),
wire m_right2 = joystick_1[0]; .rotate ( rotate ),
wire m_fire2 = joystick_1[4]; .orientation ( 2'b10 ),
.joyswap ( joyswap ),
.oneplayer ( 1'b0 ),
//reg btn_one_player = 0; .controls ( {m_tilt, m_coin4, m_coin3, m_coin2, m_coin1, m_four_players, m_three_players, m_two_players, m_one_player} ),
//reg btn_two_players = 0; .player1 ( {m_fireD, m_fireC, m_fireB, m_fireA, m_up, m_down, m_left, m_right} ),
reg btn_left = 0; .player2 ( {m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2} )
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;
wire key_pressed;
wire [7:0] key_code;
wire key_strobe;
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 endmodule

View File

@@ -35,6 +35,10 @@ localparam CONF_STR = {
"O2,Rotate Controls,Off,On;", "O2,Rotate Controls,Off,On;",
"O34,Scanlines,Off,25%,50%,75%;", "O34,Scanlines,Off,25%,50%,75%;",
"O5,Blend,Off,On;", "O5,Blend,Off,On;",
"O67,Lives,3,4,5,Unl.;",
"O8,Bonus Life,50K 80K+,30K 70K+;",
"O9B,Difficulty,1,2,3,4,5,6,7,8;",
"OC,Demo Sounds,Off,On;",
"T0,Reset;", "T0,Reset;",
"V,v1.15.",`BUILD_DATE "V,v1.15.",`BUILD_DATE
}; };
@@ -42,6 +46,10 @@ localparam CONF_STR = {
wire rotate = status[2]; wire rotate = status[2];
wire [1:0] scanlines = status[4:3]; wire [1:0] scanlines = status[4:3];
wire blend = status[5]; wire blend = status[5];
wire [1:0] lives = status[7:6];
wire bonus = status[8];
wire [2:0] difficulty = status[11:9];
wire demosnd = status[12];
assign LED = 1; assign LED = 1;
assign AUDIO_R = AUDIO_L; assign AUDIO_R = AUDIO_L;
@@ -60,16 +68,35 @@ pll pll(
wire [31:0] status; wire [31:0] status;
wire [1:0] buttons; wire [1:0] buttons;
wire [1:0] switches; wire [1:0] switches;
wire [11:0] kbjoy;
wire [7:0] joystick_0; wire [7:0] joystick_0;
wire [7:0] joystick_1; wire [7:0] joystick_1;
wire scandoublerD; wire scandoublerD;
wire ypbpr; wire ypbpr;
wire [10:0] audio; wire no_csync;
wire hs, vs; wire key_strobe;
wire blankn; wire key_pressed;
wire [2:0] r,g; wire [7:0] key_code;
wire [1:0] b;
user_io #(.STRLEN(($size(CONF_STR)>>3)))user_io(
.clk_sys (clock_12 ),
.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 ),
.key_strobe (key_strobe ),
.key_pressed (key_pressed ),
.key_code (key_code ),
.joystick_0 (joystick_0 ),
.joystick_1 (joystick_1 ),
.status (status )
);
wire [14:0] rom_addr; wire [14:0] rom_addr;
wire [15:0] rom_do; wire [15:0] rom_do;
wire rom_rd; wire rom_rd;
@@ -78,12 +105,9 @@ wire [7:0] ioctl_index;
wire ioctl_wr; wire ioctl_wr;
wire [24:0] ioctl_addr; wire [24:0] ioctl_addr;
wire [7:0] ioctl_dout; wire [7:0] ioctl_dout;
wire key_strobe;
wire key_pressed;
wire [7:0] key_code;
data_io data_io( data_io data_io(
.clk_sys ( clock_48 ), .clk_sys ( clock_48 ),
.SPI_SCK ( SPI_SCK ), .SPI_SCK ( SPI_SCK ),
.SPI_SS2 ( SPI_SS2 ), .SPI_SS2 ( SPI_SS2 ),
.SPI_DI ( SPI_DI ), .SPI_DI ( SPI_DI ),
@@ -93,7 +117,7 @@ data_io data_io(
.ioctl_addr ( ioctl_addr ), .ioctl_addr ( ioctl_addr ),
.ioctl_dout ( ioctl_dout ) .ioctl_dout ( ioctl_dout )
); );
sdram rom( sdram rom(
.*, .*,
.init ( ~pll_locked ), .init ( ~pll_locked ),
@@ -117,6 +141,12 @@ always @(posedge clock_12) begin
reset <= status[0] | buttons[1] | ~rom_loaded; reset <= status[0] | buttons[1] | ~rom_loaded;
end end
wire [10:0] audio;
wire hs, vs;
wire blankn;
wire [2:0] r,g;
wire [1:0] b;
pooyan pooyan( pooyan pooyan(
.clock_6(clock_6), .clock_6(clock_6),
.clock_12(clock_12), .clock_12(clock_12),
@@ -132,8 +162,8 @@ pooyan pooyan(
.roms_addr ( rom_addr ), .roms_addr ( rom_addr ),
.roms_do ( rom_do[7:0] ), .roms_do ( rom_do[7:0] ),
.roms_rd ( rom_rd ), .roms_rd ( rom_rd ),
.dip_switch_1("11111111"),// Coinage_B / Coinage_A .dip_switch_1(8'b11111111),// Coinage_B / Coinage_A
.dip_switch_2("11111011"),// Sound(8)/Difficulty(7-5)/Bonus(4)/Cocktail(3)/lives(2-1) .dip_switch_2(~{demosnd, difficulty, bonus, 1'b1, lives}),// Sound(8)/Difficulty(7-5)/Bonus(4)/Cocktail(3)/lives(2-1)
.start2(m_two_players), .start2(m_two_players),
.start1(m_one_player), .start1(m_one_player),
.coin1(m_coin1), .coin1(m_coin1),
@@ -149,8 +179,7 @@ pooyan pooyan(
.up2(m_up2) .up2(m_up2)
); );
mist_video #(.COLOR_DEPTH(3), .SD_HCNT_WIDTH(10)) mist_video(
mist_video #(.COLOR_DEPTH(3), .SD_HCNT_WIDTH(10)) mist_video(//Wrong Colors have no Idea
.clk_sys ( clock_48 ), .clk_sys ( clock_48 ),
.SPI_SCK ( SPI_SCK ), .SPI_SCK ( SPI_SCK ),
.SPI_SS3 ( SPI_SS3 ), .SPI_SS3 ( SPI_SS3 ),
@@ -169,32 +198,14 @@ mist_video #(.COLOR_DEPTH(3), .SD_HCNT_WIDTH(10)) mist_video(//Wrong Colors have
.scandoubler_disable( scandoublerD ), .scandoubler_disable( scandoublerD ),
.blend ( blend ), .blend ( blend ),
.scanlines ( scanlines ), .scanlines ( scanlines ),
.ypbpr ( ypbpr ) .ypbpr ( ypbpr ),
.no_csync ( no_csync )
); );
user_io #(.STRLEN(($size(CONF_STR)>>3)))user_io( dac #(.C_bits(11))dac(
.clk_sys (clock_12 ),
.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(16))dac(
.clk_i(clock_14), .clk_i(clock_14),
.res_n_i(1), .res_n_i(1),
.dac_i({audio, 5'b00000}), .dac_i(audio),
.dac_o(AUDIO_L) .dac_o(AUDIO_L)
); );
@@ -204,19 +215,19 @@ wire m_up2, m_down2, m_left2, m_right2, m_fire2A, m_fire2B, m_fire2C, m_fire2D,
wire m_tilt, m_coin1, m_coin2, m_coin3, m_coin4, m_one_player, m_two_players, m_three_players, m_four_players; wire m_tilt, m_coin1, m_coin2, m_coin3, m_coin4, m_one_player, m_two_players, m_three_players, m_four_players;
arcade_inputs inputs ( arcade_inputs inputs (
.clk ( clock_12 ), .clk ( clock_12 ),
.key_strobe ( key_strobe ), .key_strobe ( key_strobe ),
.key_pressed ( key_pressed ), .key_pressed ( key_pressed ),
.key_code ( key_code ), .key_code ( key_code ),
.joystick_0 ( joystick_0 ), .joystick_0 ( joystick_0 ),
.joystick_1 ( joystick_1 ), .joystick_1 ( joystick_1 ),
.rotate ( rotate ), .rotate ( rotate ),
.orientation ( 2'b11 ), .orientation ( 2'b11 ),
.joyswap ( 1'b0 ), .joyswap ( 1'b0 ),
.oneplayer ( 1'b1 ), .oneplayer ( 1'b1 ),
.controls ( {m_tilt, m_coin4, m_coin3, m_coin2, m_coin1, m_four_players, m_three_players, m_two_players, m_one_player} ), .controls ( {m_tilt, m_coin4, m_coin3, m_coin2, m_coin1, m_four_players, m_three_players, m_two_players, m_one_player} ),
.player1 ( {m_fireF, m_fireE, m_fireD, m_fireC, m_fireB, m_fireA, m_up, m_down, m_left, m_right} ), .player1 ( {m_fireF, m_fireE, m_fireD, m_fireC, m_fireB, m_fireA, m_up, m_down, m_left, m_right} ),
.player2 ( {m_fire2F, m_fire2E, m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2} ) .player2 ( {m_fire2F, m_fire2E, m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2} )
); );
endmodule endmodule

View File

@@ -59,6 +59,9 @@ localparam CONF_STR = {
"O2,Rotate Controls,Off,On;", "O2,Rotate Controls,Off,On;",
"O34,Scanlines,Off,25%,50%,75%;", "O34,Scanlines,Off,25%,50%,75%;",
"O5,Blend,Off,On;", "O5,Blend,Off,On;",
"O6,Initial Energy,4,6;",
"O78,Lives,3,4,5,6;",
"O9,Stop at Junctions,Off,On;",
"T0,Reset;", "T0,Reset;",
"V,v1.15.",`BUILD_DATE "V,v1.15.",`BUILD_DATE
}; };
@@ -66,6 +69,9 @@ localparam CONF_STR = {
wire rotate = status[2]; wire rotate = status[2];
wire [1:0] scanlines = status[4:3]; wire [1:0] scanlines = status[4:3];
wire blend = status[5]; wire blend = status[5];
wire energy = status[6];
wire [1:0] lives = ~status[8:7];
wire stpatjunct = ~status[9];
assign LED = 1; assign LED = 1;
assign AUDIO_R = AUDIO_L; assign AUDIO_R = AUDIO_L;
@@ -88,12 +94,31 @@ wire [7:0] joystick_0;
wire [7:0] joystick_1; wire [7:0] joystick_1;
wire scandoublerD; wire scandoublerD;
wire ypbpr; wire ypbpr;
reg [10:0] audio; wire no_csync;
wire hb, vb; wire key_strobe;
wire blankn = ~(hb | vb); wire key_pressed;
wire ce_vid; wire [7:0] key_code;
wire hs, vs;
wire [4:0] r,g,b; user_io #(.STRLEN(($size(CONF_STR)>>3)))user_io(
.clk_sys (clock_12 ),
.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 ),
.key_strobe (key_strobe ),
.key_pressed (key_pressed ),
.key_code (key_code ),
.joystick_0 (joystick_0 ),
.joystick_1 (joystick_1 ),
.status (status )
);
wire [14:0] rom_addr; wire [14:0] rom_addr;
wire [15:0] rom_do; wire [15:0] rom_do;
wire rom_rd; wire rom_rd;
@@ -102,12 +127,9 @@ wire [7:0] ioctl_index;
wire ioctl_wr; wire ioctl_wr;
wire [24:0] ioctl_addr; wire [24:0] ioctl_addr;
wire [7:0] ioctl_dout; wire [7:0] ioctl_dout;
wire key_strobe;
wire key_pressed;
wire [7:0] key_code;
data_io data_io( data_io data_io(
.clk_sys ( clock_48 ), .clk_sys ( clock_48 ),
.SPI_SCK ( SPI_SCK ), .SPI_SCK ( SPI_SCK ),
.SPI_SS2 ( SPI_SS2 ), .SPI_SS2 ( SPI_SS2 ),
.SPI_DI ( SPI_DI ), .SPI_DI ( SPI_DI ),
@@ -140,6 +162,13 @@ always @(posedge clock_12) begin
reset <= status[0] | buttons[1] | ~rom_loaded; reset <= status[0] | buttons[1] | ~rom_loaded;
end end
reg [10:0] audio;
wire hb, vb;
wire blankn = ~(hb | vb);
wire ce_vid;
wire hs, vs;
wire [4:0] r,g,b;
power_surge power_surge( power_surge power_surge(
.clock_6(clock_6), .clock_6(clock_6),
.clock_12(clock_12), .clock_12(clock_12),
@@ -156,12 +185,12 @@ power_surge power_surge(
.roms_addr(rom_addr), .roms_addr(rom_addr),
.roms_do(rom_do[7:0]), .roms_do(rom_do[7:0]),
.roms_rd(rom_rd), .roms_rd(rom_rd),
.dip_switch_1(8'b0111_1000), // Cabinet Unknown Lives Lives Initial_Energy Unknown Unknown Unknown .dip_switch_1({2'b11,lives,energy,3'b000}), // Cabinet Unknown Lives Lives Initial_Energy Unknown Unknown Unknown
.dip_switch_2(8'b1110_0000), // Stop_at_Junctions, Unknown, Unknown, Cheat, Coin_B Coin_B Coin_A Coin_A .dip_switch_2({stpatjunct,7'b110_1111}), // Stop_at_Junctions, Unknown, Unknown, Cheat, Coin_B Coin_B Coin_A Coin_A
.start2(m_two_players), .start2(m_two_players),
.start1(m_one_player), .start1(m_one_player),
.coin1(m_coin1), .coin1(m_coin1),
.fire1(m_fireA), .fire1(m_fireA),
.right1(m_right), .right1(m_right),
.left1(m_left), .left1(m_left),
@@ -174,7 +203,7 @@ power_surge power_surge(
.up2(m_up2) .up2(m_up2)
); );
mist_video #(.COLOR_DEPTH(5), .SD_HCNT_WIDTH(10)) mist_video(//Wrong Colors have no Idea mist_video #(.COLOR_DEPTH(5), .SD_HCNT_WIDTH(10)) mist_video(
.clk_sys ( clock_48 ), .clk_sys ( clock_48 ),
.SPI_SCK ( SPI_SCK ), .SPI_SCK ( SPI_SCK ),
.SPI_SS3 ( SPI_SS3 ), .SPI_SS3 ( SPI_SS3 ),
@@ -193,32 +222,14 @@ mist_video #(.COLOR_DEPTH(5), .SD_HCNT_WIDTH(10)) mist_video(//Wrong Colors have
.scandoubler_disable( scandoublerD ), .scandoubler_disable( scandoublerD ),
.scanlines ( scanlines ), .scanlines ( scanlines ),
.blend ( blend ), .blend ( blend ),
.ypbpr ( ypbpr ) .ypbpr ( ypbpr ),
.no_csync ( no_csync )
); );
user_io #(.STRLEN(($size(CONF_STR)>>3)))user_io( dac #(.C_bits(11))dac(
.clk_sys (clock_12 ),
.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(16))dac(
.clk_i(clock_14), .clk_i(clock_14),
.res_n_i(1), .res_n_i(1),
.dac_i({audio, 5'b00000}), .dac_i(audio),
.dac_o(AUDIO_L) .dac_o(AUDIO_L)
); );

View File

@@ -59,6 +59,10 @@ localparam CONF_STR = {
"O2,Rotate Controls,Off,On;", "O2,Rotate Controls,Off,On;",
"O34,Scanlines,Off,25%,50%,75%;", "O34,Scanlines,Off,25%,50%,75%;",
"O5,Blend,Off,On;", "O5,Blend,Off,On;",
"O67,Lives,3,4,5,Unl.;",
"O8,Bonus Life,10K 50k,20K 60K;",
"O9B,Difficulty,1,2,3,4,5,6,7,8;",
"OC,Demo Sounds,Off,On;",
"T0,Reset;", "T0,Reset;",
"V,v1.15.",`BUILD_DATE "V,v1.15.",`BUILD_DATE
}; };
@@ -66,6 +70,10 @@ localparam CONF_STR = {
wire rotate = status[2]; wire rotate = status[2];
wire [1:0] scanlines = status[4:3]; wire [1:0] scanlines = status[4:3];
wire blend = status[5]; wire blend = status[5];
wire [1:0] lives = status[7:6];
wire bonus = status[8];
wire [2:0] difficulty = status[11:9];
wire demosnd = status[12];
assign LED = 1; assign LED = 1;
assign AUDIO_R = AUDIO_L; assign AUDIO_R = AUDIO_L;
@@ -88,9 +96,31 @@ wire [7:0] joystick_0;
wire [7:0] joystick_1; wire [7:0] joystick_1;
wire scandoublerD; wire scandoublerD;
wire ypbpr; wire ypbpr;
reg [10:0] audio; wire no_csync;
wire hs, vs; wire key_strobe;
wire [4:0] r,g,b; wire key_pressed;
wire [7:0] key_code;
user_io #(.STRLEN(($size(CONF_STR)>>3)))user_io(
.clk_sys (clock_12 ),
.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 ),
.key_strobe (key_strobe ),
.key_pressed (key_pressed ),
.key_code (key_code ),
.joystick_0 (joystick_0 ),
.joystick_1 (joystick_1 ),
.status (status )
);
wire [14:0] rom_addr; wire [14:0] rom_addr;
wire [15:0] rom_do; wire [15:0] rom_do;
wire rom_rd; wire rom_rd;
@@ -99,9 +129,6 @@ wire [7:0] ioctl_index;
wire ioctl_wr; wire ioctl_wr;
wire [24:0] ioctl_addr; wire [24:0] ioctl_addr;
wire [7:0] ioctl_dout; wire [7:0] ioctl_dout;
wire key_strobe;
wire key_pressed;
wire [7:0] key_code;
data_io data_io( data_io data_io(
.clk_sys ( clock_48 ), .clk_sys ( clock_48 ),
@@ -138,6 +165,10 @@ always @(posedge clock_12) begin
reset <= status[0] | buttons[1] | ~rom_loaded; reset <= status[0] | buttons[1] | ~rom_loaded;
end end
reg [10:0] audio;
wire hs, vs;
wire [4:0] r,g,b;
time_pilot time_pilot( time_pilot time_pilot(
.clock_6(clock_6), .clock_6(clock_6),
.clock_12(clock_12), .clock_12(clock_12),
@@ -152,8 +183,8 @@ time_pilot time_pilot(
.roms_addr(rom_addr), .roms_addr(rom_addr),
.roms_do(rom_do[7:0]), .roms_do(rom_do[7:0]),
.roms_rd(rom_rd), .roms_rd(rom_rd),
.dip_switch_1(8'hFF), // Coinage_B / Coinage_A .dip_switch_1(8'b11111111),// Coinage_B / Coinage_A
.dip_switch_2(8'h4B), // Sound(8)/Difficulty(7-5)/Bonus(4)/Cocktail(3)/lives(2-1) .dip_switch_2(~{demosnd, difficulty, bonus, 1'b1, lives}),// Sound(8)/Difficulty(7-5)/Bonus(4)/Cocktail(3)/lives(2-1)
.start2(m_two_players), .start2(m_two_players),
.start1(m_one_player), .start1(m_one_player),
.coin1(m_coin1), .coin1(m_coin1),
@@ -189,32 +220,14 @@ mist_video #(.COLOR_DEPTH(5), .SD_HCNT_WIDTH(10)) mist_video(
.scandoubler_disable( scandoublerD ), .scandoubler_disable( scandoublerD ),
.scanlines ( scanlines ), .scanlines ( scanlines ),
.blend ( blend ), .blend ( blend ),
.ypbpr ( ypbpr ) .ypbpr ( ypbpr ),
.no_csync ( no_csync )
); );
user_io #(.STRLEN(($size(CONF_STR)>>3)))user_io( dac #(.C_bits(11))dac(
.clk_sys (clock_12 ),
.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(16))dac(
.clk_i(clock_14), .clk_i(clock_14),
.res_n_i(1), .res_n_i(1),
.dac_i({audio, 5'b00000}), .dac_i(audio),
.dac_o(AUDIO_L) .dac_o(AUDIO_L)
); );
@@ -224,19 +237,19 @@ wire m_up2, m_down2, m_left2, m_right2, m_fire2A, m_fire2B, m_fire2C, m_fire2D,
wire m_tilt, m_coin1, m_coin2, m_coin3, m_coin4, m_one_player, m_two_players, m_three_players, m_four_players; wire m_tilt, m_coin1, m_coin2, m_coin3, m_coin4, m_one_player, m_two_players, m_three_players, m_four_players;
arcade_inputs inputs ( arcade_inputs inputs (
.clk ( clock_12 ), .clk ( clock_12 ),
.key_strobe ( key_strobe ), .key_strobe ( key_strobe ),
.key_pressed ( key_pressed ), .key_pressed ( key_pressed ),
.key_code ( key_code ), .key_code ( key_code ),
.joystick_0 ( joystick_0 ), .joystick_0 ( joystick_0 ),
.joystick_1 ( joystick_1 ), .joystick_1 ( joystick_1 ),
.rotate ( rotate ), .rotate ( rotate ),
.orientation ( 2'b11 ), .orientation ( 2'b11 ),
.joyswap ( 1'b0 ), .joyswap ( 1'b0 ),
.oneplayer ( 1'b1 ), .oneplayer ( 1'b1 ),
.controls ( {m_tilt, m_coin4, m_coin3, m_coin2, m_coin1, m_four_players, m_three_players, m_two_players, m_one_player} ), .controls ( {m_tilt, m_coin4, m_coin3, m_coin2, m_coin1, m_four_players, m_three_players, m_two_players, m_one_player} ),
.player1 ( {m_fireF, m_fireE, m_fireD, m_fireC, m_fireB, m_fireA, m_up, m_down, m_left, m_right} ), .player1 ( {m_fireF, m_fireE, m_fireD, m_fireC, m_fireB, m_fireA, m_up, m_down, m_left, m_right} ),
.player2 ( {m_fire2F, m_fire2E, m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2} ) .player2 ( {m_fire2F, m_fire2E, m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2} )
); );
endmodule endmodule

View File

@@ -6,7 +6,7 @@
-- Coin: ESC, 5, 6 -- Coin: ESC, 5, 6
-- Start: F1, F2, 1, 2 -- Start: F1, F2, 1, 2
-- Tron: Joystick 1 for movement, Joystick 2 (MAME keys: D, G) for turret -- Tron: Joystick 1 for movement, Joystick 2 (MAME keys: D, G) or Buttons B and C for turret
-- Wacko: control Captain Krooz'r with the mouse, shoot with the joystick -- Wacko: control Captain Krooz'r with the mouse, shoot with the joystick
-- Kozmik Krooz'r: use the mouse for movement and shoot, rotate the turret with the joystick -- Kozmik Krooz'r: use the mouse for movement and shoot, rotate the turret with the joystick

View File

@@ -56,6 +56,7 @@ localparam CONF_STR = {
"O2,Rotate Controls,Off,On;", "O2,Rotate Controls,Off,On;",
"O5,Blend,Off,On;", "O5,Blend,Off,On;",
"O6,Swap Joysticks,Off,On;", "O6,Swap Joysticks,Off,On;",
"O4,Spinner speed,Low,High;",
"DIP;", "DIP;",
"O7,Service,Off,On;", "O7,Service,Off,On;",
"T0,Reset;", "T0,Reset;",
@@ -66,6 +67,7 @@ wire rotate = status[2];
wire blend = status[5]; wire blend = status[5];
wire joyswap = status[6]; wire joyswap = status[6];
wire service = status[7]; wire service = status[7];
wire spinspd = status[4];
reg oneplayer; reg oneplayer;
reg [1:0] orientation; //left/right / portrait/landscape reg [1:0] orientation; //left/right / portrait/landscape
@@ -397,7 +399,7 @@ wire [6:0] spin_angle1;
spinner spinner1 ( spinner spinner1 (
.clock_40(clk_sys), .clock_40(clk_sys),
.reset(reset), .reset(reset),
.btn_acc(1), .btn_acc(spinspd),
.btn_left(m_left | m_up), .btn_left(m_left | m_up),
.btn_right(m_right | m_down), .btn_right(m_right | m_down),
.ctc_zc_to_2(vs), .ctc_zc_to_2(vs),
@@ -408,9 +410,9 @@ wire [6:0] spin_angle2;
spinner spinner2 ( spinner spinner2 (
.clock_40(clk_sys), .clock_40(clk_sys),
.reset(reset), .reset(reset),
.btn_acc(1), .btn_acc(spinspd),
.btn_left(m_left2 | m_up2), .btn_left(m_left2 | m_up2 | (core_mod == 7'h1 && m_fireB)), // fireB for Tron
.btn_right(m_right2 | m_down2), .btn_right(m_right2 | m_down2 | (core_mod == 7'h1 && m_fireC)), // fireC for Tron
.ctc_zc_to_2(vs), .ctc_zc_to_2(vs),
.spin_angle(spin_angle2) .spin_angle(spin_angle2)
); );

View File

@@ -36,8 +36,8 @@ begin
if btn_left = '1' then spin_count <= spin_count - 20; end if; -- left if btn_left = '1' then spin_count <= spin_count - 20; end if; -- left
if btn_right = '1' then spin_count <= spin_count + 20; end if; -- right if btn_right = '1' then spin_count <= spin_count + 20; end if; -- right
else else
if btn_left = '1' then spin_count <= spin_count - 55; end if; if btn_left = '1' then spin_count <= spin_count - 40; end if;
if btn_right = '1' then spin_count <= spin_count + 55; end if; if btn_right = '1' then spin_count <= spin_count + 40; end if;
end if; end if;
end if; end if;
end if; end if;

View File

@@ -11,11 +11,8 @@ Supported games:
Sarge Sarge
===== =====
Controls: Controls:
Player 1: joystick 1 and joystick 2 Player 1: joystick 1 and joystick 2 (two sticks mode), joystick1 only(one stick mode)
Player 2: joystick 3 and joystick 4 Player 2: joystick 3 and joystick 4 (two sticks mode), joystick2 only(one stick mode)
Creating SARGE.ROM on Linux:
cat cpu_3b.bin cpu_5b.bin spr_8e.bin spr_6e.bin spr_5e.bin spr_4e.bin til_15a.bin til_15a.bin til_14b.bin til_14b.bin tcs_u5.bin tcs_u4.bin tcs_u5.bin tcs_u4.bin > SARGE.ROM
Max RPM Max RPM
======= =======
@@ -24,19 +21,10 @@ Gear : Button1/Button2
Steering: Left/Right Steering: Left/Right
Throttle/Brake: Up/Down Throttle/Brake: Up/Down
Creating MAXRPM.ROM on Linux:
cat pro.0 pro.1 fg-0 fg-1 fg-2 fg-3 bg-0 bg-1 turbskwk.u5 turbskwk.u4 > MAXRPM.ROM
Rampage Rampage
======= =======
Normal controls for maximum of 3 players. Normal controls for maximum of 3 players.
Creating RAMPAGE.ROM on Linux:
cat pro-0_3b_rev_3_8-27-86.3b pro-1_5b_rev_3_8-27-86.5b \
fg-0_8e_6-30-86.8e fg-1_6e_6-30-86.6e fg-2_5e_6-30-86.5e fg-3_4e_6-30-86.4e \
bg-0_u15_7-23-86.15a bg-1_u14_7-23-86.14b \
u-17_rev.2_8-14-86.u17 u-18_rev.2_8-14-86.u18 u-7_rev.2_8-14-86.u7 u-8_rev.2_8-14-86.u8 > RAMPAGE.ROM
Power Drive Power Drive
=========== ===========
3 players support 3 players support
@@ -44,10 +32,15 @@ Buttons 1,2 - Gas
Button 3 - Wheelie Button 3 - Wheelie
Button 4 - Shift Button 4 - Shift
Creating POWERDRV.ROM on Linux: Usage:
cat pdrv3b.bin pdrv5b.bin pdrv8e.bin pdrv6e.bin pdrv5e.bin pdrv4e.bin \ ======
pdrv15a.bin pdrv14b.bin \
power_drive_snd_u17.u17 power_drive_snd_u18.u18 power_drive_snd_u7.u7 power_drive_snd_u8.u8 > POWERDRV.ROM Create ROM and ARC files from MAME ROM zip files using the mra utility and the MRA files.
Copy the RBF and the ARC files to the same folder.
Example: mra -z /path/to/mame/roms Tron.mra
Copy the ROM files to the root of the SD Card.
MRA utilty: https://github.com/sebdel/mra-tools-c
Based on Darfpga's work: Based on Darfpga's work:
--------------------------------------------------------------------------------- ---------------------------------------------------------------------------------

View File

@@ -8,6 +8,7 @@
<rbf>MCR3Mono</rbf> <rbf>MCR3Mono</rbf>
<setname>sarge</setname> <setname>sarge</setname>
<switches> <switches>
<dip bits="9" name="Controls" ids="2 sticks, 1 stick"/>
<dip bits="8" name="Free Play" ids="On,Off"/> <dip bits="8" name="Free Play" ids="On,Off"/>
</switches> </switches>
<rom index="1"> <rom index="1">

View File

@@ -104,8 +104,8 @@ always @(*) begin
begin begin
// Two stick/player like the original // Two stick/player like the original
input0 = ~{2'b00, service, 1'b0, m_two_players, m_one_player, m_coin2, m_coin1}; input0 = ~{2'b00, service, 1'b0, m_two_players, m_one_player, m_coin2, m_coin1};
input1 = ~{m_fireA | m_fireB, m_fireA | m_fireB, m_fire2A | m_fire2B, m_fire2A | m_fire2B, m_down, m_up, m_down, m_up}; input1 = ~{{2{sarge_fire1B}}, {2{sarge_fire1A}}, sarge_down2, sarge_up2, sarge_down1, sarge_up1};
input2 = ~{m_fire3A | m_fire3B, m_fire3A | m_fire3B, m_fire4A | m_fire4B, m_fire4A | m_fire4B, m_down3, m_up3, m_down4, m_up4}; input2 = ~{{2{sarge_fire2B}}, {2{sarge_fire2A}}, sarge_down3, sarge_up3, sarge_down4, sarge_up4};
input3 = ~{2'b00, /*coinage*/2'b00, /*free play*/status[8], 3'b000}; input3 = ~{2'b00, /*coinage*/2'b00, /*free play*/status[8], 3'b000};
end end
7'h2: //POWERDRV 7'h2: //POWERDRV
@@ -393,6 +393,42 @@ dac #(10) dac(
); );
assign AUDIO_R = AUDIO_L; assign AUDIO_R = AUDIO_L;
// Sarge controls
wire onestick = status[9];
wire sarge_up1, sarge_up2, sarge_up3, sarge_up4;
wire sarge_down1, sarge_down2, sarge_down3, sarge_down4;
wire sarge_fire1A, sarge_fire1B, sarge_fire2A, sarge_fire2B;
always @(*) begin
if (~onestick) begin
sarge_up1 = m_up;
sarge_up2 = m_up2;
sarge_up3 = m_up3;
sarge_up4 = m_up4;
sarge_down1 = m_down;
sarge_down2 = m_down2;
sarge_down3 = m_down3;
sarge_down4 = m_down4;
sarge_fire1A = m_fireA | m_fire2A;
sarge_fire1B = m_fireB | m_fire2B;
sarge_fire2A = m_fire3A | m_fire4A;
sarge_fire2B = m_fire3B | m_fire4B;
end else begin
sarge_up1 = (m_up & ~m_left) | (m_right & ~m_down);
sarge_up2 = (m_up & ~m_right) | (m_left & ~m_down);
sarge_down1 = (m_down & ~m_right) | (m_left & ~m_up);
sarge_down2 = (m_down & ~m_left) | (m_right & ~m_up);
sarge_up3 = (m_up2 & ~m_left2) | (m_right2 & ~m_down2);
sarge_up4 = (m_up2 & ~m_right2) | (m_left2 & ~m_down2);
sarge_down3 = (m_down2 & ~m_right2) | (m_left2 & ~m_up2);
sarge_down4 = (m_down2 & ~m_left2) | (m_right2 & ~m_up2);
sarge_fire1A = m_fireA;
sarge_fire1B = m_fireB;
sarge_fire2A = m_fire2A;
sarge_fire2B = m_fire2B;
end
end
// Power Drive gear // Power Drive gear
reg [2:0] powerdrv_gear; reg [2:0] powerdrv_gear;
always @(posedge clk_sys) begin always @(posedge clk_sys) begin