1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-01-18 09:02:08 +00:00

Scramble HW: add DIP switches

This commit is contained in:
Gyorgy Szombathelyi 2020-02-03 18:54:09 +01:00
parent 05170088f7
commit dd73e5ce11
13 changed files with 87 additions and 37 deletions

View File

@ -1 +1,4 @@
SCRAMBLE=1
[ARC]
RBF=SCRAMBLE
MOD=1
CONF=O78,Lives,3,4,5,Unl

View File

@ -1 +1,5 @@
SCRAMBLE=10
[ARC]
RBF=SCRAMBLE
MOD=10
CONF=O7,Lives,3,5
CONF=OA,Demo Sounds,Off,On

View File

@ -1 +1,5 @@
SCRAMBLE=5
[ARC]
RBF=SCRAMBLE
MOD=5
CONF=O7,Lives,3,5
CONF=OA,Demo Sounds,Off,On

View File

@ -1 +1,5 @@
SCRAMBLE=8
[ARC]
RBF=SCRAMBLE
MOD=8
CONF=O7,Lives,3,5
CONF=OA,Demo Sounds,Off,On

View File

@ -1 +1,4 @@
SCRAMBLE=2
[ARC]
RBF=SCRAMBLE
MOD=2
CONF=O78,Lives,3,5,7,Unl

View File

@ -1 +1,4 @@
SCRAMBLE=11
[ARC]
RBF=SCRAMBLE
MOD=11
CONF=OA,Demo Sounds,Off,On

View File

@ -1 +1,4 @@
SCRAMBLE=6
[ARC]
RBF=SCRAMBLE
MOD=6
CONF=O78,Lives,3,4,5,Unl

View File

@ -1 +1,4 @@
SCRAMBLE=0
[ARC]
RBF=SCRAMBLE
MOD=0
CONF=O78,Lives,3,4,5,Unl

View File

@ -1 +1,5 @@
SCRAMBLE=7
[ARC]
RBF=SCRAMBLE
MOD=7
CONF=O7,Lives,3,5
CONF=OB,Difficulty,Easy,Hard

View File

@ -1 +1,5 @@
SCRAMBLE=3
[ARC]
RBF=SCRAMBLE
MOD=3
CONF=O7,Lives,3,4
CONF=O9,Continue,No,Yes

View File

@ -1 +1,5 @@
SCRAMBLE=4
[ARC]
RBF=SCRAMBLE
MOD=4
CONF=O7,Lives,3,5
CONF=OA,Demo Sounds,Off,On

View File

@ -51,6 +51,17 @@ module ScrambleMist
`include "rtl\build_id.v"
localparam CONF_STR = {
";ROM;",
"O2,Rotate Controls,Off,On;",
"O34,Scanlines,Off,25%,50%,75%;",
"O5,Blending,Off,On;",
"O6,Joystick Swap,Off,On;",
"DIP;",
"T0,Reset;",
"V,v1.20.",`BUILD_DATE
};
integer hwsel = 0;
wire [6:0] core_mod;
reg [8*8-1:0] core_name;
@ -59,9 +70,9 @@ reg [7:0] input1;
reg [7:0] input2;
always @(*) begin
input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_fireA, 1'b0, m_fireB, m_up2 };
input1 = ~{ m_one_player, m_two_players, m_left2, m_right2, m_fire2A, m_fire2B, 2'b10 };
input2 = ~{ 1'b1, m_down, 1'b1, m_up, 3'b111, m_down2 };
input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_fireA, /*service*/1'b0, m_fireB, m_up2 };
input1 = ~{ m_one_player, m_two_players, m_left2, m_right2, m_fire2A, m_fire2B, /*lives*/~status[8:7] };
input2 = ~{ 1'b1, m_down, 1'b1, m_up, /*cabinet*/1'b1, /*coinage*/2'b11, m_down2 };
case (core_mod)
6'h0:
@ -73,6 +84,8 @@ always @(*) begin
begin
core_name = "AMIDAR ";
hwsel = 0;
input1[1:0] = ~status[8:7]; // lives345unl
//input2[1] = status[10]; // demo sounds - no effect
end
6'h2:
begin
@ -83,27 +96,31 @@ always @(*) begin
begin
core_name = "SCOBRA ";
hwsel = 2;
input1[0] = status[9]; // allow continue
input1[1] = status[7]; // lives34
end
6'h4:
begin
core_name = "TAZMANIA";
hwsel = 2;
input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_down, m_up, m_fireA, m_fireB };
input1 = ~{ m_fire2A, m_fire2B, m_left2, m_right2, m_up2, m_down2, 2'b11 };
input2 = ~{ 1'b1, m_two_players, 2'b10, 3'b111, m_one_player };
input1 = ~{ m_fire2A, m_fire2B, m_left2, m_right2, m_up2, m_down2, /*demosnd*/status[10], /*lives35*/status[7] };
input2 = ~{ 1'b1, m_two_players, 2'b10, 3'b111, m_one_player }; // unknown, start2, 2xunknown, cabinet, 2xcoinage, start1
end
6'h5:
begin
core_name = "ARMORCAR";
hwsel = 2;
input1[0] = ~status[7]; //lives35
input1[1] = ~status[10]; // demo sounds
end
6'h6:
begin
core_name = "MOONWAR";
core_name = "MOONWAR ";
hwsel = 2;
input0 = ~{ m_coin1, m_coin2, 1'b0, dial };
input1 = ~{ m_fireA, m_fireB, m_fireC, m_fireD, m_two_players, m_one_player, 2'b01 }; // lives
input2 = ~{ 4'h0, 1'b1, 2'b11, 1'b0 }; // 4xunused, cabinet, coinage, p2fire(cocktail)
input1 = ~{ m_fireA, m_fireB, m_fireC, m_fireD, m_two_players, m_one_player, /*live345*/~status[8:7] };
input2 = ~{ 4'h0, 1'b1, 2'b11, 1'b0 }; // 4xunused, cabinet, coinage, p2fire(cocktail)
end
6'h7:
begin
@ -111,14 +128,14 @@ always @(*) begin
hwsel = 2;
input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_two_players, 1'b0, m_one_player, 1'b0 };
input1 = { 4'hf, 2'b00, 1'b0, 1'b0 }; // 6xunused, freeplay, freeze
input2 = { 4'hf, 1'b0, 1'b0, 1'b1, 1'b1}; // 4xunused, lives, difficulty, unknown, unused
input2 = { 4'hf, ~status[7], status[11], 1'b1, 1'b1}; // 4xunused, lives35, difficulty, unknown, unused
end
6'h8:
begin
core_name = "CALIPSO ";
hwsel = 3;
input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_down, m_up, 1'b1, m_two_players|m_fire2A }; // coin1, coin2, left, right, down, up, unused, start 2p / player2 fire
input1 = ~{ 1'b1, 1'b1, m_left2, m_right2, m_down2, m_up2, 1'b1, 1'b1 }; // unused, unused, left, right, down, up, demo sounds, lives 3/5
input1 = ~{ 1'b1, 1'b1, m_left2, m_right2, m_down2, m_up2, status[10], status[7] }; // unused, unused, left, right, down, up, demo sounds, lives 3/5
input2 = ~{ 5'b0, 2'b10, m_fireA | m_one_player }; // unused[7:3], coin dip[2:1], start 1p / player1 fire
end
6'h9:
@ -135,7 +152,7 @@ always @(*) begin
core_name = "ANTEATER";
hwsel = 5;
input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_down, m_up, m_fireA, m_fireB };
input1 = ~{ m_fire2A, m_fire2B, m_left2, m_right2, m_up2, m_down2, 2'b11 };
input1 = ~{ m_fire2A, m_fire2B, m_left2, m_right2, m_up2, m_down2, /*demosdns*/status[10], /*lives35*/status[7] };
input2 = ~{ 1'b1, m_two_players, 2'b10, 3'b111, m_one_player };
end
6'hB:
@ -144,7 +161,7 @@ always @(*) begin
hwsel = 6;
input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_down, m_up, m_one_player, m_two_players };
input1 = ~{ 1'b0, m_fireA, m_left2, m_right2, m_down2, m_up2, 2'b01 };
input2 = ~{ 4'h0, 1'b0, 2'b10, 1'b0 }; //4xunused, demo sounds, 2xcoinage, unused
input2 = ~{ 4'h0, status[10], 2'b10, 1'b0 }; //4xunused, demo sounds, 2xcoinage, unused
end
default:
begin
@ -154,17 +171,6 @@ always @(*) begin
endcase
end
localparam CONF_STR = {
// `CORE_NAME,";ROM;",
";ROM;",
"O2,Rotate Controls,Off,On;",
"O34,Scanlines,Off,25%,50%,75%;",
"O5,Blending,Off,On;",
"06,Joystick Swap,Off,On;",
"T0,Reset;",
"V,v1.20.",`BUILD_DATE
};
wire rotate = status[2];
wire [1:0] scanlines = status[4:3];
wire blend = status[5];
@ -214,7 +220,7 @@ wire key_pressed;
wire [7:0] key_code;
user_io #(
.STRLEN(((8*8+$size(CONF_STR))>>3)))
.STRLEN(8+($size(CONF_STR)>>3)))
user_io(
.clk_sys (clk_sys ),
.conf_str ({core_name, CONF_STR}),
@ -224,7 +230,7 @@ user_io(
.SPI_MOSI (SPI_DI ),
.buttons (buttons ),
.switches (switches ),
.scandoubler_disable (scandoublerD ),
.scandoubler_disable (scandoublerD ),
.ypbpr (ypbpr ),
.no_csync (no_csync ),
.core_mod (core_mod ),

View File

@ -24,6 +24,8 @@
module user_io #(parameter STRLEN=0, parameter PS2DIV=100, parameter ROM_DIRECT_UPLOAD=0) (
input [(8*STRLEN)-1:0] conf_str,
output [9:0] conf_addr, // RAM address for config string, if STRLEN=0
input [7:0] conf_chr,
input clk_sys, // clock for system-related messages (kbd, joy, etc...)
input clk_sd, // clock for SD-card related messages
@ -101,6 +103,8 @@ assign scandoubler_disable = but_sw[4];
assign ypbpr = but_sw[5];
assign no_csync = but_sw[6];
assign conf_addr = byte_cnt;
// this variant of user_io is for 8 bit cores (type == a4) only
// bit 4 indicates ROM direct upload capability
wire [7:0] core_type = ROM_DIRECT_UPLOAD ? 8'hb4 : 8'ha4;
@ -335,7 +339,8 @@ always@(posedge spi_sck or posedge SPI_SS_IO) begin
spi_byte_out <= 0;
case({(!byte_cnt) ? {sbuf, SPI_MOSI} : cmd})
// reading config string
8'h14: if(byte_cnt < STRLEN) spi_byte_out <= conf_str[(STRLEN - byte_cnt - 1)<<3 +:8];
8'h14: if (STRLEN == 0) spi_byte_out <= conf_chr; else
if(byte_cnt < STRLEN) spi_byte_out <= conf_str[(STRLEN - byte_cnt - 1)<<3 +:8];
// reading sd card status
8'h16: if(byte_cnt == 0) begin