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:
parent
5b85d49b36
commit
789dd9729d
@ -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
|
||||
@ -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
@ -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),
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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),
|
||||
|
||||
@ -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
|
||||
Loading…
x
Reference in New Issue
Block a user