1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-01-19 01:16:58 +00:00

Merge pull request #108 from gyurco/master

DK: Radar Scope + Pest Place
This commit is contained in:
Marcel 2021-01-03 23:01:15 +01:00 committed by GitHub
commit 6023966acb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 2911 additions and 21 deletions

View File

@ -230,7 +230,7 @@ set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
# end ENTITY(dkong_MiST)
# ----------------------
set_global_assignment -name ENABLE_SIGNALTAP OFF
set_global_assignment -name USE_SIGNALTAP_FILE output_files/dl.stp
set_global_assignment -name USE_SIGNALTAP_FILE output_files/stars.stp
set_global_assignment -name SYSTEMVERILOG_FILE rtl/dkong_MiST.sv
set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv
set_global_assignment -name VERILOG_FILE rtl/dkong_top.v
@ -247,10 +247,12 @@ set_global_assignment -name VERILOG_FILE rtl/dkong_hv_count.v
set_global_assignment -name VERILOG_FILE rtl/dkong_col_pal.v
set_global_assignment -name VERILOG_FILE rtl/dkong_bram.v
set_global_assignment -name VERILOG_FILE rtl/dkong_adec.v
set_global_assignment -name VERILOG_FILE rtl/radarscp_stars.v
set_global_assignment -name VERILOG_FILE rtl/pll.v
set_global_assignment -name QIP_FILE ../../../common/CPU/t48/T48.qip
set_global_assignment -name QIP_FILE ../../../common/mist/mist.qip
set_global_assignment -name QIP_FILE ../../../common/CPU/T80/T80.qip
set_global_assignment -name SIGNALTAP_FILE output_files/dkong.stp
set_global_assignment -name SIGNALTAP_FILE output_files/dl.stp
set_global_assignment -name SIGNALTAP_FILE output_files/stars.stp
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top

View File

@ -0,0 +1,33 @@
---------------------------------------------------------------------------------
--
-- Arcade: Donkey Kong port to MiST
-- Jan 2021
--
-- Usage:
-- - Create ROM and ARC files from the MRA files using the MRA utility.
-- Example: mra -A -z /path/to/mame/roms "Donkey Kong.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
--
-- Bugs/limitations:
-- - Some sounds are missing in some games
-- - Grid drawing delay is not implemented in Radar Scope
--
---------------------------------------------------------------------------------
-- Based on:
-- FPGA DONKEY KONG TOP
-- Version : 4.00
-- Copyright(c) 2003 - 2004 Katsumi Degawa , All rights reserved
---------------------------------------------------------------------------------
--
--
-- Keyboard inputs :
--
-- ESC,5 : Coin
-- F2,2 : Start 2 players
-- F1,1 : Start 1 player
-- UP,DOWN,LEFT,RIGHT arrows : Movements
-- CTRL : Jump/Fire
-- Joystick support.
---------------------------------------------------------------------------------

View File

@ -0,0 +1,51 @@
<misterromdescription>
<name>Pest Place</name>
<mameversion>0217</mameversion>
<setname>pestplce</setname>
<mratimestamp>201912300000</mratimestamp>
<year>1982</year>
<manufacturer>Nintendo of America</manufacturer>
<category>Maze / Monkeys</category>
<category>Platform</category>
<category>Platform / Mario Bros.</category>
<rbf>dkong</rbf>
<buttons names="Jump,Start 1P,Start 2P,Coin" default="A,Start,Select,R" />
<switches default="80" base="8">
<dip bits="0,1" name="Lives" ids="3,4,5,6"/>
<dip bits="2,3" name="Bonus" ids="10k,15k,20k,25k"/>
<dip bits="4,6" name="Coins" ids="1C1P,2C1P,1C1P,3C1P,1C1P,4C1P,1C1P,5C1P,1C1P"/>
<dip bits="7" name="Lives" ids="Cocktail,Upright"/>
</switches>
<rom index="1"><part>09</part></rom>
<rom index="0" zip="pestplce.zip" md5="48576fcf2767241441d662768cc53899" type="merged|nonmerged">
<!-- Main CPU 32k-->
<part name="pest.1p"/>
<part name="pest.2p"/>
<part name="pest.3p"/>
<part name="pest.0"/>
<part name="pest.0"/>
<!-- GFX1 8k-->
<part name="pest.o"/>
<part name="pest.k"/>
<!-- GFX2 16k-->
<part name="pest.b"/>
<part name="pest.a"/>
<part name="pest.d"/>
<part name="pest.c"/>
<!-- Sound CPU 4k-->
<part name="pest.4"/>
<!-- LUTs -->
<part name="n82s129a.bin"/>
<part name="n82s129a.bin"/>
<part name="n82s129b.bin"/>
<part name="n82s129b.bin"/>
<part repeat="3072">00</part>
</rom>
</misterromdescription>

File diff suppressed because it is too large Load Diff

View File

@ -44,6 +44,8 @@ wire rotate = status[2];
wire [1:0] scanlines = status[4:3];
wire blend = status[5];
wire landscape = core_mod[3];
assign LED = ~ioctl_downl;
assign AUDIO_R = AUDIO_L;
assign SDRAM_CLK = clock_24;
@ -160,6 +162,8 @@ dkong_top dkong(
.I_DIP_SW(status[15:8]),
.I_DKJR(core_mod[0]),
.I_DK3B(core_mod[1]),
.I_RADARSCP(core_mod[2]),
.I_PESTPLCE(core_mod[3]),
.O_SOUND_DAT(audio),
.O_VGA_R(r),
.O_VGA_G(g),
@ -262,7 +266,7 @@ arcade_inputs inputs (
.joystick_0 ( joystick_0 ),
.joystick_1 ( joystick_1 ),
.rotate ( rotate ),
.orientation ( 2'b11 ),
.orientation ( {1'b1, ~landscape} ),
.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} ),

View File

@ -25,6 +25,7 @@ I_CLK_EN_N,
I_RESET_n,
I_DKJR,
I_DK3B,
I_PESTPLCE,
I_AB,
I_DB,
I_MREQ_n,
@ -55,7 +56,8 @@ O_DIP_OE_n,
O_4H_Q,
O_5H_Q,
O_6H_Q,
O_3D_Q
O_3D_Q,
O_AREF
);
@ -65,6 +67,7 @@ input I_CLK_EN_N;
input I_RESET_n;
input I_DKJR;
input I_DK3B;
input I_PESTPLCE;
input [15:0]I_AB;
input [3:0]I_DB;
input I_MREQ_n;
@ -94,6 +97,7 @@ output [1:0]O_4H_Q; // GFX (Characters) bank switch, sound
output [7:0]O_5H_Q; // FLIP,
output [7:0]O_6H_Q; // sound
output [4:0]O_3D_Q; // sound
output [2:0]O_AREF; // 7C80 H Radar Scope grid color (W)
output O_WAIT_n;
output O_NMI_n;
@ -152,7 +156,7 @@ logic_74xx138 U_4D(
);
assign O_ROM_CS_n = I_DKJR ? (&W_4D_Q[5:0] & (!I_DK3B | !(I_AB[15:12] == 4'h9 | I_AB[15:12] == 4'hD))) : &W_4D_Q[3:0];
assign O_ROM_CS_n = I_DKJR ? (&W_4D_Q[5:0] & (!I_PESTPLCE | I_AB[15:12] != 4'hB) & (!I_DK3B | !(I_AB[15:12] == 4'h9 | I_AB[15:12] == 4'hD))) : &W_4D_Q[3:0];
// ADDR DEC 7000H - 7FFFH
@ -321,16 +325,24 @@ assign O_6H_Q = W_6H_Q;
// Parts 3D
reg [4:0]O_3D_Q;
reg [2:0]W_AREF;
assign O_AREF = W_AREF;
always@(posedge I_CLK24M or negedge I_RESET_n)
begin
reg W_1C_Q0_D;
if(! I_RESET_n) O_3D_Q <= 0;
else begin
reg W_1C_Q0_D, W_1C_Q1_D;
if(! I_RESET_n) begin
O_3D_Q <= 0;
W_AREF <= 0;
end else begin
W_1C_Q0_D <= W_1C_Q[0];
W_1C_Q1_D <= W_1C_Q[1];
if (!W_1C_Q0_D & W_1C_Q[0]) begin
O_3D_Q <= I_DB;
end
if (!W_1C_Q1_D & W_1C_Q[1]) begin
W_AREF <= I_DB[2:0];
end
end
end

View File

@ -18,6 +18,7 @@ module dkong_col_pal(
input CLK_24M,
input CLK_6M_EN,
input I_DK3B,
input I_PESTPLCE,
input I_PALBNK,
input [5:0]I_VRAM_D,
input [5:0]I_OBJ_D,
@ -86,8 +87,8 @@ dpram #(9,8) col2 (
);
//assign {O_R, O_G, O_B} = I_DK3B ? {W_2F_DO, W_2E_DO} : ~{W_2F_DO[3:1], W_2F_DO[3], ~W_2E_DO};
assign O_R = I_DK3B ? W_2F_DO[7:4] : ~{W_2F_DO[3:1], W_2F_DO[3]};
assign O_G = I_DK3B ? W_2F_DO[3:0] : ~{W_2F_DO[0], W_2E_DO[3:2], W_2F_DO[0]};
assign O_B = I_DK3B ? W_2E_DO[3:0] : ~{W_2E_DO[1:0], W_2E_DO[1:0]};
assign O_R = I_DK3B ? W_2F_DO[7:4] : {4{I_PESTPLCE}} ^ ~{W_2F_DO[3:1], W_2F_DO[3]};
assign O_G = I_DK3B ? W_2F_DO[3:0] : {4{I_PESTPLCE}} ^ ~{W_2F_DO[0], W_2E_DO[3:2], W_2F_DO[0]};
assign O_B = I_DK3B ? W_2E_DO[3:0] : {4{I_PESTPLCE}} ^ ~{W_2E_DO[1:0], W_2E_DO[1:0]};
endmodule

View File

@ -31,6 +31,7 @@ module dkong_obj(
input CLK_24M,
input CLK_12M,
input CLK_12M_EN,
input I_PESTPLCE,
input [9:0] I_AB,
// input [7:0] I_DB,
input [7:0] I_OBJ_D,
@ -170,8 +171,9 @@ always@(posedge W_5F2_Q[0]) W_8H_Q <= W_8H_D;
reg [7:0]W_6J_Q;
always@(posedge W_5F2_Q[2]) W_6J_Q <= W_HD[7:0];
wire [7:0]W_6K_D = {W_6J_Q[7],I_CMPBLKn,~I_H_CNT[9],
~(I_H_CNT[9]|W_FLIP_2),W_6J_Q[3:0]};
wire [7:0]W_6K_D = !I_PESTPLCE ?
{W_6J_Q[7],I_CMPBLKn,~I_H_CNT[9],~(I_H_CNT[9]|W_FLIP_2),W_6J_Q[3:0]} :
{W_6H_Q[7],I_CMPBLKn,~I_H_CNT[9],~(I_H_CNT[9]|W_FLIP_2),W_6H_Q[3:0]};
reg [7:0]W_6K_Q;
always@(posedge CLK_24M)
@ -309,8 +311,9 @@ begin
O_OBJ_DO <= O_OBJ_DO ;
end
wire [11:0]W_ROM_OBJ_AB = {W_6J_Q[6],W_6H_Q[6:0],W_8H_Q[3:0]^{W_6H_Q[7],W_6H_Q[7],W_6H_Q[7],W_6H_Q[7]}};
wire [11:0]W_ROM_OBJ_AB = !I_PESTPLCE ?
{W_6J_Q[6],W_6H_Q[6:0],W_8H_Q[3:0]^{{4{W_6H_Q[7]}}}} :
{W_6J_Q[7:0],W_8H_Q[3:0]^{4{W_6H_Q[6]}}};
wire [7:0]W_OBJ_DO_7C,W_OBJ_DO_7D,W_OBJ_DO_7E,W_OBJ_DO_7F;

View File

@ -10,6 +10,7 @@ module dkong_soundboard(
input [1:0] W_4H_Q,
input [4:0] W_3D_Q,
output [15:0] O_SOUND_DAT,
output O_SACK,
output [11:0] ROM_A,
input [7:0] ROM_D,
output [18:0] WAV_ROM_A,
@ -60,6 +61,7 @@ I8035IP SOUND_CPU
.I_P2(I8035_PBO),
.O_P2(I8035_PBI)
);
assign O_SACK = I8035_PBI[4];
//-------------------------------------------------
dkong_sound Digtal_sound

View File

@ -37,6 +37,8 @@ module dkong_top
input [7:0] I_DIP_SW,
input I_DKJR,
input I_DK3B,
input I_RADARSCP,
input I_PESTPLCE,
// VGA (VIDEO) IF
output [3:0]O_VGA_R,
@ -96,7 +98,7 @@ wire W_SW2_OEn ;
wire W_SW3_OEn ;
wire W_DIP_OEn ;
wire [1:0]W_4H_Q;
wire [2:0]W_4H_Q;
wire [7:0]W_5H_Q;
wire [7:0]W_6H_Q;
wire [4:0]W_3D_Q;
@ -187,6 +189,9 @@ always @(*) begin
6'h07: MAIN_CPU_A = {5'h03,W_CPU_A[10:0]}; // 0x3800-0x3FFF -> 0x1800-0x1FFF in ROM file
6'h09: MAIN_CPU_A = {5'h05,W_CPU_A[10:0]}; // 0x4800-0x4FFF -> 0x2800-0x2FFF in ROM file
6'h0B: MAIN_CPU_A = {5'h07,W_CPU_A[10:0]}; // 0x5800-0x5FFF -> 0x3800-0x3FFF in ROM file
//pestplace
6'h16: MAIN_CPU_A = {5'h0C,W_CPU_A[10:0]}; // 0xB000-0xB7FF -> 0x6000-0x6FFF in ROM file
6'h17: MAIN_CPU_A = {5'h0D,W_CPU_A[10:0]}; // 0xB800-0xBFFF -> 0x6000-0x6FFF in ROM file
// dkong3b
6'h12: MAIN_CPU_A = {5'h0C,W_CPU_A[10:0]}; // 0x9000-0x97FF -> 0x6000-0x6FFF in ROM file
6'h13: MAIN_CPU_A = {5'h0D,W_CPU_A[10:0]}; // 0x9800-0x9FFF -> 0x6000-0x6FFF in ROM file
@ -294,9 +299,10 @@ ram_1024_8_8 U_6PR
);
//=========== SW Interface ========================================================
wire W_SACK;
wire [7:0]W_SW1 = W_SW1_OEn ? 8'h00: ~{1'b1,1'b1,1'b1,I_J1,I_D1,I_U1,I_L1,I_R1};
wire [7:0]W_SW2 = W_SW2_OEn ? 8'h00: ~{1'b1,1'b1,1'b1,I_J2,I_D2,I_U2,I_L2,I_R2};
wire [7:0]W_SW3 = W_SW3_OEn ? 8'h00: ~{I_C1,1'b1,1'b1,1'b1,I_S2,I_S1,1'b1,1'b1};
wire [7:0]W_SW3 = W_SW3_OEn ? 8'h00: ~{I_C1,~I_RADARSCP | W_SACK,1'b1,1'b1,I_S2,I_S1,1'b1,1'b1};
wire [7:0]W_DIP = W_DIP_OEn ? 8'h00: I_DIP_SW;
@ -312,6 +318,7 @@ dkong_adec adec
.I_RESET_n(W_RESETn),
.I_DKJR(I_DKJR),
.I_DK3B(I_DK3B),
.I_PESTPLCE(I_PESTPLCE),
.I_AB(W_CPU_A),
.I_DB(WI_D),
.I_MREQ_n(W_CPU_MREQn),
@ -341,10 +348,12 @@ dkong_adec adec
.O_4H_Q(W_4H_Q),
.O_5H_Q(W_5H_Q),
.O_6H_Q(W_6H_Q),
.O_3D_Q(W_3D_Q)
.O_3D_Q(W_3D_Q),
.O_AREF(W_AREF)
);
wire W_FLIPn = W_5H_Q[2];
wire W_DISPLAY = W_5H_Q[1]; // radar enable
wire W_FLIPn = I_PESTPLCE ^ W_5H_Q[2];
wire W_2PSL = W_5H_Q[3];
wire W_DREQ = W_5H_Q[5]; // DMA Trigger
@ -387,6 +396,7 @@ dkong_obj obj
.CLK_24M(W_CLK_24576M),
.CLK_12M(WB_CLK_12288M),
.CLK_12M_EN(W_CLK_12288M_EN),
.I_PESTPLCE(I_PESTPLCE),
.I_AB(),
.I_DB(/*W_2N_DO*/),
.I_OBJ_D(W_OBJ_DI),
@ -435,7 +445,44 @@ dkong_vram vram
.DL_DATA(DL_DATA)
);
wire W_RADARn;
wire W_STARn;
wire W_NOISE;
wire W_DISPLAY_O;
radarscp_stars rstars
(
.CLK_24M(W_CLK_24576M),
.CLK_EN(W_CLK_12288M),
.RESETn(W_RESETn),
.O_RADARn(W_RADARn),
.O_STARn(W_STARn),
.O_NOISE(W_NOISE),
.O_DISPLAY(W_DISPLAY_O),
.I_DISPLAY(W_DISPLAY),
.I_VBLKn(W_V_BLANKn),
.I_H_CNT(W_H_CNT),
.I_FLIPn(W_FLIPn),
.I_SOU2(W_6H_Q[2]),
.DL_ADDR(DL_ADDR),
.DL_WR(DL_WR),
.DL_DATA(DL_DATA)
);
assign O_PIX = W_H_CNT[0];
wire [3:0] W_RED;
wire [3:0] W_GREEN;
wire [3:0] W_BLUE;
wire [2:0] W_AREF;
wire [2:0] W_GRID = {3{W_L_CMPBLKn & W_DISPLAY_O & ~W_RADARn & I_RADARSCP}} & W_AREF;
wire W_STAR = W_L_CMPBLKn & W_NOISE & ~W_STARn & I_RADARSCP;
wire [4:0] W_RED_TOTAL = W_RED + {W_GRID[0] | W_STAR, 3'b000};
wire [4:0] W_GREEN_TOTAL = W_GREEN + {W_GRID[1] & ~W_STAR, 3'b000};
wire [4:0] W_BLUE_TOTAL = W_BLUE + {W_GRID[2] & ~W_STAR, I_RADARSCP & W_L_CMPBLKn, I_RADARSCP & W_L_CMPBLKn, 1'b0};
assign O_VGA_R = W_RED_TOTAL[4] ? 4'hF : W_RED_TOTAL[3:0];
assign O_VGA_G = W_GREEN_TOTAL[4] ? 4'hF : W_GREEN_TOTAL[3:0];
assign O_VGA_B = W_BLUE_TOTAL[4] ? 4'hF : W_BLUE_TOTAL[3:0];
dkong_col_pal cpal
(
@ -443,14 +490,15 @@ dkong_col_pal cpal
.CLK_24M(W_CLK_24576M),
.CLK_6M_EN(W_CLK_12288M & !W_H_CNT[0]),
.I_DK3B(I_DK3B),
.I_PESTPLCE(I_PESTPLCE),
.I_VRAM_D({W_VRAM_COL[3:0],W_VRAM_VID[1:0]}),
.I_OBJ_D(W_OBJ_DAT),
.I_CMPBLKn(W_L_CMPBLKn),
.I_5H_Q6(W_5H_Q[6]),
.I_5H_Q7(W_5H_Q[7]),
.O_R(O_VGA_R),
.O_G(O_VGA_G),
.O_B(O_VGA_B),
.O_R(W_RED),
.O_G(W_GREEN),
.O_B(W_BLUE),
.DL_ADDR(DL_ADDR),
.DL_WR(DL_WR),
@ -462,6 +510,7 @@ dkong_soundboard dkong_soundboard(
.W_RESETn(W_RESETn),
.I_DKJR(I_DKJR),
.O_SOUND_DAT(O_SOUND_DAT),
.O_SACK(W_SACK),
.W_6H_Q(W_6H_Q),
.W_5H_Q0(W_5H_Q[0]),
.W_4H_Q(W_4H_Q),

View File

@ -0,0 +1,110 @@
//===============================================================================
// FPGA DONKEY KONG Radar Scope grid/star generator
//
// Version : 1.00
//
// Copyright(c) 2021 Gyorgy Szombathelyi
//
// Important !
//
// This program is freeware for non-commercial use.
// An author does no guarantee about this program.
// You can use this under your own risk.
//
//================================================================================
//-----------------------------------------------------------------------------------------
// H_CNT[0],H_CNT[1],H_CNT[2],H_CNT[3],H_CNT[4],H_CNT[5],H_CNT[6],H_CNT[7],H_CNT[8],H_CNT[9]
// 1/2 H 1 H 2 H 4H 8H 16 H 32H 64 H 128 H 256 H
//-----------------------------------------------------------------------------------------
module radarscp_stars(
input CLK_24M,
input CLK_EN,
input RESETn,
output O_RADARn,
output O_STARn,
output O_NOISE,
output O_DISPLAY,
input I_DISPLAY,
input I_VBLKn,
input [9:0] I_H_CNT,
input I_FLIPn,
input I_SOU2,
input [15:0] DL_ADDR,
input DL_WR,
input [7:0] DL_DATA
);
reg [7:0] RADAR_SHIFT;
reg [19:0] CNT_30HZ;
reg NOISE;
reg [15:0] NOISE_LFSR;
always @(posedge CLK_24M, negedge RESETn) begin
if (!RESETn) begin
RADAR_SHIFT <= 0;
CNT_30HZ <= 0;
end else begin
CNT_30HZ <= CNT_30HZ + 1'd1;
if (CNT_30HZ == 20'd799999) begin
RADAR_SHIFT <= {RADAR_SHIFT[6:0], ~^RADAR_SHIFT[7:6]};
CNT_30HZ <= 0;
NOISE_LFSR <= {NOISE_LFSR[14:0], (NOISE ^ NOISE_LFSR[4])};
NOISE <= ~NOISE_LFSR[15]; // originally generated on the sound board - used for stars dimming
end
end
end
wire W_RFLIP = (RADAR_SHIFT[5] & I_SOU2) ^ I_FLIPn; // does the radar flipping when destroyed
assign O_DISPLAY = I_DISPLAY; // TODO: grid slow drawing effect
reg [10:0] STARS_A;
wire [7:0] STARS_DO;
reg [3:0] W_1E_D;
assign O_NOISE = NOISE;
assign O_STARn = ~(W_1E_D[2] & W_1E_D[1] & W_1E_D[0]);
assign O_RADARn = ~(~W_1E_D[2] & W_1E_D[1] & W_1E_D[0]);
wire [3:0] W_1E_D_next = { 1'b1, STARS_DO[7], W_1E_D[0], {1'b0, STARS_DO[6:0]} == {I_H_CNT[2], I_H_CNT[9:3]} };
`ifdef SIM
always @(posedge I_H_CNT[0]) begin
W_1E_D <= W_1E_D_next;
end
wire W_1G_2E_CLK = ~&W_1E_D[1:0];
always @(posedge W_1G_2E_CLK, negedge I_VBLKn) begin
if (!I_VBLKn)
STARS_A <= {W_RFLIP, 10'd0};
else
STARS_A <= STARS_A + 1'd1;
end
`else
always @(posedge CLK_24M) begin
if (CLK_EN & ~I_H_CNT[0])
W_1E_D <= W_1E_D_next;
end
always @(posedge CLK_24M, negedge I_VBLKn) begin
if (!I_VBLKn)
STARS_A <= 0;
else if (CLK_EN) begin
if (&W_1E_D[1:0] & ~&W_1E_D_next[1:0]) STARS_A <= {W_RFLIP, STARS_A[9:0] + 1'd1};
end
end
`endif
dpram #(11,8) U_3E (
.clock_a(CLK_24M),
.address_a(STARS_A),
.q_a(STARS_DO),
.clock_b(CLK_24M),
.address_b(DL_ADDR[10:0]),
.wren_b(DL_WR && DL_ADDR[15:11] == {4'hF, 1'b1}),
.data_b(DL_DATA)
);
endmodule