From 1ff953a6d91a119cd9b696d6d31430f3e6ed38c4 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Wed, 5 Jan 2022 00:11:00 +0100 Subject: [PATCH] Jailbreak: add Z80 games (Green Beret, Mr. Goemon) --- Arcade_MiST/Konami Jailbreak/Jailbrek.qsf | 1 + Arcade_MiST/Konami Jailbreak/README.md | 2 + .../Konami Jailbreak/meta/Green Beret.mra | 42 ++++ .../Konami Jailbreak/meta/Jailbreak.mra | 6 +- .../meta/Manhattan 24 Bunsyo (J).mra | 7 +- .../Konami Jailbreak/meta/Mr. Goemon.mra | 37 +++ .../meta/Rush'n Attack (US).mra | 42 ++++ Arcade_MiST/Konami Jailbreak/rtl/Jailbreak.sv | 218 ++++++++++++------ .../Konami Jailbreak/rtl/Jailbreak_MiST.sv | 7 +- Arcade_MiST/Konami Jailbreak/rtl/k005849.sv | 85 +++---- common/Sound/sn76489/sn76489_latch_ctrl.vhd | 1 + 11 files changed, 328 insertions(+), 120 deletions(-) create mode 100644 Arcade_MiST/Konami Jailbreak/meta/Green Beret.mra mode change 100755 => 100644 Arcade_MiST/Konami Jailbreak/meta/Jailbreak.mra mode change 100755 => 100644 Arcade_MiST/Konami Jailbreak/meta/Manhattan 24 Bunsyo (J).mra create mode 100644 Arcade_MiST/Konami Jailbreak/meta/Mr. Goemon.mra create mode 100644 Arcade_MiST/Konami Jailbreak/meta/Rush'n Attack (US).mra diff --git a/Arcade_MiST/Konami Jailbreak/Jailbrek.qsf b/Arcade_MiST/Konami Jailbreak/Jailbrek.qsf index 0c7d3935..572d8249 100644 --- a/Arcade_MiST/Konami Jailbreak/Jailbrek.qsf +++ b/Arcade_MiST/Konami Jailbreak/Jailbrek.qsf @@ -253,6 +253,7 @@ set_global_assignment -name VHDL_FILE rtl/VLM5030/vlm5030_pack.vhd set_global_assignment -name VHDL_FILE rtl/VLM5030/vlm5030_gl.vhd set_global_assignment -name QIP_FILE rtl/pll.qip set_global_assignment -name QIP_FILE ../../common/mist/mist.qip +set_global_assignment -name QIP_FILE ../../common/CPU/T80/T80.qip set_global_assignment -name VERILOG_FILE ../../common/CPU/MC6809/mc6809is.v set_global_assignment -name QIP_FILE ../../common/Sound/sn76489/sn76489.qip set_global_assignment -name SIGNALTAP_FILE output_files/sdram.stp diff --git a/Arcade_MiST/Konami Jailbreak/README.md b/Arcade_MiST/Konami Jailbreak/README.md index 92b3397b..6674a53e 100644 --- a/Arcade_MiST/Konami Jailbreak/README.md +++ b/Arcade_MiST/Konami Jailbreak/README.md @@ -2,6 +2,8 @@ https://github.com/MiSTer-devel/Arcade-Jailbreak_MiSTer +Green Beret/Mr. Goemon added by Slingshot + ## Usage - Create ROM and ARC files from the MRA files using the MRA utility. diff --git a/Arcade_MiST/Konami Jailbreak/meta/Green Beret.mra b/Arcade_MiST/Konami Jailbreak/meta/Green Beret.mra new file mode 100644 index 00000000..8d338801 --- /dev/null +++ b/Arcade_MiST/Konami Jailbreak/meta/Green Beret.mra @@ -0,0 +1,42 @@ + + Green Beret + 0216 + gberet + 201911270000 + 1985 + Konami + Army / Fighter + jailbrek + + + + + + + + + + + + + 1 + + + + + + + FF + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Jailbreak/meta/Jailbreak.mra b/Arcade_MiST/Konami Jailbreak/meta/Jailbreak.mra old mode 100755 new mode 100644 index 86af1f2b..bbe63bae --- a/Arcade_MiST/Konami Jailbreak/meta/Jailbreak.mra +++ b/Arcade_MiST/Konami Jailbreak/meta/Jailbreak.mra @@ -44,13 +44,17 @@ + + + + - + diff --git a/Arcade_MiST/Konami Jailbreak/meta/Manhattan 24 Bunsyo (J).mra b/Arcade_MiST/Konami Jailbreak/meta/Manhattan 24 Bunsyo (J).mra old mode 100755 new mode 100644 index 19236281..15344ac2 --- a/Arcade_MiST/Konami Jailbreak/meta/Manhattan 24 Bunsyo (J).mra +++ b/Arcade_MiST/Konami Jailbreak/meta/Manhattan 24 Bunsyo (J).mra @@ -44,13 +44,18 @@ + + + + - + + diff --git a/Arcade_MiST/Konami Jailbreak/meta/Mr. Goemon.mra b/Arcade_MiST/Konami Jailbreak/meta/Mr. Goemon.mra new file mode 100644 index 00000000..dda08a65 --- /dev/null +++ b/Arcade_MiST/Konami Jailbreak/meta/Mr. Goemon.mra @@ -0,0 +1,37 @@ + + Mr. Goemon + 0216 + mrgoemon + 201911270000 + 1985 + Konami + jailbrek + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Jailbreak/meta/Rush'n Attack (US).mra b/Arcade_MiST/Konami Jailbreak/meta/Rush'n Attack (US).mra new file mode 100644 index 00000000..332d6e0e --- /dev/null +++ b/Arcade_MiST/Konami Jailbreak/meta/Rush'n Attack (US).mra @@ -0,0 +1,42 @@ + + Rush'n Attack (US) + 0216 + rushatck + 201911270000 + 1985 + Konami + Army / Fighter + jailbrek + + + + + + + + + + + + + 1 + + + + + + + FF + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Jailbreak/rtl/Jailbreak.sv b/Arcade_MiST/Konami Jailbreak/rtl/Jailbreak.sv index d25927ad..93d76220 100644 --- a/Arcade_MiST/Konami Jailbreak/rtl/Jailbreak.sv +++ b/Arcade_MiST/Konami Jailbreak/rtl/Jailbreak.sv @@ -32,7 +32,9 @@ module Jailbreak input [1:0] btn_start, //1 = Player 2, 0 = Player 1 input [3:0] p1_joystick, p2_joystick, //3 = up, 2 = down, 1 = right, 0 = left input [1:0] p1_buttons, p2_buttons, //2 buttons per player - + + input gberet, // Z80 board variant + input [19:0] dipsw, //This input serves to select a fractional divider to acheive 3.072MHz for the YM2203 depending on whether Scooter Shooter @@ -150,7 +152,7 @@ jtframe_frac_cen sn76489_cen .cen({1'bZ, cen_1m5_adjust}) ); -//------------------------------------------------------------ CPU -------------------------------------------------------------// +//------------------------------------------------------------ CPU (KONAMI-1) ----------------------------------------------------------// //CPU - KONAMI-1 custom encrypted MC6809E (uses synchronous version of Greg Miller's cycle-accurate MC6809E made by //Sorgelig with a wrapper to decrypt XOR/XNOR-encrypted opcodes and a further modification to Greg's MC6809E to directly @@ -171,36 +173,105 @@ KONAMI1 u18F .nFIRQ(firq), .nNMI(nmi), .nHALT(~pause), - .nRESET(reset) + .nRESET(reset & !gberet) ); //Address decoding for KONAMI-1 -wire cs_dip2 = ~n_iocs & (k1_A[10:8] == 3'b001) & k1_rw; -wire cs_dip3 = ~n_iocs & (k1_A[10:8] == 3'b010) & k1_rw; -wire cs_controls_dip1 = ~n_iocs & (k1_A[10:8] == 3'b011) & k1_rw; -wire cs_snlatch = ~n_iocs & (k1_A[10:8] == 3'b001) & ~k1_rw; -wire cs_sn76489 = ~n_iocs & (k1_A[10:8] == 3'b010) & ~k1_rw; -wire cs_k005849 = (k1_A[15:14] == 2'b00); -wire cs_vlm5030_busy = (k1_A[15:12] == 4'b0110); -wire cs_rom1 = (k1_A[15:14] == 2'b10) & k1_rw; -wire cs_rom2 = (k1_A[15:14] == 2'b11) & k1_rw; +wire cs_k1_dip2 = ~n_iocs & (k1_A[10:8] == 3'b001) & k1_rw; +wire cs_k1_dip3 = ~n_iocs & (k1_A[10:8] == 3'b010) & k1_rw; +wire cs_k1_controls_dip1 = ~n_iocs & (k1_A[10:8] == 3'b011) & k1_rw; +wire cs_k1_snlatch = ~n_iocs & (k1_A[10:8] == 3'b001) & ~k1_rw; +wire cs_k1_sn76489 = ~n_iocs & (k1_A[10:8] == 3'b010) & ~k1_rw; +wire cs_k1_k005849 = (k1_A[15:14] == 2'b00); +wire cs_k1_vlm5030_busy = (k1_A[15:12] == 4'b0110); +wire cs_k1_rom1 = (k1_A[15:14] == 2'b10) & k1_rw; +wire cs_k1_rom2 = (k1_A[15:14] == 2'b11) & k1_rw; //Multiplex data inputs to KONAMI-1 -wire [7:0] k1_Din = cs_dip2 ? dipsw[15:8]: - cs_dip3 ? {4'hF, dipsw[19:16]}: - cs_controls_dip1 ? controls_dip1: - (cs_k005849 & n_iocs & k1_rw) ? k005849_D: - cs_vlm5030_busy ? {7'h7F, vlm5030_busy}: - cs_rom1 ? eprom1_D: - cs_rom2 ? eprom2_D: +wire [7:0] k1_Din = cs_k1_dip2 ? dipsw[15:8]: + cs_k1_dip3 ? {4'hF, dipsw[19:16]}: + cs_k1_controls_dip1 ? controls_k1_dip1: + (cs_k1_k005849 & n_iocs & k1_rw) ? k005849_D: + cs_k1_vlm5030_busy ? {7'h7F, vlm5030_busy}: + cs_k1_rom1 ? eprom1_D: + cs_k1_rom2 ? eprom2_D: 8'hFF; -//KONAMI-1 ROMs +//------------------------------------------------------------ CPU (Z80) ----------------------------------------------------------// +wire z80_n_m1, z80_n_mreq, z80_n_iorq, z80_n_rfsh, z80_n_rd, z80_n_wr; +wire [15:0] z80_A; +wire [7:0] z80_Dout; +T80s u9A +( + .RESET_n(reset & gberet), + .CLK(clk_49m), + .CEN(cen_3m & ~pause), + .INT_n(z80_n_int), + .NMI_n(z80_n_nmi), + .MREQ_n(z80_n_mreq), + .IORQ_n(z80_n_iorq), + .RD_n(z80_n_rd), + .WR_n(z80_n_wr), + .M1_n(z80_n_m1), + .RFSH_n(z80_n_rfsh), + .A(z80_A), + .DI(z80_Din), + .DO(z80_Dout) +); +//Address decoding for Z80 +wire z80_decode_en = (z80_n_rfsh & ~z80_n_mreq); +wire cs_z80_dip2 = ~n_iocs & (z80_A[10:8] == 3'b010) & ~z80_n_rd; +wire cs_z80_dip3 = ~n_iocs & (z80_A[10:8] == 3'b100) & ~z80_n_rd; +wire cs_z80_controls_dip1 = ~n_iocs & (z80_A[10:8] == 3'b110) & ~z80_n_rd; +wire cs_z80_snlatch = ~n_iocs & (z80_A[10:8] == 3'b010) & ~z80_n_wr; +wire cs_z80_sn76489 = ~n_iocs & (z80_A[10:8] == 3'b100) & ~z80_n_wr; +wire cs_z80_bankw = ~n_iocs & (z80_A[10:8] == 3'b000) & ~z80_n_wr; +wire cs_z80_k005849 = z80_decode_en & (z80_A[15:14] == 2'b11) & ~cs_z80_rom4; +wire cs_z80_rom1 = z80_decode_en & (z80_A[15:14] == 2'b00); +wire cs_z80_rom2 = z80_decode_en & (z80_A[15:14] == 2'b01); +wire cs_z80_rom3 = z80_decode_en & (z80_A[15:14] == 2'b10); +wire cs_z80_rom4 = z80_decode_en & (z80_A[15:11] == 5'b11111); + +//Multiplex data inputs to Z80 +wire [7:0] z80_Din = cs_z80_dip2 ? dipsw[15:8]: + cs_z80_dip3 ? {4'hF, dipsw[19:16]}: + cs_z80_controls_dip1 ? controls_z80_dip1: + (cs_z80_k005849 & n_iocs & ~z80_n_rd) ? k005849_D: + cs_z80_rom1 ? eprom1_D: + cs_z80_rom2 ? eprom2_D: + cs_z80_rom3 ? eprom3_D: + cs_z80_rom4 ? eprom4_D: + 8'hFF; + +wire z80_n_nmi = nmi; +wire z80_n_int = firq & irq; + +reg [2:0] z80_bank; +always_ff @(posedge clk_49m) + if (cs_z80_bankw) z80_bank <= z80_Dout[7:5]; + +// --------------------------------------------CPU BUS Selector----------------------------------------------------------// +wire cs_snlatch = gberet ? cs_z80_snlatch : cs_k1_snlatch; +wire cs_sn76489 = gberet ? cs_z80_sn76489 : cs_k1_sn76489; +wire cs_k005849 = gberet ? cs_z80_k005849 : cs_k1_k005849; +wire [15:0] cpu_A = gberet ? z80_A : k1_A; +wire [7:0] cpu_Dout = gberet ? z80_Dout : k1_Dout; +wire cpu_rw = gberet ? z80_n_wr : k1_rw; + +// ----------------------------------------------------------------------------------------------------------------------// +//CPU ROMs (first 16k) `ifdef EXT_ROM always_ff @(posedge clk_49m) - if (k1_A[15] & k1_rw) - main_cpu_rom_addr <= k1_A[14:0]; + if (gberet) begin + if (z80_A[15:14] != 2'b11 & z80_decode_en & ~z80_n_rd) main_cpu_rom_addr <= z80_A; + if (z80_A[15:11] == 5'b11111 & z80_decode_en & ~z80_n_rd) main_cpu_rom_addr <= {2'b11, z80_bank, z80_A[10:0]}; + end + else begin + if (k1_A[15] & k1_rw) main_cpu_rom_addr <= k1_A[14:0]; + end wire [7:0] eprom1_D = main_cpu_rom_do; wire [7:0] eprom2_D = main_cpu_rom_do; +//wire [7:0] eprom3_D = main_cpu_rom_do; +wire [7:0] eprom4_D = main_cpu_rom_do; `else //ROM 1/2 wire [7:0] eprom1_D; @@ -232,19 +303,23 @@ eprom_2 u9D //Sound latch reg [7:0] sound_data = 8'd0; -always_ff @(posedge clk_49m) begin - if(cen_3m && cs_snlatch) - sound_data <= k1_Dout; -end +always_ff @(posedge clk_49m) + if(cs_snlatch) sound_data <= cpu_Dout; //--------------------------------------------------- Controls & DIP switches --------------------------------------------------// //Multiplex player inputs and DIP switch bank 1 -wire [7:0] controls_dip1 = (k1_A[1:0] == 2'b00) ? {3'b111, btn_start, btn_service, coin}: - (k1_A[1:0] == 2'b01) ? {2'b11, p1_buttons, p1_joystick}: - (k1_A[1:0] == 2'b10) ? {2'b11, p2_buttons, p2_joystick}: - (k1_A[1:0] == 2'b11) ? dipsw[7:0]: - 8'hFF; +wire [7:0] controls_k1_dip1 = (k1_A[1:0] == 2'b00) ? {3'b111, btn_start, btn_service, coin}: + (k1_A[1:0] == 2'b01) ? {2'b11, p1_buttons, p1_joystick}: + (k1_A[1:0] == 2'b10) ? {2'b11, p2_buttons, p2_joystick}: + (k1_A[1:0] == 2'b11) ? dipsw[7:0]: + 8'hFF; + +wire [7:0] controls_z80_dip1 = (z80_A[1:0] == 2'b11) ? {3'b111, btn_start, btn_service, coin}: + (z80_A[1:0] == 2'b10) ? {2'b11, p1_buttons, p1_joystick}: + (z80_A[1:0] == 2'b01) ? {2'b11, p2_buttons, p2_joystick}: + (z80_A[1:0] == 2'b00) ? dipsw[7:0]: + 8'hFF; //--------------------------------------------------- Video timing & graphics --------------------------------------------------// @@ -260,9 +335,9 @@ k005849 u8E ( .CK49(clk_49m), .RES(reset), - .READ(~k1_rw), - .A(k1_A[13:0]), - .DBi(k1_Dout), + .READ(~cpu_rw), + .A(cpu_A[13:0]), + .DBi(cpu_Dout), .DBo(k005849_D), .VCF(tilemap_lut_A[7:4]), .VCB(tilemap_lut_A[3:0]), @@ -290,7 +365,7 @@ k005849 u8E .SD(spriterom_D), .HCTR(h_center), .VCTR(v_center), - .SPFL(1), + .SPFL(gberet), .hs_address(hs_address), .hs_data_out(hs_data_out), @@ -303,22 +378,11 @@ k005849 u8E `ifdef EXT_ROM assign sp1_rom_addr = spriterom_A[15:1]; wire [7:0] spriterom_D = spriterom_A[0] ? sp1_rom_do[15:8] : sp1_rom_do[7:0]; -assign char1_rom_addr = tilerom_A[14:1]; +assign char1_rom_addr = {gberet ? 1'b1 : tilerom_A[14], tilerom_A[13:1]}; wire [7:0] tilerom_D = tilerom_A[0] ? char1_rom_do[15:8] : char1_rom_do[7:0]; `else -wire [7:0] eprom3_D, eprom4_D, eprom5_D, eprom6_D, eprom7_D, eprom8_D; -eprom_3 u4F -( - .ADDR(tilerom_A[13:0]), - .CLK(clk_49m), - .DATA(eprom3_D), - .ADDR_DL(ioctl_addr), - .CLK_DL(clk_49m), - .DATA_IN(ioctl_data), - .CS_DL(ep3_cs_i), - .WR(ioctl_wr) -); -eprom_4 u5F +wire [7:0] eprom4_D, eprom5_D, eprom6_D, eprom7_D, eprom8_D, eprom9_D; +eprom_4 u4F ( .ADDR(tilerom_A[13:0]), .CLK(clk_49m), @@ -329,10 +393,10 @@ eprom_4 u5F .CS_DL(ep4_cs_i), .WR(ioctl_wr) ); -eprom_5 u3E +eprom_5 u5F ( - .ADDR(spriterom_A[13:0]), - .CLK(~clk_49m), + .ADDR(tilerom_A[13:0]), + .CLK(clk_49m), .DATA(eprom5_D), .ADDR_DL(ioctl_addr), .CLK_DL(clk_49m), @@ -340,7 +404,7 @@ eprom_5 u3E .CS_DL(ep5_cs_i), .WR(ioctl_wr) ); -eprom_6 u4E +eprom_6 u3E ( .ADDR(spriterom_A[13:0]), .CLK(~clk_49m), @@ -351,7 +415,7 @@ eprom_6 u4E .CS_DL(ep6_cs_i), .WR(ioctl_wr) ); -eprom_7 u5E +eprom_7 u4E ( .ADDR(spriterom_A[13:0]), .CLK(~clk_49m), @@ -362,7 +426,7 @@ eprom_7 u5E .CS_DL(ep7_cs_i), .WR(ioctl_wr) ); -eprom_8 u3F +eprom_8 u5E ( .ADDR(spriterom_A[13:0]), .CLK(~clk_49m), @@ -373,15 +437,26 @@ eprom_8 u3F .CS_DL(ep8_cs_i), .WR(ioctl_wr) ); +eprom_9 u3F +( + .ADDR(spriterom_A[13:0]), + .CLK(~clk_49m), + .DATA(eprom9_D), + .ADDR_DL(ioctl_addr), + .CLK_DL(clk_49m), + .DATA_IN(ioctl_data), + .CS_DL(ep9_cs_i), + .WR(ioctl_wr) +); //Multiplex tilemap ROMs -wire [7:0] tilerom_D = tilerom_A[14] ? eprom4_D : eprom3_D; +wire [7:0] tilerom_D = (gberet | tilerom_A[14]) ? eprom5_D : eprom4_D; //Multiplex sprite ROMs -wire [7:0] spriterom_D = (spriterom_A[15:14] == 2'b00) ? eprom5_D: - (spriterom_A[15:14] == 2'b01) ? eprom6_D: - (spriterom_A[15:14] == 2'b10) ? eprom7_D: - (spriterom_A[15:14] == 2'b11) ? eprom8_D: +wire [7:0] spriterom_D = (spriterom_A[15:14] == 2'b00) ? eprom6_D: + (spriterom_A[15:14] == 2'b01) ? eprom7_D: + (spriterom_A[15:14] == 2'b10) ? eprom8_D: + (spriterom_A[15:14] == 2'b11) ? eprom9_D: 8'hFF; `endif @@ -457,17 +532,17 @@ vlm5030_gl u6A .o_audio(vlm5030_raw) ); -//VLM5030 ROM -wire [7:0] eprom9_D; -eprom_9 u8C +//VLM5030 ROM (8000-bfff CPU ROM on Greeb Beret/Mr.Goemon) +wire [7:0] eprom3_D; +eprom_3 u8C ( - .ADDR(vlm5030_rom_A), + .ADDR(gberet ? cpu_A[13:0] : vlm5030_rom_A), .CLK(clk_49m), - .DATA(eprom9_D), + .DATA(eprom3_D), .ADDR_DL(ioctl_addr), .CLK_DL(clk_49m), .DATA_IN(ioctl_data), - .CS_DL(ep9_cs_i), + .CS_DL(ep3_cs_i), .WR(ioctl_wr) ); @@ -496,17 +571,22 @@ end //Multiplex data inputs from the ROM and KONAMI-1 to the VLM5030's data input wire [7:0] vlm5030_Din = vlm5030_enable ? vlm5030_sound_D: - ~n_vlm5030_rom_en ? eprom9_D: + ~n_vlm5030_rom_en ? eprom3_D: 8'hFF; //----------------------------------------------------- Final video output -----------------------------------------------------// //Jailbreak's final video output consists of two PROMs addressed by the 005849 custom tilemap generator +wire [7:0] prom1_d, prom2_d; +assign video_r = gberet ? {prom1_d[2:0], prom1_d[2]} : prom1_d[3:0]; +assign video_g = gberet ? {prom1_d[5:3], prom1_d[5]} : prom1_d[7:4]; +assign video_b = gberet ? {prom1_d[7:6], prom1_d[7:6]} : prom2_d[3:0]; + color_prom_1 u1F ( .ADDR(color_A), .CLK(clk_49m), - .DATA({video_g, video_r}), + .DATA(prom1_d), .ADDR_DL(ioctl_addr), .CLK_DL(clk_49m), .DATA_IN(ioctl_data), @@ -518,7 +598,7 @@ color_prom_2 u2F ( .ADDR(color_A), .CLK(clk_49m), - .DATA(video_b), + .DATA(prom2_d), .ADDR_DL(ioctl_addr), .CLK_DL(clk_49m), .DATA_IN(ioctl_data), diff --git a/Arcade_MiST/Konami Jailbreak/rtl/Jailbreak_MiST.sv b/Arcade_MiST/Konami Jailbreak/rtl/Jailbreak_MiST.sv index ce2529ff..83f5b117 100644 --- a/Arcade_MiST/Konami Jailbreak/rtl/Jailbreak_MiST.sv +++ b/Arcade_MiST/Konami Jailbreak/rtl/Jailbreak_MiST.sv @@ -52,6 +52,7 @@ wire pause = status[1]; wire [1:0] orientation = 2'b10; wire [23:0] dip_sw = ~status[31:8]; +wire gberet = core_mod[0]; assign LED = ~ioctl_downl; assign SDRAM_CLK = clock_98; @@ -124,7 +125,7 @@ data_io data_io( .ioctl_addr ( ioctl_addr ), .ioctl_dout ( ioctl_dout ) ); -wire [24:0] bg_ioctl_addr = ioctl_addr - 16'h8000; +wire [24:0] bg_ioctl_addr = ioctl_addr - 16'hc000; reg port1_req, port2_req; sdram #(98) sdram( @@ -211,7 +212,9 @@ Jailbreak Jailbreak_inst .p2_joystick({~m_down2 | m_up2, ~m_up2, ~m_right2 | m_left2, ~m_left2}), .p1_buttons({~m_fireB, ~m_fireA}), .p2_buttons({~m_fire2B, ~m_fire2A}), - + + .gberet(gberet), + .dipsw(dip_sw), // input [24:0] dipsw .sound(audio), // output [15:0] sound diff --git a/Arcade_MiST/Konami Jailbreak/rtl/k005849.sv b/Arcade_MiST/Konami Jailbreak/rtl/k005849.sv index 70458ede..8acecbf7 100644 --- a/Arcade_MiST/Konami Jailbreak/rtl/k005849.sv +++ b/Arcade_MiST/Konami Jailbreak/rtl/k005849.sv @@ -148,23 +148,21 @@ reg hblank = 0; reg vblank = 0; reg frame_odd_even = 0; -reg hmask = 0; always_ff @(posedge CK49) begin if(cen_6m) begin case(h_cnt) 5: begin - hblank <= 0; + hblank <= hmask_en; h_cnt <= h_cnt + 9'd1; end 13: begin - hmask <= 0; + hblank <= 0; h_cnt <= h_cnt + 9'd1; end //Blank the left-most and right-most 8 lines when the 005849's horizontal mask register bit //(register 3 bit 7) is active 253: begin - if(hmask_en) - hmask <= 1; + hblank <= hmask_en; h_cnt <= h_cnt + 9'd1; end 261: begin @@ -205,9 +203,9 @@ assign SYNC = HSYC ^ VSYC; //------------------------------------------------------------- IRQs -----------------------------------------------------------// //Edge detection for VBlank and vertical counter bit 5 for IRQ generation -reg old_vblank, old_vcnt5; +reg old_vblank, old_vcnt4; always_ff @(posedge CK49) begin - old_vcnt5 <= v_cnt[5]; + old_vcnt4 <= v_cnt[4]; old_vblank <= vblank; end @@ -228,7 +226,7 @@ always_ff @(posedge CK49) begin if(!RES || !nmi_mask) nmi <= 1; else begin - if(old_vcnt5 && !v_cnt[5]) + if(old_vcnt4 && !v_cnt[4]) nmi <= 0; end end @@ -410,14 +408,17 @@ dpram_dc #(.widthad_a(12)) VRAM_SPR_SHADOW //-------------------------------------------------------- Tilemap layer -------------------------------------------------------// -//**The following code is the original tilemap renderer from MiSTerX's Green Beret core with some minor tweaks**// +//**The following code id based on the original tilemap renderer from MiSTerX's Green Beret core with some minor tweaks**// +//**Added proper pipelining of external ROM data //** + //XOR horizontal and vertical counter bits with flipscreen bit wire [8:0] hcnt_x = h_cnt ^ {9{flipscreen}}; wire [8:0] vcnt_x = v_cnt ^ {9{flipscreen}}; //Generate tilemap position - horizontal position is the sum of the horizontal counter, vertical position is the vertical counter // -wire [8:0] tilemap_hpos = {h_cnt[8], hcnt_x[7:0]} + (~zram_scroll_dir ? {zram1_D[0], zram0_D} : 9'd0); +wire [8:0] xscroll = (~zram_scroll_dir ? {zram1_D[0], zram0_D} : 9'd0); +wire [8:0] tilemap_hpos = {h_cnt[8], hcnt_x[7:0]} + xscroll; wire [8:0] tilemap_vpos = vcnt_x + (zram_scroll_dir ? {zram1_D[0], zram0_D} : 9'd0); //Address output to tile section of VRAM @@ -431,7 +432,7 @@ wire [10:0] tile_index = {tilemap_bank, tileram_attrib_D[7:6], tileram_code_D}; wire [3:0] tile_color = tileram_attrib_D[3:0]; reg [3:0] tile_color_r, tile_color_rr; reg tile_attrib7_r, tile_attrib7_rr; -reg tile_hflip_r; +reg tile_hflip_r, tile_hflip_rr; reg [7:0] RD_r; //Tile flip attributes are stored in bits 4 (horizontal) and 5 (vertical) @@ -445,37 +446,37 @@ always_ff @(posedge CK49) begin R <= {tile_index, (tilemap_vpos[2:0] ^ {3{tile_vflip}}), (tilemap_hpos[2:1] ^ {2{tile_hflip}})}; // Apply appropriate delay to flags tile_hflip_r <= tile_hflip; + tile_hflip_rr <= tile_hflip_r; tile_color_r <= tile_color; tile_color_rr <= tile_color_r; tile_attrib7_r <= tileram_attrib_D[7]; tile_attrib7_rr <= tile_attrib7_r; + // latch tile ROM output RD_r <= RD; end end end //Multiplex tilemap ROM data down from 8 bits to 4 using bit 0 of the horizontal position -wire [3:0] tile_pixel = (tilemap_hpos[0] ^ tile_hflip_r) ? RD_r[3:0] : RD_r[7:4]; +wire [3:0] tile_pixel = (hcnt_x[0] ^ tile_hflip_rr) ? RD_r[3:0] : RD_r[7:4]; //Retrieve tilemap select bit from the NOR of bit 7 of the tile attributes with the priority override bit -reg tilemap_en = 0; -always_ff @(posedge CK49) begin - if(cen_6m) begin - tilemap_en <= ~(tile_attrib7_rr | tile_priority_override); - end -end +wire tilemap_force = ~(tile_attrib7_rr | tile_priority_override) & |tilemap_D; //Address output to tilemap LUT PROM assign VCF = tile_color_rr; assign VCB = tile_pixel; +reg [3:0] pix0, pix1; -//Delay tilemap data by one horizontal line -reg [3:0] tilemap_D = 4'd0; always_ff @(posedge CK49) begin - if(cen_6m) - tilemap_D <= VCD; + if(cen_6m) begin + pix0 <= VCD; + pix1 <= pix0; + end end +wire [3:0] tilemap_D = xscroll[0] ? pix1 : pix0; + //-------------------------------------------------------- Sprite layer --------------------------------------------------------// //The following code is the original sprite renderer from MiSTerX's Green Beret core with additional screen flipping support and @@ -506,14 +507,14 @@ always_ff @(posedge CK49) begin sprite_fsm_state <= 0; //When the sprite Y attribute is set to 0, skip the current sprite, otherwise obtain the sprite Y attribute //and scan out the other sprite attributes - else begin - if(hy) begin - sprite_attrib3 <= spriteram_D; - sprite_offset <= 2; - sprite_fsm_state <= sprite_fsm_state + 3'd1; - end - else sprite_index <= sprite_index + 6'd1; + else begin + if(hy) begin + sprite_attrib3 <= spriteram_D; + sprite_offset <= 2; + sprite_fsm_state <= sprite_fsm_state + 3'd1; end + else sprite_index <= sprite_index + 6'd1; + end end 2: begin sprite_attrib2 <= spriteram_D; @@ -536,7 +537,8 @@ always_ff @(posedge CK49) begin 5: if (S_req == S_ack) begin xcnt <= xcnt + 5'd1; sprite_fsm_state <= wre ? sprite_fsm_state : 3'd1; - S_req <= (wre & xcnt[0]) ? !S_req : S_req; + // request external memory access in every 4 pixels (16 bits) + S_req <= (wre & xcnt[1:0] == 2'b11) ? !S_req : S_req; end default:; endcase @@ -544,7 +546,7 @@ end //Subtract sprite attribute byte 2 with bit 7 of sprite attribute byte 1 to obtain sprite X position and XOR with the //flipscreen bit -wire [8:0] sprite_x = ({1'b0, sprite_attrib2} - {sprite_attrib1[7], 8'h00}) ^ {9{flipscreen}}; +wire [8:0] sprite_x = ({1'b0, sprite_attrib2} - {sprite_attrib1[7], 8'h00} + 3'd5) ^ {9{flipscreen}}; //If the sprite state machine is in state 1, obtain sprite Y position directly from sprite RAM, otherwise obtain it from //sprite attribute byte 3 and XOR with the flipscreen bit @@ -573,18 +575,7 @@ assign S = {sprite_code, ly[3], lx[3], ly[2:0], lx[2:1]}; //Multiplex sprite ROM data down from 8 bits to 4 using bit 0 of the horizontal position wire [3:0] sprite_pixel = lx[0] ? SD[3:0] : SD[7:4]; -//Latch the sprite bank from bit 3 of register 3 on the rising edge of VSync and XNOR with the added SPFL signal to flip this bit -//for Green Beret -//TODO: Find the actual internal register bit (if any) on the 005849 to properly handle this -reg sprite_bank = 0; -reg old_vsync; -always_ff @(posedge CK49) begin - old_vsync <= VSYC; - if(!VSYC) - sprite_bank <= 0; - else if(!old_vsync && VSYC) - sprite_bank <= ~(reg3[3] ^ SPFL); -end +wire sprite_bank = reg3[3] ^ SPFL; wire [11:0] spriteram_A = {3'b000, sprite_bank, sprite_index, sprite_offset}; @@ -654,17 +645,17 @@ end //--------------------------------------------------------- Color mixer --------------------------------------------------------// //Multiplex tile and sprite data, then output the final result -wire tile_sprite_sel = (tilemap_en | ~(|sprite_D)); -wire [3:0] tile_sprite_D = tile_sprite_sel ? tilemap_D : sprite_D; +wire tile_bg_sel = tilemap_force | ~(|sprite_D); +wire [3:0] tile_pix_D = tile_bg_sel ? tilemap_D : sprite_D; //Latch and output pixel data reg [4:0] pixel_D; always_ff @(posedge CK49) begin if(cen_6m) - pixel_D <= {tile_sprite_sel, tile_sprite_D}; + pixel_D <= {tile_bg_sel, tile_pix_D}; end //If the horizontal mask is active, black out the left-most and right-most 8 columns to limit the display area to 240x224, otherwise //output the full 256x224 -assign COL = hmask ? 5'd0 : pixel_D; +assign COL = pixel_D; endmodule diff --git a/common/Sound/sn76489/sn76489_latch_ctrl.vhd b/common/Sound/sn76489/sn76489_latch_ctrl.vhd index 4ebc8082..2fcf5bbc 100644 --- a/common/Sound/sn76489/sn76489_latch_ctrl.vhd +++ b/common/Sound/sn76489/sn76489_latch_ctrl.vhd @@ -91,6 +91,7 @@ begin reg_q <= (others => '0'); we_q <= false; ready_q <= '0'; + we_n_d <= '1'; elsif clock_i'event and clock_i = '1' then if clk_en_i then