1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-01-21 10:02:30 +00:00

Donkey Kong: add Radar Scope

This commit is contained in:
Gyorgy Szombathelyi 2021-01-03 15:52:47 +01:00
parent 5b85d49b36
commit 789dd9729d
8 changed files with 2834 additions and 11 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.
---------------------------------------------------------------------------------

File diff suppressed because it is too large Load Diff

View File

@ -160,6 +160,7 @@ dkong_top dkong(
.I_DIP_SW(status[15:8]),
.I_DKJR(core_mod[0]),
.I_DK3B(core_mod[1]),
.I_RADARSCP(core_mod[2]),
.O_SOUND_DAT(audio),
.O_VGA_R(r),
.O_VGA_G(g),

View File

@ -55,7 +55,8 @@ O_DIP_OE_n,
O_4H_Q,
O_5H_Q,
O_6H_Q,
O_3D_Q
O_3D_Q,
O_AREF
);
@ -94,6 +95,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;
@ -321,16 +323,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

@ -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,7 @@ module dkong_top
input [7:0] I_DIP_SW,
input I_DKJR,
input I_DK3B,
input I_RADARSCP,
// VGA (VIDEO) IF
output [3:0]O_VGA_R,
@ -96,7 +97,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;
@ -294,9 +295,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;
@ -341,9 +343,11 @@ 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_DISPLAY = W_5H_Q[1]; // radar enable
wire W_FLIPn = W_5H_Q[2];
wire W_2PSL = W_5H_Q[3];
wire W_DREQ = W_5H_Q[5]; // DMA Trigger
@ -435,7 +439,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
(
@ -448,9 +489,9 @@ dkong_col_pal cpal
.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 +503,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