From 426ea2e8090cfd283ce73742c5ff33e0a9014e3a Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sat, 12 Jun 2021 19:24:41 +0200 Subject: [PATCH 1/8] Update Ninjakun, add MRA --- .../NinjaKun_MiST/meta/Ninjakun.mra | 78 ++++++++++++++++ .../NinjaKun_MiST/rtl/NinjaKun_MiST.sv | 91 ++++++++----------- 2 files changed, 115 insertions(+), 54 deletions(-) create mode 100644 Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Ninjakun.mra diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Ninjakun.mra b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Ninjakun.mra new file mode 100644 index 00000000..bec6c7dc --- /dev/null +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Ninjakun.mra @@ -0,0 +1,78 @@ + + Ninjakun Majou no Bouken + + no + no + + + + + 1984 + UPL + Taito + Platform - Climb + + ninjakun + ninjakun + 0220 + ninjakun + + + 15kHz + horizontal + + + 2 (alternating) + 2-way horizontal + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 17 00 00 00 00 FF 00 02 00 02 00 01 00 FF 00 00 + 00 00 E0 A3 00 37 00 20 + 00 00 C0 8C 00 07 22 10 + + + + + + + + + 20210430005030 + \ No newline at end of file diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv index c3e3287e..4555f25b 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv @@ -30,19 +30,11 @@ module NinjaKun_MiST ( `include "rtl\build_id.v" localparam CONF_STR = { - "NINJAKUN;ROM;", + "NINJAKUN;;", "O2,Rotate Controls,Off,On;", - "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "O34,Scandoubler Fx,None,CRT 25%,CRT 50%,CRT 75%;", "O5,Blend,Off,On;", - "O8,Difficulty,Normal,Hard;", - "O9A,Lives,4,3,2,5;", - "OB,1st Extra,30000,40000;", - "OCD,2nd Extra (Every),50000,70000,90000,None;", - "OF,Allow Continue,No,Yes;", - "OG,Free Play,No,Yes;", - "OH,Endless(If Free Play),No,Yes;", - "OE,Demo Sound,Off,On;", - "OI,Name Letters,8,3;", + "DIP;", "T0,Reset;", "V,v1.00.",`BUILD_DATE }; @@ -52,6 +44,10 @@ assign AUDIO_R = AUDIO_L; assign SDRAM_CLK = CLOCK_48; assign SDRAM_CKE = 1; +wire rotate = status[2]; +wire [1:0] scanlines = status[4:3]; +wire blend = status[5]; + wire CLOCK_48, pll_locked; pll pll( .inclk0(CLOCK_27), @@ -66,6 +62,7 @@ wire [7:0] joystick_0; wire [7:0] joystick_1; wire scandoublerD; wire ypbpr; +wire no_csync; wire [15:0] audio; wire hs, vs; wire [3:0] r, g, b; @@ -178,10 +175,10 @@ wire [11:0] POUT; ninjakun_top ninjakun_top( .RESET(reset), .MCLK(CLOCK_48), - .CTR1(~{2'b11, btn_one_player, 1'b0, m_fire, m_bomb, m_right, m_left }), - .CTR2(~{~btn_coin, 1'b1, btn_two_players, 1'b0, m_fire, m_bomb, m_right, m_left }), - .DSW1({~status[8], ~status[14], ~status[13:12], ~status[11], ~status[10:9], 1'b0}), - .DSW2({~status[17], ~status[16], 1'b0, ~status[15], ~status[18], 3'b111}), + .CTR1(~{2'b11, m_one_player, 1'b0, m_fireA, m_fireB, m_right, m_left }), + .CTR2(~{~(m_coin1 | m_coin2), 1'b1, m_two_players, 1'b0, m_fireB, m_fire2B, m_right2, m_left2 }), + .DSW1(status[15:8]), + .DSW2(status[23:16]), .PH(HPOS), .PV(VPOS), .PCLK_EN(PCLK_EN), @@ -229,12 +226,13 @@ mist_video #(.COLOR_DEPTH(4), .SD_HCNT_WIDTH(11)) mist_video( .VGA_B ( VGA_B ), .VGA_VS ( VGA_VS ), .VGA_HS ( VGA_HS ), - .rotate ( {1'b1,status[2]} ), - .ce_divider ( 1'b1 ), - .blend ( status[5] ), + .rotate ( { 1'b1, rotate } ), + .ce_divider ( 1'b1 ), + .blend ( blend ), .scandoubler_disable( scandoublerD ), - .scanlines ( status[4:3] ), - .ypbpr ( ypbpr ) + .scanlines ( scanlines ), + .ypbpr ( ypbpr ), + .no_csync ( no_csync ) ); user_io #(.STRLEN(($size(CONF_STR)>>3)))user_io( @@ -248,6 +246,7 @@ user_io #(.STRLEN(($size(CONF_STR)>>3)))user_io( .switches (switches ), .scandoubler_disable (scandoublerD ), .ypbpr (ypbpr ), + .no_csync (no_csync ), .key_strobe (key_strobe ), .key_pressed (key_pressed ), .key_code (key_code ), @@ -262,41 +261,25 @@ dac #(.C_bits(16))dac( .dac_i(audio), .dac_o(AUDIO_L) ); -// Rotated Normal -//wire m_up = ~status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_up | joystick_0[3] | joystick_1[3]; -//wire m_down = ~status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_down | joystick_0[2] | joystick_1[2]; -wire m_left = status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_left | joystick_0[1] | joystick_1[1]; -wire m_right = status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_right | joystick_0[0] | joystick_1[0]; -wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; -wire m_bomb = btn_fire2 | joystick_0[5] | joystick_1[5]; -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_fire3 = 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 -// 'h14: btn_fire3 <= key_pressed; // ctrl - 'h11: btn_fire2 <= key_pressed; // alt - 'h29: btn_fire1 <= key_pressed; // Space - 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 From e912a2fefc4b9887298baeb8658c4a2334bb9426 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sun, 13 Jun 2021 01:40:24 +0200 Subject: [PATCH 2/8] Nova2001: add Raiders5 --- .../NinjaKun_MiST/meta/Ninjakun.mra | 6 +- .../NinjaKun_MiST/meta/Raiders5.mra | 58 ++++++++ .../NinjaKun_MiST/rtl/NinjaKun_MiST.sv | 22 ++- .../NinjaKun_MiST/rtl/ninjakun_adec.v | 26 +++- .../NinjaKun_MiST/rtl/ninjakun_cpumux.v | 2 + .../NinjaKun_MiST/rtl/ninjakun_io_video.v | 75 ++++++---- .../NinjaKun_MiST/rtl/ninjakun_main.v | 14 +- .../NinjaKun_MiST/rtl/ninjakun_psg.v | 38 ++--- .../NinjaKun_MiST/rtl/ninjakun_sadec.v | 48 +++++-- .../NinjaKun_MiST/rtl/ninjakun_sprite.v | 86 ++++++----- .../NinjaKun_MiST/rtl/ninjakun_top.v | 8 ++ .../NinjaKun_MiST/rtl/ninjakun_video.v | 135 +++++++----------- 12 files changed, 336 insertions(+), 182 deletions(-) create mode 100644 Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Raiders5.mra diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Ninjakun.mra b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Ninjakun.mra index bec6c7dc..cd98c373 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Ninjakun.mra +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Ninjakun.mra @@ -41,20 +41,24 @@ - + 0 + + + + diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Raiders5.mra b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Raiders5.mra new file mode 100644 index 00000000..376a35e0 --- /dev/null +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Raiders5.mra @@ -0,0 +1,58 @@ + + Raiders5 + + no + no + + + + + 1984 + UPL + Taito + Platform - Climb + + raiders5 + ninjakun + 0220 + ninjakun + + 15kHz + horizontal + + + 2 (alternating) + 2-way horizontal + + 2 + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv index 4555f25b..453f5af3 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv @@ -34,6 +34,7 @@ localparam CONF_STR = { "O2,Rotate Controls,Off,On;", "O34,Scandoubler Fx,None,CRT 25%,CRT 50%,CRT 75%;", "O5,Blend,Off,On;", + "O6,Service,Off,On;", "DIP;", "T0,Reset;", "V,v1.00.",`BUILD_DATE @@ -47,6 +48,21 @@ assign SDRAM_CKE = 1; wire rotate = status[2]; wire [1:0] scanlines = status[4:3]; wire blend = status[5]; +wire service = status[6]; + +wire [6:0] core_mod; +wire RAIDERS5 = core_mod == 1; + +reg [7:0] CTR1, CTR2; + +always @(*) begin + CTR1 = ~{2'b11, m_one_player, 1'b0, m_fireA, m_fireB, m_right, m_left }; + CTR2 = ~{~(m_coin1 | m_coin2), ~service, m_two_players, 1'b0, m_fire2A, m_fire2B, m_right2, m_left2 }; + if (RAIDERS5) begin + CTR1 = ~{1'b0, 1'b0, m_one_player, m_fireA, m_up, m_down, m_right, m_left }; + CTR2 = ~{(m_coin1 | m_coin2), service, m_two_players, m_fire2A, m_up2, m_down2, m_right2, m_left2}; + end +end wire CLOCK_48, pll_locked; pll pll( @@ -175,8 +191,9 @@ wire [11:0] POUT; ninjakun_top ninjakun_top( .RESET(reset), .MCLK(CLOCK_48), - .CTR1(~{2'b11, m_one_player, 1'b0, m_fireA, m_fireB, m_right, m_left }), - .CTR2(~{~(m_coin1 | m_coin2), 1'b1, m_two_players, 1'b0, m_fireB, m_fire2B, m_right2, m_left2 }), + .RAIDERS5(RAIDERS5), + .CTR1(CTR1), + .CTR2(CTR2), .DSW1(status[15:8]), .DSW2(status[23:16]), .PH(HPOS), @@ -244,6 +261,7 @@ user_io #(.STRLEN(($size(CONF_STR)>>3)))user_io( .SPI_MOSI (SPI_DI ), .buttons (buttons ), .switches (switches ), + .core_mod (core_mod ), .scandoubler_disable (scandoublerD ), .ypbpr (ypbpr ), .no_csync (no_csync ), diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_adec.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_adec.v index b5b9977e..c017d17a 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_adec.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_adec.v @@ -1,5 +1,6 @@ module ninjakun_adec ( + input RAIDERS5, input [15:0] CP0AD, input CP0WR, @@ -16,13 +17,26 @@ module ninjakun_adec output SYNWR1 ); -assign CS_IN0 = (CP0AD[15:2] == 14'b1010_0000_0000_00); -assign CS_IN1 = (CP1AD[15:2] == 14'b1010_0000_0000_00); +always @(*) begin + CS_IN0 = (CP0AD[15:2] == 14'b1010_0000_0000_00); + CS_IN1 = (CP1AD[15:2] == 14'b1010_0000_0000_00); -assign CS_SH0 = (CP0AD[15:11] == 5'b1110_0); -assign CS_SH1 = (CP1AD[15:11] == 5'b1110_0); + CS_SH0 = (CP0AD[15:11] == 5'b1110_0); + CS_SH1 = (CP1AD[15:11] == 5'b1110_0); -assign SYNWR0 = CS_IN0 & (CP0AD[1:0]==2) & CP0WR; -assign SYNWR1 = CS_IN1 & (CP1AD[1:0]==2) & CP1WR; + SYNWR0 = CS_IN0 & (CP0AD[1:0]==2) & CP0WR; + SYNWR1 = CS_IN1 & (CP1AD[1:0]==2) & CP1WR; + + if (RAIDERS5) begin + CS_IN0 = 0; + CS_IN1 = 0; + + CS_SH0 = (CP0AD[15:11] == 5'b1110_0); + CS_SH1 = (CP1AD[15:11] == 5'b1010_0); + + SYNWR0 = 0; + SYNWR1 = 0; + end +end endmodule \ No newline at end of file diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_cpumux.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_cpumux.v index 117e5cb0..6f32333a 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_cpumux.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_cpumux.v @@ -6,6 +6,7 @@ module ninjakun_cpumux input [7:0] CPIDT, output CPRED, output CPWRT, + output CPSEL, output reg CP0CL, output reg CP0CE_P, @@ -26,6 +27,7 @@ module ninjakun_cpumux input CP1WR ); +assign CPSEL = CSIDE; reg [7:0] CP0DT, CP1DT; reg [3:0] PHASE; reg CSIDE; diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v index 9dea211e..8b36b0c9 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v @@ -2,28 +2,32 @@ module ninjakun_io_video ( - input MCLK, - input PCLK_EN, - input RESET, - input [8:0] PH, - input [8:0] PV, - input [15:0] CPADR, - input [7:0] CPODT, - output [7:0] CPIDT, - input CPRED, - input CPWRT, - input [7:0] DSW1, - input [7:0] DSW2, - output VBLK, - output [7:0] POUT, - output [15:0] SNDOUT, - output [12:0] sp_rom_addr, - input [31:0] sp_rom_data, + input MCLK, + input RAIDERS5, + input PCLK_EN, + input RESET, + input [8:0] PH, + input [8:0] PV, + input [15:0] CPADR, + input [7:0] CPODT, + output [7:0] CPIDT, + input CPRED, + input CPWRT, + input CPSEL, + input [7:0] DSW1, + input [7:0] DSW2, + input [7:0] CTR1, + input [7:0] CTR2, + output VBLK, + output [7:0] POUT, + output [15:0] SNDOUT, + output [12:0] sp_rom_addr, + input [31:0] sp_rom_data, input sp_rdy, - output [12:0] fg_rom_addr, - input [31:0] fg_rom_data, - output [12:0] bg_rom_addr, - input [31:0] bg_rom_data + output [12:0] fg_rom_addr, + input [31:0] fg_rom_data, + output [12:0] bg_rom_addr, + input [31:0] bg_rom_data ); wire [9:0] FGVAD; @@ -32,12 +36,16 @@ wire [9:0] BGVAD; wire [15:0] BGVDT; wire [10:0] SPAAD; wire [7:0] SPADT; -wire [7:0] SCRPX, SCRPY; +wire [7:0] SCRPX = RAIDERS5 ? SCRPX_CPU : SCRPX_PSG, SCRPY = RAIDERS5 ? SCRPY_CPU : SCRPY_PSG; +wire [7:0] SCRPX_PSG, SCRPY_PSG; +reg [7:0] SCRPX_CPU, SCRPY_CPU; wire [8:0] PALET; + NINJAKUN_VIDEO video ( .RESET(RESET), .MCLK(MCLK), .PCLK_EN(PCLK_EN), + .RAIDERS5(RAIDERS5), .PH(PH), .PV(PV), .PALAD(PALET), // Pixel Output (Palet Index) @@ -60,15 +68,28 @@ NINJAKUN_VIDEO video ( .bg_rom_data(bg_rom_data) ); -wire CS_PSG, CS_FGV, CS_BGV, CS_SPA, CS_PAL; +wire CS_SCRX, CS_SCRY, CS_PSG, CS_FGV, CS_BGV, CS_SPA, CS_PAL; ninjakun_sadec sadec( + .RAIDERS5(RAIDERS5), .CPADR(CPADR), + .CPSEL(CPSEL), + .CS_SCRX(CS_SCRX), + .CS_SCRY(CS_SCRY), .CS_PSG(CS_PSG), .CS_FGV(CS_FGV), .CS_BGV(CS_BGV), .CS_SPA(CS_SPA), .CS_PAL(CS_PAL) ); +always @(posedge MCLK) begin + if (RESET) begin + SCRPX_CPU <= 0; + SCRPY_CPU <= 0; + end else begin + if (CS_SCRX) SCRPX_CPU <= CPODT; + if (CS_SCRY) SCRPY_CPU <= CPODT; + end +end wire [7:0] PSDAT, FGDAT = CPADR[10] ? FGDAT16[15:8] : FGDAT16[7:0], BGDAT = CPADR[10] ? BGDAT16[15:8] : BGDAT16[7:0], SPDAT, PLDAT; wire [15:0] FGDAT16, BGDAT16; @@ -98,6 +119,7 @@ dataselector_5D_8B cpxdsel( ninjakun_psg psg( .MCLK(MCLK), + .RAIDERS5(RAIDERS5), .ADR(CPADR[1:0]), .CS(CS_PSG), .WR(CPWRT), @@ -107,8 +129,11 @@ ninjakun_psg psg( .RD(CPRED), .DSW1(DSW1), .DSW2(DSW2), - .SCRPX(SCRPX), - .SCRPY(SCRPY), + .CTR1(CTR1), + .CTR2(CTR2), + .VBLK(VBLK), + .SCRPX(SCRPX_PSG), + .SCRPY(SCRPY_PSG), .SNDO(SNDOUT) ); diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v index 7271381b..9b2460c9 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v @@ -1,7 +1,8 @@ module ninjakun_main( - input RESET, - input MCLK, - input VBLK, + input RESET, + input MCLK, + input RAIDERS5, + input VBLK, input [7:0] CTR1, input [7:0] CTR2, @@ -11,6 +12,7 @@ module ninjakun_main( input [7:0] CPIDT, output CPRED, output CPWRT, + output CPSEL, output [14:0] CPU1ADDR, input [7:0] CPU1DT, @@ -72,6 +74,7 @@ ninjakun_cpumux ioshare( .CPIDT(CPIDT), .CPRED(CPRED), .CPWRT(CPWRT), + .CPSEL(CPSEL), .CP0CE_P(CP0CE_P), .CP0CE_N(CP0CE_N), .CP0AD(CP0AD), @@ -91,6 +94,7 @@ ninjakun_cpumux ioshare( wire CS_SH0, CS_SH1, CS_IN0, CS_IN1; wire SYNWR0, SYNWR1; ninjakun_adec adec( + .RAIDERS5(RAIDERS5), .CP0AD(CP0AD), .CP0WR(CP0WR), .CP1AD(CP1AD), @@ -113,8 +117,8 @@ assign ROM1D = CPU2DT; wire [7:0] SHDT0, SHDT1; dpram #(8,11) shmem( - MCLK, CS_SH0 & CP0WR, { CP0AD[10] ,CP0AD[9:0]}, CP0OD, SHDT0, - MCLK, CS_SH1 & CP1WR, {~CP1AD[10], CP1AD[9:0]}, CP1OD, SHDT1); + MCLK, CS_SH0 & CP0WR, { CP0AD[10] ,CP0AD[9:0]}, CP0OD, SHDT0, + MCLK, CS_SH1 & CP1WR, {RAIDERS5 ^ ~CP1AD[10], CP1AD[9:0]}, CP1OD, SHDT1); wire [7:0] INPD0, INPD1; ninjakun_input inps( diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_psg.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_psg.v index d74a98ce..f0992b2f 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_psg.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_psg.v @@ -1,18 +1,22 @@ module ninjakun_psg ( - input MCLK, - input [1:0] ADR, - input CS, - input WR, - input [7:0] ID, - output [7:0] OD, - input RESET, - input RD, - input [7:0] DSW1, - input [7:0] DSW2, - output [7:0] SCRPX, - output [7:0] SCRPY, - output [15:0] SNDO + input MCLK, + input RAIDERS5, + input [1:0] ADR, + input CS, + input WR, + input [7:0] ID, + output [7:0] OD, + input RESET, + input RD, + input [7:0] DSW1, + input [7:0] DSW2, + input [7:0] CTR1, + input [7:0] CTR2, + input VBLK, + output [7:0] SCRPX, + output [7:0] SCRPY, + output [15:0] SNDO ); wire [7:0] OD0, OD1; @@ -60,8 +64,8 @@ YM2149 psg0( .I_SEL_L(1'b0), .O_AUDIO(S0x), .O_CHAN(S0c), - .I_IOA(DSW1), - .I_IOB(DSW2), + .I_IOA(RAIDERS5 ? {~VBLK, CTR1[6:0]} : DSW1), + .I_IOB(RAIDERS5 ? CTR2 : DSW2), .ENA(ENA), .RESET_L(~RESET), .CLK(MCLK) @@ -78,8 +82,8 @@ YM2149 psg1( .I_SEL_L(1'b0), .O_AUDIO(S1x), .O_CHAN(S1c), - .I_IOA(8'd0), - .I_IOB(8'd0), + .I_IOA(RAIDERS5 ? DSW1 : 8'd0), + .I_IOB(RAIDERS5 ? DSW2 : 8'd0), .O_IOA(SCRPX), .O_IOB(SCRPY), .ENA(ENA), diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sadec.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sadec.v index 89bd4b14..91080b45 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sadec.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sadec.v @@ -2,18 +2,46 @@ module ninjakun_sadec ( + input RAIDERS5, input [15:0] CPADR, - output CS_PSG, - output CS_FGV, - output CS_BGV, - output CS_SPA, - output CS_PAL + input CPSEL, + output CS_SCRX, + output CS_SCRY, + output CS_PSG, + output CS_FGV, + output CS_BGV, + output CS_SPA, + output CS_PAL ); -assign CS_PSG = ( CPADR[15: 2] == 14'b1000_0000_0000_00 ); -assign CS_FGV = ( CPADR[15:11] == 5'b1100_0 ); -assign CS_BGV = ( CPADR[15:11] == 5'b1100_1 ); -assign CS_SPA = ( CPADR[15:11] == 5'b1101_0 ); -assign CS_PAL = ( CPADR[15:11] == 5'b1101_1 ); +always @(*) begin + CS_PSG = ( CPADR[15: 2] == 14'b1000_0000_0000_00 ); + CS_FGV = ( CPADR[15:11] == 5'b1100_0 ); + CS_BGV = ( CPADR[15:11] == 5'b1100_1 ); + CS_SPA = ( CPADR[15:11] == 5'b1101_0 ); + CS_PAL = ( CPADR[15:11] == 5'b1101_1 ); + CS_SCRX = 0; + CS_SCRY = 0; + + if (RAIDERS5) begin + if (CPSEL) begin + CS_SCRX = ( CPADR == 16'he000 ); + CS_SCRY = ( CPADR == 16'he001 ); + CS_PSG = ( CPADR[15: 2] == 14'b1000_0000_0000_00 ); + CS_FGV = 0; + CS_BGV = 0; + CS_SPA = 0; + CS_PAL = 0; + end else begin + CS_SCRX = ( CPADR == 16'ha000 ); + CS_SCRY = ( CPADR == 16'ha001 ); + CS_PSG = ( CPADR[15: 2] == 14'b1100_0000_0000_00 ); + CS_FGV = ( CPADR[15:11] == 5'b1000_1 ); + CS_BGV = ( CPADR[15:11] == 5'b1001_0 ); + CS_SPA = ( CPADR[15:11] == 5'b1000_0 ); + CS_PAL = ( CPADR[15:11] == 5'b1101_0 ); + end + end +end endmodule \ No newline at end of file diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sprite.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sprite.v index b31ec920..b9d4c948 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sprite.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sprite.v @@ -2,24 +2,25 @@ module NINJAKUN_SP ( - input MCLK, - input PCLK_EN, - input RESET, + input MCLK, + input PCLK_EN, + input RESET, + input RAIDERS5, - input [8:0] PH, - input [8:0] PV, + input [8:0] PH, + input [8:0] PV, - output [10:0] SPAAD, - input [7:0] SPADT, + output [10:0] SPAAD, + input [7:0] SPADT, - output [12:0] SPCAD, - input [31:0] SPCDT, - input SPCFT, + output [12:0] SPCAD, + input [31:0] SPCDT, + input SPCFT, - output [8:0] SPOUT + output [8:0] SPOUT ); -wire WPEN; +wire WPEN; wire [8:0] WPAD; wire [7:0] WPIX; @@ -42,7 +43,7 @@ always @(posedge MCLK) begin end NINJAKUN_SPENG eng ( - MCLK, RESET, PH, PV, + MCLK, RESET, RAIDERS5, PH, PV, SPAAD, SPADT, SPCAD, SPCDT, SPCFT, WPAD, WPIX, WPEN @@ -55,34 +56,38 @@ endmodule module NINJAKUN_SPENG ( - input MCLK, - input RESET, + input MCLK, + input RESET, + input RAIDERS5, - input [8:0] PH, - input [8:0] PV, + input [8:0] PH, + input [8:0] PV, - output [10:0] SPAAD, - input [7:0] SPADT, + output [10:0] SPAAD, + input [7:0] SPADT, - output reg [12:0] SPCAD, - input [31:0] SPCDT, - input SPCFT, + output reg [12:0] SPCAD, + input [31:0] SPCDT, + input SPCFT, - output [8:0] WPAD, - output [7:0] WPIX, - output WPEN + output [8:0] WPAD, + output [7:0] WPIX, + output WPEN ); reg [5:0] SPRNO; reg [1:0] SPRIX; -assign SPAAD = {SPRNO, 3'h0, SPRIX}; +assign SPAAD = {SPRNO, 3'h0, SPRIX}; reg [7:0] ATTR; -wire [3:0] PALNO = ATTR[3:0]; -wire FLIPH = ATTR[4]; -wire FLIPV = ATTR[5]; -wire XPOSH = ATTR[6]; -wire DSABL = ATTR[7]; +//wire [3:0] PALNO = RAIDERS5 ? ATTR[7:4] : ATTR[3:0]; +reg [3:0] PALNO; +reg FLIPH; +reg FLIPV; +//wire FLIPH = ATTR[4]; +//wire FLIPV = ATTR[5]; +wire XPOSH = !RAIDERS5 & ATTR[6]; +wire DSABL = RAIDERS5 ? ATTR[3] : ATTR[7]; reg [7:0] YPOS; reg [7:0] NV; @@ -93,11 +98,11 @@ wire YHIT = (HV[7:4]==4'b1111) & (~DSABL); reg [7:0] XPOS; reg [4:0] WP; wire [3:0] WOFS = {4{FLIPH}}^(WP[3:0]); -assign WPAD = {1'b0,XPOS}-{XPOSH,8'h0}+WOFS-1'd1; -assign WPEN = ~(WP[4]|(WPIX[3:0]==0)); +assign WPAD = {1'b0,XPOS}-{XPOSH,8'h0}+WOFS-1'd1; +assign WPEN = ~(WP[4]|(WPIX[3:0]==0)); reg [7:0] PTNO; -reg CRS; +reg CRS; function [3:0] XOUT; input [2:0] N; @@ -151,12 +156,23 @@ always @( posedge MCLK ) begin end `FETCH1: begin ATTR = SPADT; /* ATTR must block assign */ + if (!RAIDERS5) begin + PALNO <= SPADT[3:0]; + FLIPH <= SPADT[4]; + FLIPV <= SPADT[5]; + end else begin + PALNO <= SPADT[7:4]; + end SPRIX <= 0; STATE <= YHIT ? `FETCH2 : `NEXT; end `FETCH2: begin - PTNO <= SPADT; + if (RAIDERS5) begin + FLIPH <= SPADT[0]; + FLIPV <= SPADT[1]; + end + PTNO <= RAIDERS5 ? { ATTR[2:0], SPADT[7:2] } : SPADT; SPRIX <= 1; STATE <= `FETCH3; end diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_top.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_top.v index 2e6366e1..b530b3e5 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_top.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_top.v @@ -11,6 +11,7 @@ module ninjakun_top ( input RESET, // RESET input MCLK, // Master Clock (48.0MHz) + input RAIDERS5, input [7:0] CTR1, // Control Panel input [7:0] CTR2, input [7:0] DSW1, // DipSW @@ -40,11 +41,13 @@ assign PCLK_EN = CLKDIV[2:0] == 3'b111; wire [15:0] CPADR; wire [7:0] CPODT, CPIDT; +wire CPSEL; wire CPRED, CPWRT, VBLK; ninjakun_main ninjakun_main( .RESET(RESET), .MCLK(MCLK), + .RAIDERS5(RAIDERS5), .VBLK(VBLK), .CTR1(CTR1), .CTR2(CTR2), @@ -53,6 +56,7 @@ ninjakun_main ninjakun_main( .CPIDT(CPIDT), .CPRED(CPRED), .CPWRT(CPWRT), + .CPSEL(CPSEL), .CPU1ADDR(CPU1ADDR), .CPU1DT(CPU1DT), .CPU2ADDR(CPU2ADDR), @@ -68,6 +72,7 @@ wire [8:0] PALET; wire [7:0] SCRPX, SCRPY; ninjakun_io_video ninjakun_io_video( .MCLK(MCLK), + .RAIDERS5(RAIDERS5), .PCLK_EN(PCLK_EN), .RESET(RESET), .PH(PH), @@ -77,8 +82,11 @@ ninjakun_io_video ninjakun_io_video( .CPIDT(CPIDT), .CPRED(CPRED), .CPWRT(CPWRT), + .CPSEL(CPSEL), .DSW1(DSW1), .DSW2(DSW2), + .CTR1(CTR1), + .CTR2(CTR2), .VBLK(VBLK), .POUT(POUT), .SNDOUT(SNDOUT), diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_video.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_video.v index 2632a4d0..a73eeed4 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_video.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_video.v @@ -2,28 +2,29 @@ module NINJAKUN_VIDEO ( - input RESET, - input MCLK, - input PCLK_EN, + input RESET, + input MCLK, + input PCLK_EN, + input RAIDERS5, - input [8:0] PH, - input [8:0] PV, + input [8:0] PH, + input [8:0] PV, - output [8:0] PALAD, // Pixel Output (Palet Index) + output [8:0] PALAD, // Pixel Output (Palet Index) - output [9:0] FGVAD, // FG - input [15:0] FGVDT, + output [9:0] FGVAD, // FG + input [15:0] FGVDT, - output [9:0] BGVAD, // BG - input [15:0] BGVDT, - input [7:0] BGSCX, - input [7:0] BGSCY, + output [9:0] BGVAD, // BG + input [15:0] BGVDT, + input [7:0] BGSCX, + input [7:0] BGSCY, - output [10:0] SPAAD, // Sprite - input [7:0] SPADT, + output [10:0] SPAAD, // Sprite + input [7:0] SPADT, - output VBLK, - input DBGPD, // Palet Display (for Debug) + output VBLK, + input DBGPD, // Palet Display (for Debug) output [12:0] sp_rom_addr, input [31:0] sp_rom_data, @@ -63,7 +64,7 @@ assign BGCDT = bg_rom_data; wire FGPRI; wire [8:0] FGOUT; NINJAKUN_FG fg( - MCLK, PCLK_EN, + MCLK, PCLK_EN, RAIDERS5, PH, PV, FGVAD, FGVDT, FGCAD, FGCDT, @@ -74,8 +75,9 @@ wire FGPPQ = FGOPQ & (~FGPRI); // Back-Ground Scanline Generator wire [8:0] BGOUT; + NINJAKUN_BG bg( - MCLK, PCLK_EN, + MCLK, PCLK_EN, RAIDERS5, PH, PV, BGSCX, BGSCY, BGVAD, BGVDT, @@ -85,8 +87,9 @@ NINJAKUN_BG bg( // Sprite Scanline Generator wire [8:0] SPOUT; + NINJAKUN_SP sp( - MCLK, PCLK_EN, RESET, + MCLK, PCLK_EN, RESET, RAIDERS5, PH, PV, SPAAD, SPADT, SPCAD, SPCDT, SPCFT, @@ -98,38 +101,37 @@ wire SPOPQ = (SPOUT[3:0]!=0); wire [8:0] PDOUT = (PV[7]|PV[8]) ? 9'd0 : {PV[6:2],PH[7:4]}; // Color Mixer -DSEL4_9B cmix( PALAD, - DBGPD, PDOUT, - FGPPQ, FGOUT, - SPOPQ, SPOUT, - FGOPQ, FGOUT, - BGOUT -); +assign PALAD = DBGPD ? PDOUT : + FGPPQ ? FGOUT : + SPOPQ ? SPOUT : + FGOPQ ? FGOUT : + BGOUT; endmodule // ForeGround Scanline Generator module NINJAKUN_FG ( - input MCLK, - input PCLK_EN, + input MCLK, + input PCLK_EN, + input RAIDERS5, - input [8:0] PH, // CRTC - input [8:0] PV, + input [8:0] PH, // CRTC + input [8:0] PV, - output reg [9:0] FGVAD, // VRAM - input [15:0] FGVDT, + output reg [9:0] FGVAD, // VRAM + input [15:0] FGVDT, - output reg [12:0] FGCAD, - input [31:0] FGCDT, + output reg [12:0] FGCAD, + input [31:0] FGCDT, - output [9:0] FGOUT // PIXEL OUT : {PRIO,PALNO[8:0]} + output [9:0] FGOUT // PIXEL OUT : {PRIO,PALNO[8:0]} ); wire [8:0] POSH = PH+9'd8+9'd1; wire [8:0] POSV = PV+9'd32; -wire [9:0] CHRNO = {1'b0,FGVDT[13],FGVDT[7:0]}; +wire [9:0] CHRNO = RAIDERS5 ? {2'b00, FGVDT[7:0]} : {1'b0,FGVDT[13],FGVDT[7:0]}; reg [31:0] CDT; reg [4:0] PAL; @@ -137,7 +139,7 @@ reg [3:0] OUT; always @( posedge MCLK ) begin if (PCLK_EN) case(POSH[2:0]) - 0: begin OUT <= CDT[7:4] ; PAL <= FGVDT[12:8]; end + 0: begin OUT <= CDT[7:4] ; PAL <= RAIDERS5 ? {1'b0, FGVDT[15:12]} : FGVDT[12:8]; end 1: begin OUT <= CDT[3:0] ; FGVAD <= {POSV[7:3],POSH[7:3]}; end 2: begin OUT <= CDT[15:12]; end 3: begin OUT <= CDT[11:8] ; end @@ -156,28 +158,29 @@ endmodule // BackGround Scanline Generator module NINJAKUN_BG ( - input MCLK, - input PCLK_EN, + input MCLK, + input PCLK_EN, + input RAIDERS5, - input [8:0] PH, // CRTC - input [8:0] PV, + input [8:0] PH, // CRTC + input [8:0] PV, - input [7:0] BGSCX, // SCRREG - input [7:0] BGSCY, + input [7:0] BGSCX, // SCRREG + input [7:0] BGSCY, - output reg [9:0] BGVAD, // VRAM - input [15:0] BGVDT, + output reg [9:0] BGVAD, // VRAM + input [15:0] BGVDT, - output reg [12:0] BGCAD, - input [31:0] BGCDT, - - output [8:0] BGOUT // OUTPUT + output reg [12:0] BGCAD, + input [31:0] BGCDT, + + output [8:0] BGOUT // OUTPUT ); wire [8:0] POSH = PH+BGSCX+9'd2; wire [8:0] POSV = PV+BGSCY+9'd32; -wire [9:0] CHRNO = {BGVDT[15:14],BGVDT[7:0]}; +wire [9:0] CHRNO = RAIDERS5 ? {1'b0, BGVDT[8:0]} : {BGVDT[15:14],BGVDT[7:0]}; reg [31:0] CDT; reg [3:0] PAL; @@ -185,7 +188,7 @@ reg [3:0] OUT; always @( posedge MCLK ) begin if (PCLK_EN) case(POSH[2:0]) - 0: begin OUT <= CDT[7:4] ; PAL <= BGVDT[11:8]; end + 0: begin OUT <= CDT[7:4] ; PAL <= RAIDERS5 ? BGVDT[15:12] : BGVDT[11:8]; end 1: begin OUT <= CDT[3:0] ; BGVAD <= {POSV[7:3],POSH[7:3]}; end 2: begin OUT <= CDT[15:12]; end 3: begin OUT <= CDT[11:8] ; end @@ -199,33 +202,3 @@ end assign BGOUT = { 1'b1, PAL, OUT }; endmodule - - -module DSEL4_9B -( - output [8:0] OUT, - - input EN1, - input [8:0] IN1, - - input EN2, - input [8:0] IN2, - - input EN3, - input [8:0] IN3, - - input EN4, - input [8:0] IN4, - - input [8:0] IND -); - -assign OUT = EN1 ? IN1: - EN2 ? IN2: - EN3 ? IN3: - EN4 ? IN4: - IND; - -endmodule - - From 051f8d196d52fd547f4f6ed589e3e740adf432bb Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sun, 13 Jun 2021 01:53:23 +0200 Subject: [PATCH 3/8] Nova2001: get rid of dataselector.v --- .../NinjaKun_MiST/NinjaKun_MiST.qsf | 4 +- .../NinjaKun_MiST/rtl/dataselector.v | 70 ------------------- .../NinjaKun_MiST/rtl/ninjakun_io_video.v | 21 ++---- .../NinjaKun_MiST/rtl/ninjakun_main.v | 28 +++----- 4 files changed, 17 insertions(+), 106 deletions(-) delete mode 100644 Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/dataselector.v diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/NinjaKun_MiST.qsf b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/NinjaKun_MiST.qsf index bded7b0b..b93f9a52 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/NinjaKun_MiST.qsf +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/NinjaKun_MiST.qsf @@ -40,7 +40,7 @@ # Project-Wide Assignments # ======================== set_global_assignment -name ORIGINAL_QUARTUS_VERSION 16.0.2 -set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name LAST_QUARTUS_VERSION "13.1 SP4.26" set_global_assignment -name PROJECT_CREATION_TIME_DATE "19:48:06 MAY 24,2017" set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files @@ -241,5 +241,5 @@ set_global_assignment -name VHDL_FILE ../../../common/Sound/ym2149/vol_table_arr set_global_assignment -name VHDL_FILE ../../../common/Sound/ym2149/YM2149.vhd 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 VERILOG_FILE rtl/dataselector.v +set_global_assignment -name SMART_RECOMPILE ON set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/dataselector.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/dataselector.v deleted file mode 100644 index fd00932a..00000000 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/dataselector.v +++ /dev/null @@ -1,70 +0,0 @@ -module dataselector_3D_8B -( - output [7:0] out, - input [7:0] df, - - input en0, - input [7:0] dt0, - input en1, - input [7:0] dt1, - input en2, - input [7:0] dt2 -); - -assign out = en0 ? dt0 : - en1 ? dt1 : - en2 ? dt2 : - df; - -endmodule - -module dataselector_5D_8B -( - output [7:0] out, - input en0, - input [7:0] dt0, - input en1, - input [7:0] dt1, - input en2, - input [7:0] dt2, - input en3, - input [7:0] dt3, - input en4, - input [7:0] dt4 -); - -assign out = en0 ? dt0 : - en1 ? dt1 : - en2 ? dt2 : - en3 ? dt3 : - en4 ? dt4 : - 8'hFF; - -endmodule - -module dataselector_4D_9B -( - output [8:0] OUT, - - input EN1, - input [8:0] IN1, - - input EN2, - input [8:0] IN2, - - input EN3, - input [8:0] IN3, - - input EN4, - input [8:0] IN4, - - input [8:0] IND -); - -assign OUT = EN1 ? IN1: - EN2 ? IN2: - EN3 ? IN3: - EN4 ? IN4: - IND; - -endmodule \ No newline at end of file diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v index 8b36b0c9..074a158d 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v @@ -103,19 +103,12 @@ dpram #(8,10) bgv_hi(MCLK, CS_BGV & CPWRT & BGADR[10], BGADR[9:0], CPODT, BGDAT dpram #(8,11) spa (MCLK, CS_SPA & CPWRT, CPADR[10:0], CPODT, SPDAT, ~MCLK, 1'b0, SPAAD, 8'h0, SPADT); dpram #(8,9) pal (MCLK, CS_PAL & CPWRT, CPADR[8:0], CPODT, PLDAT, MCLK, 1'b0, PALET, 8'h0, POUT); -dataselector_5D_8B cpxdsel( - .out(CPIDT), - .en0(CS_PSG), - .dt0(PSDAT), - .en1(CS_FGV), - .dt1(FGDAT), - .en2(CS_BGV), - .dt2(BGDAT), - .en3(CS_SPA), - .dt3(SPDAT), - .en4(CS_PAL), - .dt4(PLDAT) -); +assign CPIDT = CS_PSG ? PSDAT : + CS_FGV ? FGDAT : + CS_BGV ? BGDAT : + CS_SPA ? SPDAT : + CS_PAL ? PLDAT : + 8'hFF; ninjakun_psg psg( .MCLK(MCLK), @@ -137,4 +130,4 @@ ninjakun_psg psg( .SNDO(SNDOUT) ); -endmodule \ No newline at end of file +endmodule diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v index 9b2460c9..8bba4e06 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v @@ -137,26 +137,14 @@ ninjakun_input inps( .INPD1(INPD1) ); -dataselector_3D_8B cdt0( - .out(CP0DT), - .df(CP0ID), - .en0(CS_IN0), - .dt0(INPD0), - .en1(CS_SH0), - .dt1(SHDT0), - .en2(~CP0AD[15]), - .dt2(ROM0D) -); +assign CP0DT = CS_IN0 ? INPD0 : + CS_SH0 ? SHDT0 : + ~CP0AD[15] ? ROM0D : + CP0ID; -dataselector_3D_8B cdt1( - .out(CP1DT), - .df(CP1ID), - .en0(CS_IN1), - .dt0(INPD1), - .en1(CS_SH1), - .dt1(SHDT1), - .en2(~CP1AD[15]), - .dt2(ROM1D) -); +assign CP1DT = CS_IN1 ? INPD1 : + CS_SH1 ? SHDT1 : + ~CP1AD[15] ? ROM1D : + CP1ID; endmodule \ No newline at end of file From dd8ef75e04f868c95d11d7dbe7c40a3783273017 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Tue, 15 Jun 2021 00:11:16 +0200 Subject: [PATCH 4/8] Nova2001: add Nova2001 --- .../NinjaKun_MiST/NinjaKun_MiST.sdc | 2 +- .../NinjaKun_MiST/meta/Nova 2001.mra | 62 +++++++++++++++++++ .../NinjaKun_MiST/rtl/NinjaKun_MiST.sv | 36 +++++++---- .../NinjaKun_MiST/rtl/defs.v | 3 + .../NinjaKun_MiST/rtl/ninjakun_adec.v | 35 +++++++---- .../NinjaKun_MiST/rtl/ninjakun_input.v | 44 ++++++------- .../NinjaKun_MiST/rtl/ninjakun_io_video.v | 20 +++--- .../NinjaKun_MiST/rtl/ninjakun_main.v | 44 +++++++------ .../NinjaKun_MiST/rtl/ninjakun_psg.v | 41 ++++++++---- .../NinjaKun_MiST/rtl/ninjakun_sadec.v | 21 ++++++- .../NinjaKun_MiST/rtl/ninjakun_top.v | 58 +++++++++-------- .../NinjaKun_MiST/rtl/ninjakun_video.v | 32 ++++++---- .../Nova2001_Hardware/NinjaKun_MiST/rtl/pll.v | 52 ++++++++++++---- .../NinjaKun_MiST/rtl/sdram.sv | 13 ++-- 14 files changed, 323 insertions(+), 140 deletions(-) create mode 100644 Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Nova 2001.mra create mode 100644 Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/defs.v diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/NinjaKun_MiST.sdc b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/NinjaKun_MiST.sdc index 80fe5371..33ffd42f 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/NinjaKun_MiST.sdc +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/NinjaKun_MiST.sdc @@ -53,7 +53,7 @@ set_time_format -unit ns -decimal_places 3 create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] -set sys_clk "pll|altpll_component|auto_generated|pll1|clk[0]" +set sys_clk "pll|altpll_component|auto_generated|pll1|clk[1]" set sdram_clk "pll|altpll_component|auto_generated|pll1|clk[0]" #************************************************************** # Create Generated Clock diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Nova 2001.mra b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Nova 2001.mra new file mode 100644 index 00000000..28e66588 --- /dev/null +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Nova 2001.mra @@ -0,0 +1,62 @@ + + Nova 2001 + + no + no + + + + + 1984 + UPL + Taito + Platform - Climb + + nova2001 + ninjakun + 0220 + ninjakun + + 15kHz + horizontal + + + 2 (alternating) + 2-way horizontal + + 2 + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv index 453f5af3..cc17a5c4 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv @@ -27,7 +27,8 @@ module NinjaKun_MiST ( output SDRAM_CKE ); -`include "rtl\build_id.v" +`include "rtl/build_id.v" +`include "rtl/defs.v" localparam CONF_STR = { "NINJAKUN;;", @@ -42,7 +43,7 @@ localparam CONF_STR = { assign LED = ~ioctl_downl; assign AUDIO_R = AUDIO_L; -assign SDRAM_CLK = CLOCK_48; +assign SDRAM_CLK = CLOCK_96; assign SDRAM_CKE = 1; wire rotate = status[2]; @@ -51,23 +52,29 @@ wire blend = status[5]; wire service = status[6]; wire [6:0] core_mod; -wire RAIDERS5 = core_mod == 1; +wire [1:0] hwtype = core_mod[1:0]; -reg [7:0] CTR1, CTR2; +reg [7:0] CTR1, CTR2, CTR3; always @(*) begin CTR1 = ~{2'b11, m_one_player, 1'b0, m_fireA, m_fireB, m_right, m_left }; CTR2 = ~{~(m_coin1 | m_coin2), ~service, m_two_players, 1'b0, m_fire2A, m_fire2B, m_right2, m_left2 }; - if (RAIDERS5) begin + CTR3 = 0; + if (hwtype == `HW_RAIDERS5) begin CTR1 = ~{1'b0, 1'b0, m_one_player, m_fireA, m_up, m_down, m_right, m_left }; CTR2 = ~{(m_coin1 | m_coin2), service, m_two_players, m_fire2A, m_up2, m_down2, m_right2, m_left2}; + end else if (hwtype == `HW_NOVA2001) begin + CTR1 = ~{m_fireA, m_fireB, 2'b00, m_right, m_left, m_down, m_up}; + CTR2 = ~{m_fire2A, m_fire2B, 2'b00, m_right2, m_left2, m_down2, m_up2}; + CTR3 = ~{5'b00000, m_two_players, m_one_player, m_coin1 | m_coin2}; end end -wire CLOCK_48, pll_locked; +wire CLOCK_96, CLOCK_48, pll_locked; pll pll( .inclk0(CLOCK_27), - .c0(CLOCK_48), + .c0(CLOCK_96), + .c1(CLOCK_48), .locked(pll_locked) ); @@ -125,10 +132,10 @@ wire [31:0] fg_rom_do; wire [12:0] bg_rom_addr; wire [31:0] bg_rom_do; -sdram sdram( +sdram #(96) sdram( .*, .init_n ( pll_locked ), - .clk ( CLOCK_48 ), + .clk ( CLOCK_96 ), // port1 used for main + aux CPU .port1_req ( port1_req ), @@ -191,11 +198,12 @@ wire [11:0] POUT; ninjakun_top ninjakun_top( .RESET(reset), .MCLK(CLOCK_48), - .RAIDERS5(RAIDERS5), + .HWTYPE(hwtype), .CTR1(CTR1), .CTR2(CTR2), + .CTR3(CTR3), .DSW1(status[15:8]), - .DSW2(status[23:16]), + .DSW2({(hwtype == `HW_NOVA2001 ? ~service : status[23]), status[22:16]}), .PH(HPOS), .PV(VPOS), .PCLK_EN(PCLK_EN), @@ -211,7 +219,11 @@ ninjakun_top ninjakun_top( .fg_rom_addr(fg_rom_addr), .fg_rom_data(fg_rom_do), .bg_rom_addr(bg_rom_addr), - .bg_rom_data(bg_rom_do) + .bg_rom_data(bg_rom_do), + .PALADR(ioctl_addr[4:0]), + .PALWR(ioctl_addr[23:5] == {16'h0180, 3'b000} && ioctl_wr), + .PALDAT(ioctl_dout) + ); wire [7:0] oPIX; diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/defs.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/defs.v new file mode 100644 index 00000000..8b7912bb --- /dev/null +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/defs.v @@ -0,0 +1,3 @@ +`define HW_NINJAKUN 2'd0 +`define HW_RAIDERS5 2'd1 +`define HW_NOVA2001 2'd2 diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_adec.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_adec.v index c017d17a..42a9455c 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_adec.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_adec.v @@ -1,22 +1,24 @@ module ninjakun_adec ( - input RAIDERS5, - input [15:0] CP0AD, - input CP0WR, + input [1:0] HWTYPE, + input [15:0] CP0AD, + input CP0WR, - input [15:0] CP1AD, - input CP1WR, + input [15:0] CP1AD, + input CP1WR, - output CS_IN0, - output CS_IN1, + output CS_IN0, + output CS_IN1, - output CS_SH0, - output CS_SH1, + output CS_SH0, + output CS_SH1, - output SYNWR0, - output SYNWR1 + output SYNWR0, + output SYNWR1 ); +`include "rtl/defs.v" + always @(*) begin CS_IN0 = (CP0AD[15:2] == 14'b1010_0000_0000_00); CS_IN1 = (CP1AD[15:2] == 14'b1010_0000_0000_00); @@ -27,13 +29,22 @@ always @(*) begin SYNWR0 = CS_IN0 & (CP0AD[1:0]==2) & CP0WR; SYNWR1 = CS_IN1 & (CP1AD[1:0]==2) & CP1WR; - if (RAIDERS5) begin + if (HWTYPE == `HW_RAIDERS5) begin CS_IN0 = 0; CS_IN1 = 0; CS_SH0 = (CP0AD[15:11] == 5'b1110_0); CS_SH1 = (CP1AD[15:11] == 5'b1010_0); + SYNWR0 = 0; + SYNWR1 = 0; + end else if (HWTYPE == `HW_NOVA2001) begin + CS_IN0 = (CP0AD[15:4] == 12'hC00 && (CP0AD[3:1] == 3'b011 || CP0AD[3:1] == 3'b111)); + CS_IN1 = 0; + + CS_SH0 = (CP0AD[15:11] == 5'b1110_0); + CS_SH1 = 0; + SYNWR0 = 0; SYNWR1 = 0; end diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_input.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_input.v index 5bd6fa87..b9f9de79 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_input.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_input.v @@ -2,28 +2,29 @@ module ninjakun_input ( - input MCLK, - input RESET, + input MCLK, + input RESET, + input [1:0] HWTYPE, - input [7:0] CTR1i, // Control Panel (Negative Logic) - input [7:0] CTR2i, + input [7:0] CTR1i, // Control Panel (Negative Logic) + input [7:0] CTR2i, + input [7:0] CTR3i, + input VBLK, - input VBLK, + input [1:0] AD0, + input [1:0] OD0, + input WR0, - input [1:0] AD0, - input [1:0] OD0, - input WR0, + input [1:0] AD1, + input [1:0] OD1, + input WR1, - input [1:0] AD1, - input [1:0] OD1, - input WR1, - - output [7:0] INPD0, - output [7:0] INPD1 + output [7:0] INPD0, + output [7:0] INPD1 ); reg [1:0] SYNCFLG; -reg [7:0] CTR1,CTR2; +reg [7:0] CTR1,CTR2,CTR3; always @( posedge MCLK or posedge RESET ) begin if (RESET) begin SYNCFLG = 0; @@ -31,6 +32,7 @@ always @( posedge MCLK or posedge RESET ) begin else begin CTR1 <= CTR1i; CTR2 <= CTR2i; + CTR3 <= CTR3i; if (WR0) begin if (OD0[1]) SYNCFLG[0] = 1; if (OD0[0]) SYNCFLG[1] = 0; @@ -44,14 +46,14 @@ end wire [7:0] INPORT0 = CTR1; wire [7:0] INPORT1 = CTR2; -wire [7:0] INPORT2 = { 4'b0000, SYNCFLG, ~VBLK,1'b0 }; +wire [7:0] INPORT2 = HWTYPE[1] ? {~VBLK, CTR3[6:0]} : { 4'b0000, SYNCFLG, ~VBLK,1'b0 }; assign INPD0 = ( AD0 == 0 ) ? INPORT0 : - ( AD0 == 1 ) ? INPORT1 : - ( AD0 == 2 ) ? INPORT2 : 8'hFF; + ( AD0 == 1 ) ? INPORT1 : + ( AD0 == 2 ) ? INPORT2 : 8'hFF; assign INPD1 = ( AD1 == 0 ) ? INPORT0 : - ( AD1 == 1 ) ? INPORT1 : - ( AD1 == 2 ) ? INPORT2 : 8'hFF; + ( AD1 == 1 ) ? INPORT1 : + ( AD1 == 2 ) ? INPORT2 : 8'hFF; -endmodule \ No newline at end of file +endmodule diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v index 074a158d..6ac4e152 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v @@ -3,7 +3,7 @@ module ninjakun_io_video ( input MCLK, - input RAIDERS5, + input [1:0] HWTYPE, input PCLK_EN, input RESET, input [8:0] PH, @@ -27,15 +27,21 @@ module ninjakun_io_video output [12:0] fg_rom_addr, input [31:0] fg_rom_data, output [12:0] bg_rom_addr, - input [31:0] bg_rom_data + input [31:0] bg_rom_data, + input [4:0] PALADR, + input PALWR, + input [7:0] PALDAT ); +`include "rtl/defs.v" + wire [9:0] FGVAD; wire [15:0] FGVDT; wire [9:0] BGVAD; wire [15:0] BGVDT; wire [10:0] SPAAD; wire [7:0] SPADT; +wire RAIDERS5 = HWTYPE == `HW_RAIDERS5; wire [7:0] SCRPX = RAIDERS5 ? SCRPX_CPU : SCRPX_PSG, SCRPY = RAIDERS5 ? SCRPY_CPU : SCRPY_PSG; wire [7:0] SCRPX_PSG, SCRPY_PSG; reg [7:0] SCRPX_CPU, SCRPY_CPU; @@ -45,7 +51,7 @@ NINJAKUN_VIDEO video ( .RESET(RESET), .MCLK(MCLK), .PCLK_EN(PCLK_EN), - .RAIDERS5(RAIDERS5), + .HWTYPE(HWTYPE), .PH(PH), .PV(PV), .PALAD(PALET), // Pixel Output (Palet Index) @@ -70,7 +76,7 @@ NINJAKUN_VIDEO video ( wire CS_SCRX, CS_SCRY, CS_PSG, CS_FGV, CS_BGV, CS_SPA, CS_PAL; ninjakun_sadec sadec( - .RAIDERS5(RAIDERS5), + .HWTYPE(HWTYPE), .CPADR(CPADR), .CPSEL(CPSEL), .CS_SCRX(CS_SCRX), @@ -94,14 +100,14 @@ end wire [7:0] PSDAT, FGDAT = CPADR[10] ? FGDAT16[15:8] : FGDAT16[7:0], BGDAT = CPADR[10] ? BGDAT16[15:8] : BGDAT16[7:0], SPDAT, PLDAT; wire [15:0] FGDAT16, BGDAT16; wire [9:0] BGOFS = CPADR[9:0]+{SCRPY[7:3],SCRPX[7:3]}; -wire [10:0] BGADR = {CPADR[10],BGOFS}; +wire [10:0] BGADR = HWTYPE[1] ? CPADR : {CPADR[10],BGOFS}; dpram #(8,10) fgv_lo(MCLK, CS_FGV & CPWRT & ~CPADR[10], CPADR[9:0], CPODT, FGDAT16[ 7:0], MCLK, 1'b0, FGVAD, 8'd0, FGVDT[ 7:0]); dpram #(8,10) fgv_hi(MCLK, CS_FGV & CPWRT & CPADR[10], CPADR[9:0], CPODT, FGDAT16[15:8], MCLK, 1'b0, FGVAD, 8'd0, FGVDT[15:8]); dpram #(8,10) bgv_lo(MCLK, CS_BGV & CPWRT & ~BGADR[10], BGADR[9:0], CPODT, BGDAT16[ 7:0], MCLK, 1'b0, BGVAD, 8'd0, BGVDT[ 7:0]); dpram #(8,10) bgv_hi(MCLK, CS_BGV & CPWRT & BGADR[10], BGADR[9:0], CPODT, BGDAT16[15:8], MCLK, 1'b0, BGVAD, 8'd0, BGVDT[15:8]); dpram #(8,11) spa (MCLK, CS_SPA & CPWRT, CPADR[10:0], CPODT, SPDAT, ~MCLK, 1'b0, SPAAD, 8'h0, SPADT); -dpram #(8,9) pal (MCLK, CS_PAL & CPWRT, CPADR[8:0], CPODT, PLDAT, MCLK, 1'b0, PALET, 8'h0, POUT); +dpram #(8,9) pal (MCLK, CS_PAL & CPWRT, CPADR[8:0], CPODT, PLDAT, MCLK, PALWR, PALWR ? PALADR : PALET, PALDAT, POUT); assign CPIDT = CS_PSG ? PSDAT : CS_FGV ? FGDAT : @@ -112,7 +118,7 @@ assign CPIDT = CS_PSG ? PSDAT : ninjakun_psg psg( .MCLK(MCLK), - .RAIDERS5(RAIDERS5), + .HWTYPE(HWTYPE), .ADR(CPADR[1:0]), .CS(CS_PSG), .WR(CPWRT), diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v index 8bba4e06..9cc0f50a 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v @@ -1,25 +1,27 @@ module ninjakun_main( - input RESET, - input MCLK, - input RAIDERS5, - input VBLK, + input RESET, + input MCLK, + input [1:0] HWTYPE, + input VBLK, - input [7:0] CTR1, - input [7:0] CTR2, + input [7:0] CTR1, + input [7:0] CTR2, + input [7:0] CTR3, - output [15:0] CPADR, - output [7:0] CPODT, - input [7:0] CPIDT, - output CPRED, - output CPWRT, - output CPSEL, + output [15:0] CPADR, + output [7:0] CPODT, + input [7:0] CPIDT, + output CPRED, + output CPWRT, + output CPSEL, - output [14:0] CPU1ADDR, - input [7:0] CPU1DT, - output [14:0] CPU2ADDR, - input [7:0] CPU2DT + output [14:0] CPU1ADDR, + input [7:0] CPU1DT, + output [14:0] CPU2ADDR, + input [7:0] CPU2DT ); +`include "rtl/defs.v" wire CP0IQ, CP0IQA; wire CP1IQ, CP1IQA; @@ -54,7 +56,7 @@ Z80IP cpu0( ); Z80IP cpu1( - .reset_in(RESET), + .reset_in(RESET | HWTYPE[1]), .clk(MCLK), .clken_p(CP1CE_P), .clken_n(CP1CE_N), @@ -94,7 +96,7 @@ ninjakun_cpumux ioshare( wire CS_SH0, CS_SH1, CS_IN0, CS_IN1; wire SYNWR0, SYNWR1; ninjakun_adec adec( - .RAIDERS5(RAIDERS5), + .HWTYPE(HWTYPE), .CP0AD(CP0AD), .CP0WR(CP0WR), .CP1AD(CP1AD), @@ -115,6 +117,7 @@ assign CPU2ADDR = CP1AD[14:0]; assign ROM1D = CPU2DT; wire [7:0] SHDT0, SHDT1; +wire RAIDERS5 = HWTYPE == `HW_RAIDERS5; dpram #(8,11) shmem( MCLK, CS_SH0 & CP0WR, { CP0AD[10] ,CP0AD[9:0]}, CP0OD, SHDT0, @@ -124,10 +127,13 @@ wire [7:0] INPD0, INPD1; ninjakun_input inps( .MCLK(MCLK), .RESET(RESET), + .HWTYPE(HWTYPE), .CTR1i(CTR1), // Control Panel (Negative Logic) .CTR2i(CTR2), + .CTR3i(CTR3), .VBLK(VBLK), - .AD0(CP0AD[1:0]), +// .AD0(CP0AD[1:0]), + .AD0({HWTYPE[1] ? CP0AD[3] : CP0AD[1], CP0AD[0]}), .OD0(CP0OD[7:6]), .WR0(SYNWR0), .AD1(CP1AD[1:0]), diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_psg.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_psg.v index f0992b2f..911f2917 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_psg.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_psg.v @@ -1,7 +1,7 @@ module ninjakun_psg ( input MCLK, - input RAIDERS5, + input [1:0] HWTYPE, input [1:0] ADR, input CS, input WR, @@ -19,17 +19,27 @@ module ninjakun_psg output [15:0] SNDO ); +`include "rtl/defs.v" + wire [7:0] OD0, OD1; -assign OD = ADR[1] ? OD1 : OD0; +assign OD = psg1cs ? OD1 : OD0; reg [7:0] SA0, SB0, SC0; wire [7:0] S0x; wire [1:0] S0c; reg [7:0] SA1, SB1, SC1; wire [7:0] S1x; wire [1:0] S1c; -reg [2:0] encnt; +reg [3:0] encnt; reg ENA; always @(posedge MCLK) begin ENA <= (encnt==0); encnt <= encnt+1'd1; + case (HWTYPE) + `HW_NINJAKUN, `HW_RAIDERS5: + if (encnt == 7) encnt <= 0; // 6 MHz + `HW_NOVA2001: + if (encnt == 11) encnt <= 0; // 4 MHz + default: ; + endcase + case (S0c) 2'd0: SA0 <= S0x; 2'd1: SB0 <= S0x; @@ -44,15 +54,20 @@ always @(posedge MCLK) begin endcase end -wire psgxad = ~ADR[0]; -wire psg0cs = CS & (~ADR[1]); +wire psgxad = HWTYPE == `HW_NOVA2001 ? ADR[1] : ~ADR[0]; +wire psg0cs = CS & (HWTYPE == `HW_NOVA2001 ? ~ADR[0] : ~ADR[1]); wire psg0bd = psg0cs & (WR|psgxad); wire psg0bc = psg0cs & ((~WR)|psgxad); -wire psg1cs = CS & ADR[1]; +wire psg1cs = CS & (HWTYPE == `HW_NOVA2001 ? ADR[0] : ADR[1]); wire psg1bd = psg1cs & (WR|psgxad); wire psg1bc = psg1cs & ((~WR)|psgxad); +wire [7:0] IOA_PSG0, IOB_PSG0; +wire [7:0] IOA_PSG1, IOB_PSG1; +assign SCRPX = HWTYPE == `HW_NOVA2001 ? IOA_PSG0 : IOA_PSG1; +assign SCRPY = HWTYPE == `HW_NOVA2001 ? IOB_PSG0 : IOB_PSG1; + YM2149 psg0( .I_DA(ID), .O_DA(OD0), @@ -64,8 +79,10 @@ YM2149 psg0( .I_SEL_L(1'b0), .O_AUDIO(S0x), .O_CHAN(S0c), - .I_IOA(RAIDERS5 ? {~VBLK, CTR1[6:0]} : DSW1), - .I_IOB(RAIDERS5 ? CTR2 : DSW2), + .I_IOA(HWTYPE == `HW_RAIDERS5 ? {~VBLK, CTR1[6:0]} : DSW1), + .I_IOB(HWTYPE == `HW_RAIDERS5 ? CTR2 : DSW2), + .O_IOA(IOA_PSG0), + .O_IOB(IOB_PSG0), .ENA(ENA), .RESET_L(~RESET), .CLK(MCLK) @@ -82,10 +99,10 @@ YM2149 psg1( .I_SEL_L(1'b0), .O_AUDIO(S1x), .O_CHAN(S1c), - .I_IOA(RAIDERS5 ? DSW1 : 8'd0), - .I_IOB(RAIDERS5 ? DSW2 : 8'd0), - .O_IOA(SCRPX), - .O_IOB(SCRPY), + .I_IOA(HWTYPE == `HW_NINJAKUN ? 8'd0 : DSW1), + .I_IOB(HWTYPE == `HW_NINJAKUN ? 8'd0 : DSW2), + .O_IOA(IOA_PSG1), + .O_IOB(IOB_PSG1), .ENA(ENA), .RESET_L(~RESET), .CLK(MCLK) diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sadec.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sadec.v index 91080b45..329e1084 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sadec.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sadec.v @@ -2,7 +2,7 @@ module ninjakun_sadec ( - input RAIDERS5, + input [1:0] HWTYPE, input [15:0] CPADR, input CPSEL, output CS_SCRX, @@ -14,6 +14,8 @@ module ninjakun_sadec output CS_PAL ); +`include "rtl/defs.v" + always @(*) begin CS_PSG = ( CPADR[15: 2] == 14'b1000_0000_0000_00 ); CS_FGV = ( CPADR[15:11] == 5'b1100_0 ); @@ -23,7 +25,7 @@ always @(*) begin CS_SCRX = 0; CS_SCRY = 0; - if (RAIDERS5) begin + if (HWTYPE == `HW_RAIDERS5) begin if (CPSEL) begin CS_SCRX = ( CPADR == 16'he000 ); CS_SCRY = ( CPADR == 16'he001 ); @@ -41,6 +43,21 @@ always @(*) begin CS_SPA = ( CPADR[15:11] == 5'b1000_0 ); CS_PAL = ( CPADR[15:11] == 5'b1101_0 ); end + end else if (HWTYPE == `HW_NOVA2001) begin + CS_SCRX = 0; + CS_SCRY = 0; + CS_PAL = 0; + if (CPSEL) begin + CS_PSG = 0; + CS_FGV = 0; + CS_BGV = 0; + CS_SPA = 0; + end else begin + CS_PSG = ( CPADR[15: 2] == 14'b1100_0000_0000_00 ); + CS_FGV = ( CPADR[15:11] == 5'b1010_0 ); + CS_BGV = ( CPADR[15:11] == 5'b1010_1 ); + CS_SPA = ( CPADR[15:11] == 5'b1011_0 ); + end end end diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_top.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_top.v index b530b3e5..2155ead8 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_top.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_top.v @@ -9,29 +9,33 @@ module ninjakun_top ( - input RESET, // RESET - input MCLK, // Master Clock (48.0MHz) - input RAIDERS5, - input [7:0] CTR1, // Control Panel - input [7:0] CTR2, - input [7:0] DSW1, // DipSW - input [7:0] DSW2, - input [8:0] PH, // PIXEL H - input [8:0] PV, // PIXEL V - output PCLK_EN, // PIXEL CLOCK ENABLE - output [7:0] POUT, // PIXEL OUT - output [15:0] SNDOUT, // Sound Output (LPCM unsigned 16bits) - output [14:0] CPU1ADDR, - input [7:0] CPU1DT, - output [14:0] CPU2ADDR, - input [7:0] CPU2DT, - output [12:0] sp_rom_addr, - input [31:0] sp_rom_data, + input RESET, // RESET + input MCLK, // Master Clock (48.0MHz) + input [1:0] HWTYPE, + input [7:0] CTR1, // Control Panel + input [7:0] CTR2, + input [7:0] CTR3, + input [7:0] DSW1, // DipSW + input [7:0] DSW2, + input [8:0] PH, // PIXEL H + input [8:0] PV, // PIXEL V + output PCLK_EN, // PIXEL CLOCK ENABLE + output [7:0] POUT, // PIXEL OUT + output [15:0] SNDOUT, // Sound Output (LPCM unsigned 16bits) + output [14:0] CPU1ADDR, + input [7:0] CPU1DT, + output [14:0] CPU2ADDR, + input [7:0] CPU2DT, + output [12:0] sp_rom_addr, + input [31:0] sp_rom_data, input sp_rdy, - output [12:0] fg_rom_addr, - input [31:0] fg_rom_data, - output [12:0] bg_rom_addr, - input [31:0] bg_rom_data + output [12:0] fg_rom_addr, + input [31:0] fg_rom_data, + output [12:0] bg_rom_addr, + input [31:0] bg_rom_data, + input [4:0] PALADR, + input PALWR, + input [7:0] PALDAT ); reg [3:0] CLKDIV; @@ -47,10 +51,11 @@ wire CPRED, CPWRT, VBLK; ninjakun_main ninjakun_main( .RESET(RESET), .MCLK(MCLK), - .RAIDERS5(RAIDERS5), + .HWTYPE(HWTYPE), .VBLK(VBLK), .CTR1(CTR1), .CTR2(CTR2), + .CTR3(CTR3), .CPADR(CPADR), .CPODT(CPODT), .CPIDT(CPIDT), @@ -72,7 +77,7 @@ wire [8:0] PALET; wire [7:0] SCRPX, SCRPY; ninjakun_io_video ninjakun_io_video( .MCLK(MCLK), - .RAIDERS5(RAIDERS5), + .HWTYPE(HWTYPE), .PCLK_EN(PCLK_EN), .RESET(RESET), .PH(PH), @@ -96,7 +101,10 @@ ninjakun_io_video ninjakun_io_video( .fg_rom_addr(fg_rom_addr), .fg_rom_data(fg_rom_data), .bg_rom_addr(bg_rom_addr), - .bg_rom_data(bg_rom_data) + .bg_rom_data(bg_rom_data), + .PALADR(PALADR), + .PALWR(PALWR), + .PALDAT(PALDAT) ); endmodule \ No newline at end of file diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_video.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_video.v index a73eeed4..f57075e5 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_video.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_video.v @@ -5,8 +5,8 @@ module NINJAKUN_VIDEO input RESET, input MCLK, input PCLK_EN, - input RAIDERS5, - + input [1:0] HWTYPE, + input [8:0] PH, input [8:0] PV, @@ -35,6 +35,10 @@ module NINJAKUN_VIDEO input [31:0] bg_rom_data ); +`include "rtl/defs.v" + +wire RAIDERS5 = HWTYPE == `HW_RAIDERS5; + assign VBLK = (PV>=193); // ROMs @@ -64,7 +68,7 @@ assign BGCDT = bg_rom_data; wire FGPRI; wire [8:0] FGOUT; NINJAKUN_FG fg( - MCLK, PCLK_EN, RAIDERS5, + MCLK, PCLK_EN, HWTYPE, PH, PV, FGVAD, FGVDT, FGCAD, FGCDT, @@ -77,7 +81,7 @@ wire FGPPQ = FGOPQ & (~FGPRI); wire [8:0] BGOUT; NINJAKUN_BG bg( - MCLK, PCLK_EN, RAIDERS5, + MCLK, PCLK_EN, HWTYPE, PH, PV, BGSCX, BGSCY, BGVAD, BGVDT, @@ -114,7 +118,7 @@ module NINJAKUN_FG ( input MCLK, input PCLK_EN, - input RAIDERS5, + input [1:0] HWTYPE, input [8:0] PH, // CRTC input [8:0] PV, @@ -131,7 +135,7 @@ module NINJAKUN_FG wire [8:0] POSH = PH+9'd8+9'd1; wire [8:0] POSV = PV+9'd32; -wire [9:0] CHRNO = RAIDERS5 ? {2'b00, FGVDT[7:0]} : {1'b0,FGVDT[13],FGVDT[7:0]}; +wire [9:0] CHRNO = (HWTYPE == `HW_RAIDERS5 || HWTYPE == `HW_NOVA2001) ? {2'b00, FGVDT[7:0]} : {1'b0,FGVDT[13],FGVDT[7:0]}; reg [31:0] CDT; reg [4:0] PAL; @@ -139,7 +143,7 @@ reg [3:0] OUT; always @( posedge MCLK ) begin if (PCLK_EN) case(POSH[2:0]) - 0: begin OUT <= CDT[7:4] ; PAL <= RAIDERS5 ? {1'b0, FGVDT[15:12]} : FGVDT[12:8]; end + 0: begin OUT <= CDT[7:4] ; PAL <= HWTYPE == `HW_RAIDERS5 ? {1'b0, FGVDT[15:12]} : FGVDT[12:8]; end 1: begin OUT <= CDT[3:0] ; FGVAD <= {POSV[7:3],POSH[7:3]}; end 2: begin OUT <= CDT[15:12]; end 3: begin OUT <= CDT[11:8] ; end @@ -150,7 +154,7 @@ always @( posedge MCLK ) begin endcase end -assign FGOUT = { PAL[4], 1'b0, PAL[3:0], OUT }; +assign FGOUT = HWTYPE == `HW_NOVA2001 ? (OUT == 4'h1 ? PAL : { PAL[4], OUT }) : { PAL[4], 1'b0, PAL[3:0], OUT }; endmodule @@ -160,7 +164,7 @@ module NINJAKUN_BG ( input MCLK, input PCLK_EN, - input RAIDERS5, + input [1:0] HWTYPE, input [8:0] PH, // CRTC input [8:0] PV, @@ -177,10 +181,12 @@ module NINJAKUN_BG output [8:0] BGOUT // OUTPUT ); -wire [8:0] POSH = PH+BGSCX+9'd2; +wire [8:0] POSH = PH+BGSCX+(HWTYPE == `HW_NOVA2001 ? 9'd9 : 9'd2) /* synthesis keep */; wire [8:0] POSV = PV+BGSCY+9'd32; -wire [9:0] CHRNO = RAIDERS5 ? {1'b0, BGVDT[8:0]} : {BGVDT[15:14],BGVDT[7:0]}; +wire [9:0] CHRNO = HWTYPE == `HW_RAIDERS5 ? {1'b0, BGVDT[8:0]} : + HWTYPE == `HW_NOVA2001 ? {2'b10, BGVDT[7:0]}: + {BGVDT[15:14],BGVDT[7:0]}; reg [31:0] CDT; reg [3:0] PAL; @@ -188,7 +194,7 @@ reg [3:0] OUT; always @( posedge MCLK ) begin if (PCLK_EN) case(POSH[2:0]) - 0: begin OUT <= CDT[7:4] ; PAL <= RAIDERS5 ? BGVDT[15:12] : BGVDT[11:8]; end + 0: begin OUT <= CDT[7:4] ; PAL <= HWTYPE == `HW_RAIDERS5 ? BGVDT[15:12] : BGVDT[11:8]; end 1: begin OUT <= CDT[3:0] ; BGVAD <= {POSV[7:3],POSH[7:3]}; end 2: begin OUT <= CDT[15:12]; end 3: begin OUT <= CDT[11:8] ; end @@ -199,6 +205,6 @@ always @( posedge MCLK ) begin endcase end -assign BGOUT = { 1'b1, PAL, OUT }; +assign BGOUT = HWTYPE == `HW_NOVA2001 ? {1'b1, (OUT == 4'h1 ? PAL : OUT)} : { 1'b1, PAL, OUT }; endmodule diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/pll.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/pll.v index 2ce015c4..fb6269e6 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/pll.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/pll.v @@ -39,23 +39,27 @@ module pll ( inclk0, c0, + c1, locked); input inclk0; output c0; + output c1; output locked; wire [4:0] sub_wire0; wire sub_wire2; - wire [0:0] sub_wire5 = 1'h0; - wire [0:0] sub_wire1 = sub_wire0[0:0]; - wire c0 = sub_wire1; + wire [0:0] sub_wire6 = 1'h0; + wire [0:0] sub_wire3 = sub_wire0[0:0]; + wire [1:1] sub_wire1 = sub_wire0[1:1]; + wire c1 = sub_wire1; wire locked = sub_wire2; - wire sub_wire3 = inclk0; - wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + wire c0 = sub_wire3; + wire sub_wire4 = inclk0; + wire [1:0] sub_wire5 = {sub_wire6, sub_wire4}; altpll altpll_component ( - .inclk (sub_wire4), + .inclk (sub_wire5), .clk (sub_wire0), .locked (sub_wire2), .activeclock (), @@ -96,8 +100,12 @@ module pll ( altpll_component.bandwidth_type = "AUTO", altpll_component.clk0_divide_by = 9, altpll_component.clk0_duty_cycle = 50, - altpll_component.clk0_multiply_by = 16, + altpll_component.clk0_multiply_by = 32, altpll_component.clk0_phase_shift = "0", + altpll_component.clk1_divide_by = 9, + altpll_component.clk1_duty_cycle = 50, + altpll_component.clk1_multiply_by = 16, + altpll_component.clk1_phase_shift = "0", altpll_component.compensate_clock = "CLK0", altpll_component.inclk0_input_frequency = 37037, altpll_component.intended_device_family = "Cyclone III", @@ -131,7 +139,7 @@ module pll ( altpll_component.port_scanread = "PORT_UNUSED", altpll_component.port_scanwrite = "PORT_UNUSED", altpll_component.port_clk0 = "PORT_USED", - altpll_component.port_clk1 = "PORT_UNUSED", + altpll_component.port_clk1 = "PORT_USED", altpll_component.port_clk2 = "PORT_UNUSED", altpll_component.port_clk3 = "PORT_UNUSED", altpll_component.port_clk4 = "PORT_UNUSED", @@ -172,8 +180,11 @@ endmodule // Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" // Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" // Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "9" +// Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "1" // Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" -// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "48.000000" +// Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "96.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "48.000000" // Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" // Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" // Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" @@ -194,18 +205,26 @@ endmodule // Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" // Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" // Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "ps" // Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" // Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" // Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "16" +// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "1" // Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" -// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "48.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "96.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "48.00000000" // Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1" // Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" // Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" // Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" // Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" // Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" // Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "ps" // Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" // Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" // Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" @@ -228,19 +247,26 @@ endmodule // Retrieval info: PRIVATE: SPREAD_USE STRING "0" // Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" // Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +// Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" // Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" // Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" // Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" // Retrieval info: PRIVATE: USE_CLK0 STRING "1" +// Retrieval info: PRIVATE: USE_CLK1 STRING "1" // Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +// Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" // Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" // Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" // Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all // Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" // Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "9" // Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" -// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "16" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "32" // Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9" +// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "16" +// Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" // Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" // Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" // Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" @@ -273,7 +299,7 @@ endmodule // Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" // Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" // Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" -// Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" // Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" // Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" // Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" @@ -292,11 +318,13 @@ endmodule // Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" // Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" // Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" // Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" // Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" // Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 // Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 // Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +// Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 // Retrieval info: CONNECT: locked 0 0 0 0 @locked 0 0 0 0 // Retrieval info: GEN_FILE: TYPE_NORMAL pll.v TRUE // Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/sdram.sv b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/sdram.sv index ed64b325..60ad31c7 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/sdram.sv +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/sdram.sv @@ -65,9 +65,11 @@ module sdram ( output reg [31:0] fg_q, input [16:2] sp_addr, output reg [31:0] sp_q, - output reg sp_rdy + output sp_rdy ); +parameter MHZ = 80; // 80 MHz default clock, adjust to calculate the refresh rate correctly + localparam RASCAS_DELAY = 3'd2; // tRCD=20ns -> 2 cycles@<100MHz localparam BURST_LENGTH = 3'b001; // 000=1, 001=2, 010=4, 011=8 localparam ACCESS_TYPE = 1'b0; // 0=sequential, 1=interleaved @@ -78,7 +80,7 @@ localparam NO_WRITE_BURST = 1'b1; // 0= write burst enabled, 1=only single acc localparam MODE = { 3'b000, NO_WRITE_BURST, OP_MODE, CAS_LATENCY, ACCESS_TYPE, BURST_LENGTH}; // 64ms/8192 rows = 7.8us -> 842 cycles@108MHz -localparam RFRSH_CYCLES = 10'd842; +localparam RFRSH_CYCLES = 16'd78*MHZ/10; // --------------------------------------------------------------------- // ------------------------ cycle state machine ------------------------ @@ -222,6 +224,9 @@ always @(*) begin end end +assign sp_rdy = |sp_rdy_r; +reg [1:0] sp_rdy_r; + always @(posedge clk) begin // permanently latch ram data to reduce delays @@ -231,7 +236,7 @@ always @(posedge clk) begin sd_cmd <= CMD_NOP; // default: idle refresh_cnt <= refresh_cnt + 1'd1; - sp_rdy <= 0; + sp_rdy_r <= {sp_rdy_r[0], 1'b0}; if(init) begin // initialization takes place at the end of the reset phase @@ -357,7 +362,7 @@ always @(posedge clk) begin PORT_REQ: begin port2_q[31:16] <= sd_din; port2_ack <= port2_req; end PORT_FG : begin fg_q[31:16] <= sd_din; end PORT_BG : begin bg_q[31:16] <= sd_din; end - PORT_SP : begin sp_q[31:16] <= sd_din; sp_rdy <= 1; end + PORT_SP : begin sp_q[31:16] <= sd_din; sp_rdy_r <= 2'b11; end default: ; endcase; end From e4d7aabcd9107b71030e65b74ee2f7cf51828afb Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Tue, 15 Jun 2021 14:13:33 +0200 Subject: [PATCH 5/8] Nova2001: add Penguin-Kun Wars --- .../meta/Penguin-Kun Wars (US).mra | 53 +++++++++++++++++++ .../NinjaKun_MiST/rtl/NinjaKun_MiST.sv | 17 +++--- .../NinjaKun_MiST/rtl/defs.v | 1 + .../NinjaKun_MiST/rtl/ninjakun_adec.v | 9 ++++ .../NinjaKun_MiST/rtl/ninjakun_io_video.v | 6 +-- .../NinjaKun_MiST/rtl/ninjakun_main.v | 5 +- .../NinjaKun_MiST/rtl/ninjakun_psg.v | 8 +-- .../NinjaKun_MiST/rtl/ninjakun_sadec.v | 16 +++++- .../NinjaKun_MiST/rtl/ninjakun_sprite.v | 8 +-- .../NinjaKun_MiST/rtl/ninjakun_top.v | 6 +-- .../NinjaKun_MiST/rtl/ninjakun_video.v | 44 ++++++++------- 11 files changed, 131 insertions(+), 42 deletions(-) create mode 100644 Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Penguin-Kun Wars (US).mra diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Penguin-Kun Wars (US).mra b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Penguin-Kun Wars (US).mra new file mode 100644 index 00000000..fff31bbb --- /dev/null +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Penguin-Kun Wars (US).mra @@ -0,0 +1,53 @@ + + Penguin-Kun Wars (US) + + no + no + + + + + 1984 + UPL + Taito + Ping-Pong + + pkunwar + ninjakun + 0220 + ninjakun + + 15kHz + horizontal + + + 2 (alternating) + 2-way horizontal + + 2 + + + + + + + + + + + 3 + + + + + + + + + + + + AA + + + \ No newline at end of file diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv index cc17a5c4..ad899248 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv @@ -67,6 +67,9 @@ always @(*) begin CTR1 = ~{m_fireA, m_fireB, 2'b00, m_right, m_left, m_down, m_up}; CTR2 = ~{m_fire2A, m_fire2B, 2'b00, m_right2, m_left2, m_down2, m_up2}; CTR3 = ~{5'b00000, m_two_players, m_one_player, m_coin1 | m_coin2}; + end else if (hwtype == `HW_PKUNWAR) begin + CTR1 = ~{2'b00, m_one_player, 2'b00, m_fireA, m_right, m_left }; + CTR2 = ~{(m_coin1 | m_coin2), service, m_two_players, 2'b00, m_fire2A, m_right2, m_left2 }; end end @@ -122,14 +125,14 @@ data_io data_io( wire [24:0] cpu_ioctl_addr = ioctl_addr - 17'h10000; reg port1_req, port2_req; -wire [14:0] cpu1_rom_addr, cpu2_rom_addr; +wire [15:0] cpu1_rom_addr, cpu2_rom_addr; wire [15:0] cpu1_rom_do, cpu2_rom_do; -wire [12:0] sp_rom_addr; +wire [13:0] sp_rom_addr; wire [31:0] sp_rom_do; wire sp_rdy; wire [12:0] fg_rom_addr; wire [31:0] fg_rom_do; -wire [12:0] bg_rom_addr; +wire [13:0] bg_rom_addr; wire [31:0] bg_rom_do; sdram #(96) sdram( @@ -146,9 +149,9 @@ sdram #(96) sdram( .port1_d ( {ioctl_dout, ioctl_dout} ), .port1_q ( ), - .cpu1_addr ( ioctl_downl ? 16'hffff : {1'b0, cpu1_rom_addr[14:1]} ), + .cpu1_addr ( ioctl_downl ? 16'hffff : {1'b0, cpu1_rom_addr[15:1]} ), .cpu1_q ( cpu1_rom_do ), - .cpu2_addr ( ioctl_downl ? 16'hffff : {1'b1, cpu2_rom_addr[14:1]} ), + .cpu2_addr ( ioctl_downl ? 16'hffff : {2'b01, cpu2_rom_addr[14:1]} ), .cpu2_q ( cpu2_rom_do ), // port2 for graphics @@ -162,10 +165,10 @@ sdram #(96) sdram( .fg_addr ( ioctl_downl ? 15'h7fff : {1'b0, fg_rom_addr} ), .fg_q ( fg_rom_do ), - .sp_addr ( ioctl_downl ? 15'h7fff : {1'b0, sp_rom_addr} ), + .sp_addr ( ioctl_downl ? 15'h7fff : sp_rom_addr ), .sp_q ( sp_rom_do ), .sp_rdy ( sp_rdy ), - .bg_addr ( ioctl_downl ? 15'h7fff : {1'b1, bg_rom_addr} ), + .bg_addr ( ioctl_downl ? 15'h7fff : bg_rom_addr ), .bg_q ( bg_rom_do ) ); diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/defs.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/defs.v index 8b7912bb..975dbdda 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/defs.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/defs.v @@ -1,3 +1,4 @@ `define HW_NINJAKUN 2'd0 `define HW_RAIDERS5 2'd1 `define HW_NOVA2001 2'd2 +`define HW_PKUNWAR 2'd3 diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_adec.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_adec.v index 42a9455c..ec0f99e1 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_adec.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_adec.v @@ -45,6 +45,15 @@ always @(*) begin CS_SH0 = (CP0AD[15:11] == 5'b1110_0); CS_SH1 = 0; + SYNWR0 = 0; + SYNWR1 = 0; + end else if (HWTYPE == `HW_PKUNWAR) begin + CS_IN0 = 0; + CS_IN1 = 0; + + CS_SH0 = (CP0AD[15:11] == 5'b1100_0); + CS_SH1 = 0; + SYNWR0 = 0; SYNWR1 = 0; end diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v index 6ac4e152..88af16e6 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v @@ -21,12 +21,12 @@ module ninjakun_io_video output VBLK, output [7:0] POUT, output [15:0] SNDOUT, - output [12:0] sp_rom_addr, + output [13:0] sp_rom_addr, input [31:0] sp_rom_data, input sp_rdy, output [12:0] fg_rom_addr, input [31:0] fg_rom_data, - output [12:0] bg_rom_addr, + output [13:0] bg_rom_addr, input [31:0] bg_rom_data, input [4:0] PALADR, input PALWR, @@ -100,7 +100,7 @@ end wire [7:0] PSDAT, FGDAT = CPADR[10] ? FGDAT16[15:8] : FGDAT16[7:0], BGDAT = CPADR[10] ? BGDAT16[15:8] : BGDAT16[7:0], SPDAT, PLDAT; wire [15:0] FGDAT16, BGDAT16; wire [9:0] BGOFS = CPADR[9:0]+{SCRPY[7:3],SCRPX[7:3]}; -wire [10:0] BGADR = HWTYPE[1] ? CPADR : {CPADR[10],BGOFS}; +wire [10:0] BGADR = HWTYPE[1] ? CPADR[10:0] : {CPADR[10],BGOFS}; dpram #(8,10) fgv_lo(MCLK, CS_FGV & CPWRT & ~CPADR[10], CPADR[9:0], CPODT, FGDAT16[ 7:0], MCLK, 1'b0, FGVAD, 8'd0, FGVDT[ 7:0]); dpram #(8,10) fgv_hi(MCLK, CS_FGV & CPWRT & CPADR[10], CPADR[9:0], CPODT, FGDAT16[15:8], MCLK, 1'b0, FGVAD, 8'd0, FGVDT[15:8]); diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v index 9cc0f50a..ce5055f5 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v @@ -15,7 +15,7 @@ module ninjakun_main( output CPWRT, output CPSEL, - output [14:0] CPU1ADDR, + output [15:0] CPU1ADDR, input [7:0] CPU1DT, output [14:0] CPU2ADDR, input [7:0] CPU2DT @@ -111,7 +111,7 @@ ninjakun_adec adec( wire [7:0] ROM0D, ROM1D; -assign CPU1ADDR = CP0AD[14:0]; +assign CPU1ADDR = CP0AD; assign ROM0D = CPU1DT; assign CPU2ADDR = CP1AD[14:0]; assign ROM1D = CPU2DT; @@ -146,6 +146,7 @@ ninjakun_input inps( assign CP0DT = CS_IN0 ? INPD0 : CS_SH0 ? SHDT0 : ~CP0AD[15] ? ROM0D : + (HWTYPE == `HW_PKUNWAR && CP0AD[15:13] == 3'b111) ? ROM0D : CP0ID; assign CP1DT = CS_IN1 ? INPD1 : diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_psg.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_psg.v index 911f2917..87f10fb3 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_psg.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_psg.v @@ -37,7 +37,7 @@ always @(posedge MCLK) begin if (encnt == 7) encnt <= 0; // 6 MHz `HW_NOVA2001: if (encnt == 11) encnt <= 0; // 4 MHz - default: ; + default: ; // 3 MHz endcase case (S0c) @@ -68,6 +68,8 @@ wire [7:0] IOA_PSG1, IOB_PSG1; assign SCRPX = HWTYPE == `HW_NOVA2001 ? IOA_PSG0 : IOA_PSG1; assign SCRPY = HWTYPE == `HW_NOVA2001 ? IOB_PSG0 : IOB_PSG1; +wire IO_TYPE = HWTYPE == `HW_RAIDERS5 || HWTYPE == `HW_PKUNWAR; + YM2149 psg0( .I_DA(ID), .O_DA(OD0), @@ -79,8 +81,8 @@ YM2149 psg0( .I_SEL_L(1'b0), .O_AUDIO(S0x), .O_CHAN(S0c), - .I_IOA(HWTYPE == `HW_RAIDERS5 ? {~VBLK, CTR1[6:0]} : DSW1), - .I_IOB(HWTYPE == `HW_RAIDERS5 ? CTR2 : DSW2), + .I_IOA(IO_TYPE ? {~VBLK, CTR1[6:0]} : DSW1), + .I_IOB(IO_TYPE ? CTR2 : DSW2), .O_IOA(IOA_PSG0), .O_IOB(IOB_PSG0), .ENA(ENA), diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sadec.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sadec.v index 329e1084..868c84d8 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sadec.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sadec.v @@ -58,7 +58,21 @@ always @(*) begin CS_BGV = ( CPADR[15:11] == 5'b1010_1 ); CS_SPA = ( CPADR[15:11] == 5'b1011_0 ); end + end else if (HWTYPE == `HW_PKUNWAR) begin + CS_SCRX = 0; + CS_SCRY = 0; + CS_PAL = 0; + CS_FGV = 0; + if (CPSEL) begin + CS_PSG = 0; + CS_BGV = 0; + CS_SPA = 0; + end else begin + CS_PSG = ( CPADR[15: 2] == 14'b1010_0000_0000_00 ); + CS_BGV = ( CPADR[15:11] == 5'b1000_1 ); + CS_SPA = ( CPADR[15:11] == 5'b1000_0 ); + end end end -endmodule \ No newline at end of file +endmodule diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sprite.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sprite.v index b9d4c948..a9540b73 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sprite.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sprite.v @@ -13,7 +13,7 @@ module NINJAKUN_SP output [10:0] SPAAD, input [7:0] SPADT, - output [12:0] SPCAD, + output [13:0] SPCAD, input [31:0] SPCDT, input SPCFT, @@ -66,7 +66,7 @@ module NINJAKUN_SPENG output [10:0] SPAAD, input [7:0] SPADT, - output reg [12:0] SPCAD, + output reg [13:0] SPCAD, input [31:0] SPCDT, input SPCFT, @@ -101,7 +101,7 @@ wire [3:0] WOFS = {4{FLIPH}}^(WP[3:0]); assign WPAD = {1'b0,XPOS}-{XPOSH,8'h0}+WOFS-1'd1; assign WPEN = ~(WP[4]|(WPIX[3:0]==0)); -reg [7:0] PTNO; +reg [8:0] PTNO; reg CRS; function [3:0] XOUT; @@ -135,7 +135,7 @@ reg [2:0] STATE; always @( posedge MCLK ) begin if (RESET) begin STATE <= `WAIT; - SPCAD <= 13'h1fff; + SPCAD <= 14'h3fff; end else case (STATE) diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_top.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_top.v index 2155ead8..49f43917 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_top.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_top.v @@ -22,16 +22,16 @@ module ninjakun_top output PCLK_EN, // PIXEL CLOCK ENABLE output [7:0] POUT, // PIXEL OUT output [15:0] SNDOUT, // Sound Output (LPCM unsigned 16bits) - output [14:0] CPU1ADDR, + output [15:0] CPU1ADDR, input [7:0] CPU1DT, output [14:0] CPU2ADDR, input [7:0] CPU2DT, - output [12:0] sp_rom_addr, + output [13:0] sp_rom_addr, input [31:0] sp_rom_data, input sp_rdy, output [12:0] fg_rom_addr, input [31:0] fg_rom_data, - output [12:0] bg_rom_addr, + output [13:0] bg_rom_addr, input [31:0] bg_rom_data, input [4:0] PALADR, input PALWR, diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_video.v b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_video.v index f57075e5..89f96486 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_video.v +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_video.v @@ -26,30 +26,28 @@ module NINJAKUN_VIDEO output VBLK, input DBGPD, // Palet Display (for Debug) - output [12:0] sp_rom_addr, + output [13:0] sp_rom_addr, input [31:0] sp_rom_data, input sp_rdy, output [12:0] fg_rom_addr, input [31:0] fg_rom_data, - output [12:0] bg_rom_addr, + output [13:0] bg_rom_addr, input [31:0] bg_rom_data ); `include "rtl/defs.v" -wire RAIDERS5 = HWTYPE == `HW_RAIDERS5; - assign VBLK = (PV>=193); // ROMs wire SPCFT = sp_rdy; -wire [12:0] SPCAD; +wire [13:0] SPCAD; wire [31:0] SPCDT; wire [12:0] FGCAD; wire [31:0] FGCDT; -wire [12:0] BGCAD; +wire [13:0] BGCAD; wire [31:0] BGCDT; //NJFGROM sprom(~VCLKx4, SPCAD, SPCDT, ROMCL, ROMAD, ROMDT, ROMEN); @@ -74,11 +72,11 @@ NINJAKUN_FG fg( FGCAD, FGCDT, {FGPRI, FGOUT} ); -wire FGOPQ =(FGOUT[3:0]!=0); -wire FGPPQ = FGOPQ & (~FGPRI); +wire FGOPQ = HWTYPE != `HW_PKUNWAR & (FGOUT[3:0]!=0); +wire FGPPQ = HWTYPE != `HW_PKUNWAR & FGOPQ & (~FGPRI); // Back-Ground Scanline Generator -wire [8:0] BGOUT; +wire [8:0] BGOUT, BGPRI; NINJAKUN_BG bg( MCLK, PCLK_EN, HWTYPE, @@ -86,14 +84,16 @@ NINJAKUN_BG bg( BGSCX, BGSCY, BGVAD, BGVDT, BGCAD, BGCDT, - BGOUT + BGOUT, BGPRI ); +wire BGFRC = BGPRI && BGOUT[3:0] != 0; + // Sprite Scanline Generator wire [8:0] SPOUT; NINJAKUN_SP sp( - MCLK, PCLK_EN, RESET, RAIDERS5, + MCLK, PCLK_EN, RESET, (HWTYPE == `HW_PKUNWAR || HWTYPE == `HW_RAIDERS5), PH, PV, SPAAD, SPADT, SPCAD, SPCDT, SPCFT, @@ -106,6 +106,7 @@ wire [8:0] PDOUT = (PV[7]|PV[8]) ? 9'd0 : {PV[6:2],PH[7:4]}; // Color Mixer assign PALAD = DBGPD ? PDOUT : + BGFRC ? BGOUT : FGPPQ ? FGOUT : SPOPQ ? SPOUT : FGOPQ ? FGOUT : @@ -175,18 +176,20 @@ module NINJAKUN_BG output reg [9:0] BGVAD, // VRAM input [15:0] BGVDT, - output reg [12:0] BGCAD, + output reg [13:0] BGCAD, input [31:0] BGCDT, - output [8:0] BGOUT // OUTPUT + output [8:0] BGOUT, // OUTPUT + output reg BGPRI ); -wire [8:0] POSH = PH+BGSCX+(HWTYPE == `HW_NOVA2001 ? 9'd9 : 9'd2) /* synthesis keep */; +wire [8:0] POSH = PH+BGSCX+((HWTYPE == `HW_NOVA2001 || HWTYPE == `HW_PKUNWAR) ? 9'd9 : 9'd2) /* synthesis keep */; wire [8:0] POSV = PV+BGSCY+9'd32; -wire [9:0] CHRNO = HWTYPE == `HW_RAIDERS5 ? {1'b0, BGVDT[8:0]} : - HWTYPE == `HW_NOVA2001 ? {2'b10, BGVDT[7:0]}: - {BGVDT[15:14],BGVDT[7:0]}; +wire [10:0] CHRNO = HWTYPE == `HW_RAIDERS5 ? {2'b10, BGVDT[8:0]} : + HWTYPE == `HW_NOVA2001 ? {3'b110, BGVDT[7:0]}: + HWTYPE == `HW_PKUNWAR ? BGVDT[10:0]: + {1'b1,BGVDT[15:14],BGVDT[7:0]}; reg [31:0] CDT; reg [3:0] PAL; @@ -194,7 +197,10 @@ reg [3:0] OUT; always @( posedge MCLK ) begin if (PCLK_EN) case(POSH[2:0]) - 0: begin OUT <= CDT[7:4] ; PAL <= HWTYPE == `HW_RAIDERS5 ? BGVDT[15:12] : BGVDT[11:8]; end + 0: begin OUT <= CDT[7:4] ; + PAL <= (HWTYPE == `HW_RAIDERS5 || HWTYPE == `HW_PKUNWAR) ? BGVDT[15:12] : BGVDT[11:8]; + BGPRI <= HWTYPE == `HW_PKUNWAR && BGVDT[11]; + end 1: begin OUT <= CDT[3:0] ; BGVAD <= {POSV[7:3],POSH[7:3]}; end 2: begin OUT <= CDT[15:12]; end 3: begin OUT <= CDT[11:8] ; end @@ -205,6 +211,6 @@ always @( posedge MCLK ) begin endcase end -assign BGOUT = HWTYPE == `HW_NOVA2001 ? {1'b1, (OUT == 4'h1 ? PAL : OUT)} : { 1'b1, PAL, OUT }; +assign BGOUT = HWTYPE[1] ? {1'b1, (OUT == 4'h1 ? PAL : OUT)} : { 1'b1, PAL, OUT }; endmodule From 1ca029e1848d5fa817babad1aa3222d86caa123b Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Tue, 15 Jun 2021 14:16:44 +0200 Subject: [PATCH 6/8] Nova2001: move one level up --- .../{NinjaKun_MiST => }/NinjaKun_MiST.qpf | 0 .../{NinjaKun_MiST => }/NinjaKun_MiST.qsf | 8 ++++---- .../{NinjaKun_MiST => }/NinjaKun_MiST.sdc | 0 .../Nova2001_Hardware/{NinjaKun_MiST => }/README.txt | 2 ++ .../Nova2001_Hardware/{NinjaKun_MiST => }/clean.bat | 0 .../{NinjaKun_MiST => }/meta/Ninjakun.mra | 0 .../{NinjaKun_MiST => }/meta/Nova 2001.mra | 0 .../{NinjaKun_MiST => }/meta/Penguin-Kun Wars (US).mra | 0 .../{NinjaKun_MiST => }/meta/Raiders5.mra | 0 .../{NinjaKun_MiST => }/rtl/NinjaKun_MiST.sv | 0 .../{NinjaKun_MiST => }/rtl/build_id.tcl | 0 .../Nova2001_Hardware/{NinjaKun_MiST => }/rtl/defs.v | 0 .../Nova2001_Hardware/{NinjaKun_MiST => }/rtl/dpram.vhd | 0 .../Nova2001_Hardware/{NinjaKun_MiST => }/rtl/hvgen.v | 0 .../{NinjaKun_MiST => }/rtl/ninjakun_adec.v | 0 .../{NinjaKun_MiST => }/rtl/ninjakun_cpumux.v | 0 .../{NinjaKun_MiST => }/rtl/ninjakun_input.v | 0 .../{NinjaKun_MiST => }/rtl/ninjakun_io_video.v | 0 .../{NinjaKun_MiST => }/rtl/ninjakun_irqgen.v | 0 .../{NinjaKun_MiST => }/rtl/ninjakun_main.v | 0 .../{NinjaKun_MiST => }/rtl/ninjakun_psg.v | 0 .../{NinjaKun_MiST => }/rtl/ninjakun_sadec.v | 0 .../{NinjaKun_MiST => }/rtl/ninjakun_sprite.v | 0 .../{NinjaKun_MiST => }/rtl/ninjakun_top.v | 0 .../{NinjaKun_MiST => }/rtl/ninjakun_video.v | 0 .../Nova2001_Hardware/{NinjaKun_MiST => }/rtl/pll.qip | 0 .../Nova2001_Hardware/{NinjaKun_MiST => }/rtl/pll.v | 0 .../Nova2001_Hardware/{NinjaKun_MiST => }/rtl/sdram.sv | 0 .../Nova2001_Hardware/{NinjaKun_MiST => }/rtl/spram.vhd | 0 .../Nova2001_Hardware/{NinjaKun_MiST => }/rtl/z80ip.v | 0 30 files changed, 6 insertions(+), 4 deletions(-) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/NinjaKun_MiST.qpf (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/NinjaKun_MiST.qsf (97%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/NinjaKun_MiST.sdc (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/README.txt (97%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/clean.bat (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/meta/Ninjakun.mra (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/meta/Nova 2001.mra (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/meta/Penguin-Kun Wars (US).mra (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/meta/Raiders5.mra (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/NinjaKun_MiST.sv (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/build_id.tcl (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/defs.v (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/dpram.vhd (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/hvgen.v (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/ninjakun_adec.v (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/ninjakun_cpumux.v (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/ninjakun_input.v (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/ninjakun_io_video.v (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/ninjakun_irqgen.v (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/ninjakun_main.v (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/ninjakun_psg.v (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/ninjakun_sadec.v (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/ninjakun_sprite.v (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/ninjakun_top.v (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/ninjakun_video.v (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/pll.qip (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/pll.v (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/sdram.sv (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/spram.vhd (100%) rename Arcade_MiST/Nova2001_Hardware/{NinjaKun_MiST => }/rtl/z80ip.v (100%) diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/NinjaKun_MiST.qpf b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST.qpf similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/NinjaKun_MiST.qpf rename to Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST.qpf diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/NinjaKun_MiST.qsf b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST.qsf similarity index 97% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/NinjaKun_MiST.qsf rename to Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST.qsf index b93f9a52..993f6a71 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/NinjaKun_MiST.qsf +++ b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST.qsf @@ -237,9 +237,9 @@ set_global_assignment -name VERILOG_FILE rtl/z80ip.v set_global_assignment -name VHDL_FILE rtl/dpram.vhd set_global_assignment -name VERILOG_FILE rtl/pll.v set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv -set_global_assignment -name VHDL_FILE ../../../common/Sound/ym2149/vol_table_array.vhd -set_global_assignment -name VHDL_FILE ../../../common/Sound/ym2149/YM2149.vhd -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 VHDL_FILE ../../common/Sound/ym2149/vol_table_array.vhd +set_global_assignment -name VHDL_FILE ../../common/Sound/ym2149/YM2149.vhd +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 SMART_RECOMPILE ON set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/NinjaKun_MiST.sdc b/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST.sdc similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/NinjaKun_MiST.sdc rename to Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST.sdc diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/README.txt b/Arcade_MiST/Nova2001_Hardware/README.txt similarity index 97% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/README.txt rename to Arcade_MiST/Nova2001_Hardware/README.txt index a147acba..d54b6169 100644 --- a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/README.txt +++ b/Arcade_MiST/Nova2001_Hardware/README.txt @@ -2,6 +2,8 @@ -- -- Arcade: Ninja Kun port to MiST by Slingshot -- 29 December 2019 +-- Added Nova 2001, Raiders5 and Penguin-Kun Wars +-- 15 June 2021 -- --------------------------------------------------------------------------------- -- diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/clean.bat b/Arcade_MiST/Nova2001_Hardware/clean.bat similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/clean.bat rename to Arcade_MiST/Nova2001_Hardware/clean.bat diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Ninjakun.mra b/Arcade_MiST/Nova2001_Hardware/meta/Ninjakun.mra similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Ninjakun.mra rename to Arcade_MiST/Nova2001_Hardware/meta/Ninjakun.mra diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Nova 2001.mra b/Arcade_MiST/Nova2001_Hardware/meta/Nova 2001.mra similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Nova 2001.mra rename to Arcade_MiST/Nova2001_Hardware/meta/Nova 2001.mra diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Penguin-Kun Wars (US).mra b/Arcade_MiST/Nova2001_Hardware/meta/Penguin-Kun Wars (US).mra similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Penguin-Kun Wars (US).mra rename to Arcade_MiST/Nova2001_Hardware/meta/Penguin-Kun Wars (US).mra diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Raiders5.mra b/Arcade_MiST/Nova2001_Hardware/meta/Raiders5.mra similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/meta/Raiders5.mra rename to Arcade_MiST/Nova2001_Hardware/meta/Raiders5.mra diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv b/Arcade_MiST/Nova2001_Hardware/rtl/NinjaKun_MiST.sv similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/NinjaKun_MiST.sv rename to Arcade_MiST/Nova2001_Hardware/rtl/NinjaKun_MiST.sv diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/build_id.tcl b/Arcade_MiST/Nova2001_Hardware/rtl/build_id.tcl similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/build_id.tcl rename to Arcade_MiST/Nova2001_Hardware/rtl/build_id.tcl diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/defs.v b/Arcade_MiST/Nova2001_Hardware/rtl/defs.v similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/defs.v rename to Arcade_MiST/Nova2001_Hardware/rtl/defs.v diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/dpram.vhd b/Arcade_MiST/Nova2001_Hardware/rtl/dpram.vhd similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/dpram.vhd rename to Arcade_MiST/Nova2001_Hardware/rtl/dpram.vhd diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/hvgen.v b/Arcade_MiST/Nova2001_Hardware/rtl/hvgen.v similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/hvgen.v rename to Arcade_MiST/Nova2001_Hardware/rtl/hvgen.v diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_adec.v b/Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_adec.v similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_adec.v rename to Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_adec.v diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_cpumux.v b/Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_cpumux.v similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_cpumux.v rename to Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_cpumux.v diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_input.v b/Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_input.v similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_input.v rename to Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_input.v diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v b/Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_io_video.v similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_io_video.v rename to Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_io_video.v diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_irqgen.v b/Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_irqgen.v similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_irqgen.v rename to Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_irqgen.v diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v b/Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_main.v similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_main.v rename to Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_main.v diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_psg.v b/Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_psg.v similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_psg.v rename to Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_psg.v diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sadec.v b/Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_sadec.v similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sadec.v rename to Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_sadec.v diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sprite.v b/Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_sprite.v similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_sprite.v rename to Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_sprite.v diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_top.v b/Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_top.v similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_top.v rename to Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_top.v diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_video.v b/Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_video.v similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/ninjakun_video.v rename to Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_video.v diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/pll.qip b/Arcade_MiST/Nova2001_Hardware/rtl/pll.qip similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/pll.qip rename to Arcade_MiST/Nova2001_Hardware/rtl/pll.qip diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/pll.v b/Arcade_MiST/Nova2001_Hardware/rtl/pll.v similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/pll.v rename to Arcade_MiST/Nova2001_Hardware/rtl/pll.v diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/sdram.sv b/Arcade_MiST/Nova2001_Hardware/rtl/sdram.sv similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/sdram.sv rename to Arcade_MiST/Nova2001_Hardware/rtl/sdram.sv diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/spram.vhd b/Arcade_MiST/Nova2001_Hardware/rtl/spram.vhd similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/spram.vhd rename to Arcade_MiST/Nova2001_Hardware/rtl/spram.vhd diff --git a/Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/z80ip.v b/Arcade_MiST/Nova2001_Hardware/rtl/z80ip.v similarity index 100% rename from Arcade_MiST/Nova2001_Hardware/NinjaKun_MiST/rtl/z80ip.v rename to Arcade_MiST/Nova2001_Hardware/rtl/z80ip.v From d008721da61980a87a21fd01ab0e11bfa3e096a9 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Tue, 15 Jun 2021 14:21:13 +0200 Subject: [PATCH 7/8] MiST: replace rgb2ypbpr --- common/mist/mist.qip | 2 +- common/mist/mist_video.v | 31 ++++++------ common/mist/rgb2ypbpr.sv | 55 --------------------- common/mist/rgb2ypbpr.v | 103 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+), 71 deletions(-) delete mode 100644 common/mist/rgb2ypbpr.sv create mode 100644 common/mist/rgb2ypbpr.v diff --git a/common/mist/mist.qip b/common/mist/mist.qip index 46cde4bc..de360210 100644 --- a/common/mist/mist.qip +++ b/common/mist/mist.qip @@ -5,6 +5,6 @@ set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) mist_vi set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) scandoubler.v] set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) osd.v] set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) arcade_inputs.v] -set_global_assignment -name SYSTEMVERILOG_FILE [file join $::quartus(qip_path) rgb2ypbpr.sv] +set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) rgb2ypbpr.v] set_global_assignment -name SYSTEMVERILOG_FILE [file join $::quartus(qip_path) cofi.sv] set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) dac.vhd] diff --git a/common/mist/mist_video.v b/common/mist/mist_video.v index a0142aba..39774525 100644 --- a/common/mist/mist_video.v +++ b/common/mist/mist_video.v @@ -166,25 +166,26 @@ cofi cofi ( .blue_out( cofi_b ) ); -wire [5:0] y, pb, pr; +wire hs, vs; -rgb2ypbpr rgb2ypbpr +RGBtoYPbPr #(6) rgb2ypbpr ( - .red ( cofi_r ), - .green ( cofi_g ), - .blue ( cofi_b ), - .y ( y ), - .pb ( pb ), - .pr ( pr ) + .clk ( clk_sys ), + .ena ( ypbpr ), + + .red_in ( cofi_r ), + .green_in ( cofi_g ), + .blue_in ( cofi_b ), + .hs_in ( cofi_hs ), + .vs_in ( cofi_vs ), + .red_out ( VGA_R ), + .green_out ( VGA_G ), + .blue_out ( VGA_B ), + .hs_out ( hs ), + .vs_out ( vs ) ); -assign VGA_R = ypbpr?pr:cofi_r; -assign VGA_G = ypbpr? y:cofi_g; -assign VGA_B = ypbpr?pb:cofi_b; - -wire cs = SYNC_AND ? (cofi_hs & cofi_vs) : ~(cofi_hs ^ cofi_vs); -wire hs = cofi_hs; -wire vs = cofi_vs; +wire cs = SYNC_AND ? (hs & vs) : ~(hs ^ vs); // a minimig vga->scart cable expects a composite sync signal on the VGA_HS output. // and VCC on VGA_VS (to switch into rgb mode) diff --git a/common/mist/rgb2ypbpr.sv b/common/mist/rgb2ypbpr.sv deleted file mode 100644 index 1e1662e8..00000000 --- a/common/mist/rgb2ypbpr.sv +++ /dev/null @@ -1,55 +0,0 @@ -module rgb2ypbpr ( - input [5:0] red, - input [5:0] green, - input [5:0] blue, - - output [5:0] y, - output [5:0] pb, - output [5:0] pr -); - -wire [5:0] yuv_full[225] = '{ - 6'd0, 6'd0, 6'd0, 6'd0, 6'd1, 6'd1, 6'd1, 6'd1, - 6'd2, 6'd2, 6'd2, 6'd3, 6'd3, 6'd3, 6'd3, 6'd4, - 6'd4, 6'd4, 6'd5, 6'd5, 6'd5, 6'd5, 6'd6, 6'd6, - 6'd6, 6'd7, 6'd7, 6'd7, 6'd7, 6'd8, 6'd8, 6'd8, - 6'd9, 6'd9, 6'd9, 6'd9, 6'd10, 6'd10, 6'd10, 6'd11, - 6'd11, 6'd11, 6'd11, 6'd12, 6'd12, 6'd12, 6'd13, 6'd13, - 6'd13, 6'd13, 6'd14, 6'd14, 6'd14, 6'd15, 6'd15, 6'd15, - 6'd15, 6'd16, 6'd16, 6'd16, 6'd17, 6'd17, 6'd17, 6'd17, - 6'd18, 6'd18, 6'd18, 6'd19, 6'd19, 6'd19, 6'd19, 6'd20, - 6'd20, 6'd20, 6'd21, 6'd21, 6'd21, 6'd21, 6'd22, 6'd22, - 6'd22, 6'd23, 6'd23, 6'd23, 6'd23, 6'd24, 6'd24, 6'd24, - 6'd25, 6'd25, 6'd25, 6'd25, 6'd26, 6'd26, 6'd26, 6'd27, - 6'd27, 6'd27, 6'd27, 6'd28, 6'd28, 6'd28, 6'd29, 6'd29, - 6'd29, 6'd29, 6'd30, 6'd30, 6'd30, 6'd31, 6'd31, 6'd31, - 6'd31, 6'd32, 6'd32, 6'd32, 6'd33, 6'd33, 6'd33, 6'd33, - 6'd34, 6'd34, 6'd34, 6'd35, 6'd35, 6'd35, 6'd35, 6'd36, - 6'd36, 6'd36, 6'd36, 6'd37, 6'd37, 6'd37, 6'd38, 6'd38, - 6'd38, 6'd38, 6'd39, 6'd39, 6'd39, 6'd40, 6'd40, 6'd40, - 6'd40, 6'd41, 6'd41, 6'd41, 6'd42, 6'd42, 6'd42, 6'd42, - 6'd43, 6'd43, 6'd43, 6'd44, 6'd44, 6'd44, 6'd44, 6'd45, - 6'd45, 6'd45, 6'd46, 6'd46, 6'd46, 6'd46, 6'd47, 6'd47, - 6'd47, 6'd48, 6'd48, 6'd48, 6'd48, 6'd49, 6'd49, 6'd49, - 6'd50, 6'd50, 6'd50, 6'd50, 6'd51, 6'd51, 6'd51, 6'd52, - 6'd52, 6'd52, 6'd52, 6'd53, 6'd53, 6'd53, 6'd54, 6'd54, - 6'd54, 6'd54, 6'd55, 6'd55, 6'd55, 6'd56, 6'd56, 6'd56, - 6'd56, 6'd57, 6'd57, 6'd57, 6'd58, 6'd58, 6'd58, 6'd58, - 6'd59, 6'd59, 6'd59, 6'd60, 6'd60, 6'd60, 6'd60, 6'd61, - 6'd61, 6'd61, 6'd62, 6'd62, 6'd62, 6'd62, 6'd63, 6'd63, - 6'd63 -}; - -wire [18:0] y_8 = 19'd04096 + ({red, 8'd0} + {red, 3'd0}) + ({green, 9'd0} + {green, 2'd0}) + ({blue, 6'd0} + {blue, 5'd0} + {blue, 2'd0}); -wire [18:0] pb_8 = 19'd32768 - ({red, 7'd0} + {red, 4'd0} + {red, 3'd0}) - ({green, 8'd0} + {green, 5'd0} + {green, 3'd0}) + ({blue, 8'd0} + {blue, 7'd0} + {blue, 6'd0}); -wire [18:0] pr_8 = 19'd32768 + ({red, 8'd0} + {red, 7'd0} + {red, 6'd0}) - ({green, 8'd0} + {green, 6'd0} + {green, 5'd0} + {green, 4'd0} + {green, 3'd0}) - ({blue, 6'd0} + {blue , 3'd0}); - -wire [7:0] y_i = ( y_8[17:8] < 16) ? 8'd16 : ( y_8[17:8] > 235) ? 8'd235 : y_8[15:8]; -wire [7:0] pb_i = (pb_8[17:8] < 16) ? 8'd16 : (pb_8[17:8] > 240) ? 8'd240 : pb_8[15:8]; -wire [7:0] pr_i = (pr_8[17:8] < 16) ? 8'd16 : (pr_8[17:8] > 240) ? 8'd240 : pr_8[15:8]; - -assign pr = yuv_full[pr_i - 8'd16]; -assign y = yuv_full[y_i - 8'd16]; -assign pb = yuv_full[pb_i - 8'd16]; - -endmodule diff --git a/common/mist/rgb2ypbpr.v b/common/mist/rgb2ypbpr.v new file mode 100644 index 00000000..ee3afc1a --- /dev/null +++ b/common/mist/rgb2ypbpr.v @@ -0,0 +1,103 @@ +// Multiplier-based RGB -> YPbPr conversion + +// Copyright 2020/2021 by Alastair M. Robinson + +module RGBtoYPbPr +( + input clk, + input ena, + + input [WIDTH-1:0] red_in, + input [WIDTH-1:0] green_in, + input [WIDTH-1:0] blue_in, + input hs_in, + input vs_in, + input cs_in, + input pixel_in, + + output [WIDTH-1:0] red_out, + output [WIDTH-1:0] green_out, + output [WIDTH-1:0] blue_out, + output reg hs_out, + output reg vs_out, + output reg cs_out, + output reg pixel_out +); + +parameter WIDTH = 8; + +reg [8+WIDTH-1:0] r_y; +reg [8+WIDTH-1:0] g_y; +reg [8+WIDTH-1:0] b_y; + +reg [8+WIDTH-1:0] r_b; +reg [8+WIDTH-1:0] g_b; +reg [8+WIDTH-1:0] b_b; + +reg [8+WIDTH-1:0] r_r; +reg [8+WIDTH-1:0] g_r; +reg [8+WIDTH-1:0] b_r; + +reg [8+WIDTH-1:0] y; +reg [8+WIDTH-1:0] b; +reg [8+WIDTH-1:0] r; + +reg hs_d; +reg vs_d; +reg cs_d; +reg pixel_d; + +assign red_out = r[8+WIDTH-1:8]; +assign green_out = y[8+WIDTH-1:8]; +assign blue_out = b[8+WIDTH-1:8]; + +// Multiply in the first stage... +always @(posedge clk) begin + hs_d <= hs_in; // Register sync, pixel clock, etc + vs_d <= vs_in; // so they're delayed the same amount as the incoming video + cs_d <= cs_in; + pixel_d <= pixel_in; + + if(ena) begin + // (Y = 0.299*R + 0.587*G + 0.114*B) + r_y <= red_in * 8'd76; + g_y <= green_in * 8'd150; + b_y <= blue_in * 8'd29; + + // (Pb = -0.169*R - 0.331*G + 0.500*B) + r_b <= red_in * 8'd43; + g_b <= green_in * 8'd84; + b_b <= blue_in * 8'd128; + + // (Pr = 0.500*R - 0.419*G - 0.081*B) + r_r <= red_in * 8'd128; + g_r <= green_in * 8'd107; + b_r <= blue_in * 8'd20; + end else begin + r_r[8+WIDTH-1:8] <= red_in; // Passthrough + g_y[8+WIDTH-1:8] <= green_in; + b_b[8+WIDTH-1:8] <= blue_in; + end + +end + +// Second stage - adding + +always @(posedge clk) begin + hs_out <= hs_d; + vs_out <= vs_d; + cs_out <= cs_d; + pixel_out <= pixel_d; + + if(ena) begin + y <= r_y + g_y + b_y; + b <= 2'd2**(8+WIDTH-1) + b_b - r_b - g_b; + r <= 2'd2**(8+WIDTH-1) + r_r - g_r - b_r; + end else begin + y <= g_y; // Passthrough + b <= b_b; + r <= r_r; + end +end + +endmodule From 5b28bf0294230396c25aca7851566e6920065074 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Tue, 15 Jun 2021 16:35:46 +0200 Subject: [PATCH 8/8] Nova2001: sprite and hblank fixes --- Arcade_MiST/Nova2001_Hardware/rtl/hvgen.v | 2 +- .../Nova2001_Hardware/rtl/ninjakun_sprite.v | 28 ++++++++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Arcade_MiST/Nova2001_Hardware/rtl/hvgen.v b/Arcade_MiST/Nova2001_Hardware/rtl/hvgen.v index 8fc63e5d..00f267cd 100644 --- a/Arcade_MiST/Nova2001_Hardware/rtl/hvgen.v +++ b/Arcade_MiST/Nova2001_Hardware/rtl/hvgen.v @@ -22,7 +22,7 @@ always @(posedge CLK) begin if (PCLK_EN) begin case (hcnt) 15: begin HBLK <= 0; hcnt <= hcnt+1'd1; end - 272: begin HBLK <= 1; hcnt <= hcnt+1'd1; end + 271: begin HBLK <= 1; hcnt <= hcnt+1'd1; end 311: begin HSYN <= 0; hcnt <= hcnt+1'd1; end 342: begin HSYN <= 1; hcnt <= 471; end 511: begin hcnt <= 0; diff --git a/Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_sprite.v b/Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_sprite.v index a9540b73..53773ae2 100644 --- a/Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_sprite.v +++ b/Arcade_MiST/Nova2001_Hardware/rtl/ninjakun_sprite.v @@ -21,7 +21,7 @@ module NINJAKUN_SP ); wire WPEN; -wire [8:0] WPAD; +wire [7:0] WPAD; wire [7:0] WPIX; reg [7:0] POUT; @@ -31,7 +31,7 @@ reg [9:0] radr0=0,radr1=1; wire [7:0] POUTi; dpram #(8,10) ldbuf( - MCLK, WPEN, {PV[0], WPAD}, WPIX, 8'd0, + MCLK, WPEN, {PV[0], 1'b0, WPAD}, WPIX, 8'd0, MCLK, (radr0==radr1), radr0, 8'd0, POUTi); always @(posedge MCLK) begin @@ -70,7 +70,7 @@ module NINJAKUN_SPENG input [31:0] SPCDT, input SPCFT, - output [8:0] WPAD, + output [7:0] WPAD, output [7:0] WPIX, output WPEN ); @@ -79,15 +79,11 @@ reg [5:0] SPRNO; reg [1:0] SPRIX; assign SPAAD = {SPRNO, 3'h0, SPRIX}; -reg [7:0] ATTR; -//wire [3:0] PALNO = RAIDERS5 ? ATTR[7:4] : ATTR[3:0]; reg [3:0] PALNO; reg FLIPH; reg FLIPV; -//wire FLIPH = ATTR[4]; -//wire FLIPV = ATTR[5]; -wire XPOSH = !RAIDERS5 & ATTR[6]; -wire DSABL = RAIDERS5 ? ATTR[3] : ATTR[7]; +reg XPOSH; +reg DSABL; reg [7:0] YPOS; reg [7:0] NV; @@ -132,6 +128,7 @@ assign WPIX = {PALNO, XOUT(WP[2:0],WP[3] ? CDT1 : CDT0)}; `define NEXT 7 reg [2:0] STATE; +reg PH8_D; always @( posedge MCLK ) begin if (RESET) begin STATE <= `WAIT; @@ -140,8 +137,9 @@ always @( posedge MCLK ) begin case (STATE) `WAIT: begin + PH8_D <= PH[8]; WP <= 16; - if (~PH[8]) begin + if (PH8_D & ~PH[8]) begin NV <= PV+5'd17; SPRNO <= 0; SPRIX <= 2; @@ -155,13 +153,17 @@ always @( posedge MCLK ) begin STATE <= `FETCH1; end `FETCH1: begin - ATTR = SPADT; /* ATTR must block assign */ if (!RAIDERS5) begin PALNO <= SPADT[3:0]; FLIPH <= SPADT[4]; FLIPV <= SPADT[5]; + XPOSH <= SPADT[6]; + DSABL <= SPADT[7]; end else begin PALNO <= SPADT[7:4]; + DSABL <= SPADT[3]; + XPOSH <= 0; + PTNO[8:6] <= SPADT[2:0]; end SPRIX <= 0; STATE <= YHIT ? `FETCH2 : `NEXT; @@ -172,7 +174,7 @@ always @( posedge MCLK ) begin FLIPH <= SPADT[0]; FLIPV <= SPADT[1]; end - PTNO <= RAIDERS5 ? { ATTR[2:0], SPADT[7:2] } : SPADT; + PTNO <= RAIDERS5 ? { PTNO[8:6], SPADT[7:2] } : SPADT; SPRIX <= 1; STATE <= `FETCH3; end @@ -199,7 +201,7 @@ always @( posedge MCLK ) begin `DRAW: begin WP <= WP+1'd1; - if (WP[4]) STATE <= `NEXT; + if (&WP[3:0]) STATE <= `NEXT; end `NEXT: begin