diff --git a/Arcade_MiST/Konami Green Beret Hardware/README.txt b/Arcade_MiST/Konami Green Beret Hardware/README.txt
index 30dc4750..9ca4a4d0 100644
--- a/Arcade_MiST/Konami Green Beret Hardware/README.txt
+++ b/Arcade_MiST/Konami Green Beret Hardware/README.txt
@@ -1,6 +1,13 @@
-- Arcade: Rush'n Attack (Green Beret) port to MiST by Slingshot
--
--- GBERET.ROM is required on the SD Card
+-- 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 gberet.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/
--
-- Keyboard inputs :
--
diff --git a/Arcade_MiST/Konami Green Beret Hardware/meta/gberet.mra b/Arcade_MiST/Konami Green Beret Hardware/meta/gberet.mra
new file mode 100644
index 00000000..d08e94df
--- /dev/null
+++ b/Arcade_MiST/Konami Green Beret Hardware/meta/gberet.mra
@@ -0,0 +1,30 @@
+
+ Green Beret
+ 0216
+ gberet
+ 201911270000
+ 1985
+ Konami
+ Army / Fighter
+ gberet
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Arcade_MiST/Konami Green Beret Hardware/meta/mrgoemon.mra b/Arcade_MiST/Konami Green Beret Hardware/meta/mrgoemon.mra
new file mode 100644
index 00000000..53baa131
--- /dev/null
+++ b/Arcade_MiST/Konami Green Beret Hardware/meta/mrgoemon.mra
@@ -0,0 +1,26 @@
+
+ Mr. Goemon
+ 0216
+ mrgoemon
+ 201911270000
+ 1985
+ Konami
+ Army / Fighter
+ gberet
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Arcade_MiST/Konami Green Beret Hardware/meta/rushatck.mra b/Arcade_MiST/Konami Green Beret Hardware/meta/rushatck.mra
new file mode 100644
index 00000000..09c5f0b9
--- /dev/null
+++ b/Arcade_MiST/Konami Green Beret Hardware/meta/rushatck.mra
@@ -0,0 +1,27 @@
+
+ Rush'n Attack (US)
+ 0216
+ rushatck
+ 201911270000
+ 1985
+ Konami
+ Army / Fighter
+ gberet
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Arcade_MiST/Konami Green Beret Hardware/rtl/gberet_mist.sv b/Arcade_MiST/Konami Green Beret Hardware/rtl/gberet_mist.sv
index 3bf22938..e08e3279 100644
--- a/Arcade_MiST/Konami Green Beret Hardware/rtl/gberet_mist.sv
+++ b/Arcade_MiST/Konami Green Beret Hardware/rtl/gberet_mist.sv
@@ -32,13 +32,10 @@ module gberet_mist (
`include "rtl\build_id.v"
-//`define CORE_NAME "GBERET"
-//`define CORE_NAME "RUSHNA"
-`define CORE_NAME "MRGOEMON"
-
+`define CORE_NAME "GBERET"
localparam CONF_STR = {
- `CORE_NAME,";ROM;",
+ `CORE_NAME, ";ROM;",
"O2,Rotate Controls,Off,On;",
"O34,Scandoubler Fx,None,CRT 25%,CRT 50%,CRT 75%;",
"O5,Blend,Off,On;",
@@ -50,16 +47,21 @@ localparam CONF_STR = {
"V,v1.00.",`BUILD_DATE
};
+wire rotate = status[2];
+wire [1:0] scanlines = status[4:3];
+wire blend = status[5];
+
wire [1:0] dsLives = ~status[9:8];
wire [1:0] dsExtend = ~status[11:10];
wire [1:0] dsDiff = ~status[13:12];
wire dsDemoSnd = ~status[14];
+wire [6:0] core_mod;
-assign LED = ~ioctl_downl;
-assign AUDIO_R = AUDIO_L;
-assign SDRAM_CLK = clock_48;
-assign SDRAM_CKE = 1;
+assign LED = ~ioctl_downl;
+assign AUDIO_R = AUDIO_L;
+assign SDRAM_CLK = clock_48;
+assign SDRAM_CKE = 1;
wire clock_48, pll_locked;
pll pll(
@@ -75,14 +77,32 @@ wire [7:0] joystick_0;
wire [7:0] joystick_1;
wire scandoublerD;
wire ypbpr;
-wire [7:0] audio;
-wire hs, vs;
-wire hb, vb;
-wire blankn = ~(hb | vb);
-wire [3:0] r, g, b;
+wire no_csync;
wire key_strobe;
wire key_pressed;
wire [7:0] key_code;
+
+user_io #(.STRLEN($size(CONF_STR)>>3))user_io(
+ .clk_sys ( clock_48 ),
+ .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 [15:0] rom_addr;
wire [15:0] rom_do;
wire [15:1] spr_addr;
@@ -104,7 +124,7 @@ wire [7:0] ioctl_dout;
// 24200 - 2421F - pal - 32b - 2f
data_io data_io(
- .clk_sys ( clock_48 ),
+ .clk_sys ( clock_48 ),
.SPI_SCK ( SPI_SCK ),
.SPI_SS2 ( SPI_SS2 ),
.SPI_DI ( SPI_DI ),
@@ -170,6 +190,11 @@ always @(posedge clock_48) begin
end
//////////////////////////////////////////////
+wire [7:0] audio;
+wire hs, vs;
+wire hb, vb;
+wire blankn = ~(hb | vb);
+wire [3:0] r, g, b;
wire PCLK;
wire PCLK_EN;
@@ -182,9 +207,9 @@ HVGEN hvgen
.oRGB({b,g,r}),.HBLK(hb),.VBLK(vb),.HSYN(hs),.VSYN(vs)
);
-wire [5:0] INP0 = { m_fire2, m_fire1, {m_left, m_down, m_right, m_up} };
-wire [5:0] INP1 = { m_fire2, m_fire1, {m_left, m_down, m_right, m_up} };
-wire [2:0] INP2 = { m_coin, m_start2, m_start1 };
+wire [5:0] INP0 = { m_fireB, m_fireA, m_left, m_down, m_right, m_up };
+wire [5:0] INP1 = { m_fire2B, m_fire2A, m_left2, m_down2, m_right2, m_up2 };
+wire [2:0] INP2 = { m_coin1 | m_coin2, m_two_players, m_one_player };
wire [7:0] DSW0 = {dsDemoSnd,dsDiff,dsExtend,1'b0,dsLives};
wire [7:0] DSW1 = 8'hFF;
@@ -220,32 +245,14 @@ mist_video #(.COLOR_DEPTH(4), .SD_HCNT_WIDTH(10)) mist_video(
.VGA_B ( VGA_B ),
.VGA_VS ( VGA_VS ),
.VGA_HS ( VGA_HS ),
- .rotate ( {1'b1,status[2]} ),
+ .rotate ( { 1'b1, rotate } ),
.scandoubler_disable( scandoublerD ),
- .blend ( status[5] ),
- .scanlines ( status[4:3] ),
+ .blend ( blend ),
+ .scanlines ( scanlines ),
+ .no_csync ( no_csync ),
.ypbpr ( ypbpr )
);
-user_io #(.STRLEN(($size(CONF_STR)>>3)))user_io(
- .clk_sys ( clock_48 ),
- .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 #(8) dac(
.clk_i(clock_48),
.res_n_i(1),
@@ -253,42 +260,24 @@ dac #(8) dac(
.dac_o(AUDIO_L)
);
-// Rotated Normal
-wire m_up = status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_up | joystick_0[3] | joystick_1[3];
-wire m_down = status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_down | joystick_0[2] | joystick_1[2];
-wire m_left = status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_left | joystick_0[1] | joystick_1[1];
-wire m_right = status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_right | joystick_0[0] | joystick_1[0];
-wire m_fire1 = btn_fire1 | joystick_0[4] | joystick_1[4];
-wire m_fire2 = btn_fire2 | joystick_0[5] | joystick_1[5];
-wire m_start1 = btn_one_player;
-wire m_start2 = btn_two_players;
-wire m_coin = btn_coin;
-
-reg btn_one_player = 0;
-reg btn_two_players = 0;
-reg btn_left = 0;
-reg btn_right = 0;
-reg btn_down = 0;
-reg btn_up = 0;
-reg btn_fire1 = 0;
-reg btn_fire2 = 0;
-reg btn_coin = 0;
-
-always @(posedge clock_48) 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
- 'h29: btn_fire1 <= key_pressed; // Space
- 'h11: btn_fire2 <= key_pressed; // Alt
- endcase
- end
-end
+wire m_up, m_down, m_left, m_right, m_fireA, m_fireB, m_fireC, m_fireD, m_fireE, m_fireF;
+wire m_up2, m_down2, m_left2, m_right2, m_fire2A, m_fire2B, m_fire2C, m_fire2D, m_fire2E, m_fire2F;
+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 (
+ .clk ( clock_48 ),
+ .key_strobe ( key_strobe ),
+ .key_pressed ( key_pressed ),
+ .key_code ( key_code ),
+ .joystick_0 ( joystick_0 ),
+ .joystick_1 ( joystick_1 ),
+ .rotate ( rotate ),
+ .orientation ( 2'b10 ),
+ .joyswap ( 1'b0 ),
+ .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} ),
+ .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} )
+);
endmodule