From e4d7aabcd9107b71030e65b74ee2f7cf51828afb Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Tue, 15 Jun 2021 14:13:33 +0200 Subject: [PATCH] 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