From ff3e8e0a71122ebd6ab694b6432d8a67d4455f06 Mon Sep 17 00:00:00 2001 From: paulb-nl Date: Wed, 28 Jun 2023 13:20:54 +0200 Subject: [PATCH] CD: Add VBlank IRQ mask --- neogeo.sv | 3 +++ rtl/cd/cd.sv | 4 ++++ rtl/video/irq.v | 5 +++-- rtl/video/lspc2_a2.v | 6 ++++-- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/neogeo.sv b/neogeo.sv index b823ad9..5955005 100644 --- a/neogeo.sv +++ b/neogeo.sv @@ -791,6 +791,7 @@ wire CD_USE_SPR, CD_USE_FIX, CD_USE_Z80; wire CD_UPLOAD_EN; wire CD_BANK_PCM; wire CD_IRQ; +wire CD_VBLANK_IRQ_EN; wire DMA_RUNNING, DMA_WR_OUT, DMA_RD_OUT; wire [15:0] DMA_DATA_OUT; wire [23:0] DMA_ADDR_IN; @@ -901,6 +902,7 @@ cd_sys cdsystem( .CD_TR_WR_DATA(CD_TR_WR_DATA), .CD_TR_WR_ADDR(CD_TR_WR_ADDR), .CD_UPLOAD_EN(CD_UPLOAD_EN), .CD_IRQ(CD_IRQ), .IACK(IACK), + .CD_VBLANK_IRQ_EN(CD_VBLANK_IRQ_EN), .CDD_STATUS_IN(CDD_STATUS), .CDD_STATUS_LATCH(CDD_STATUS_LATCH), .CDD_COMMAND_DATA(CDD_COMMAND_DATA), .CDD_COMMAND_SEND(CDD_COMMAND_SEND), .CD_DATA_DOWNLOAD(CD_DATA_DOWNLOAD), .CD_DATA_WR(CD_DATA_WR), @@ -1960,6 +1962,7 @@ lspc2_a2 LSPC( .FVRAM_DATA_IN(FAST_VRAM_DATA_IN), .FVRAM_DATA_OUT(FAST_VRAM_DATA_OUT), .CWE(CWE), .VMODE(video_mode), + .CD_VBLANK_IRQ_EN(CD_VBLANK_IRQ_EN | ~SYSTEM_CDx), .FIXMAP_ADDR(FIXMAP_ADDR) // Extracted for NEO-CMC ); diff --git a/rtl/cd/cd.sv b/rtl/cd/cd.sv index 04efdf5..62dcf3a 100644 --- a/rtl/cd/cd.sv +++ b/rtl/cd/cd.sv @@ -55,6 +55,8 @@ module cd_sys( output reg [19:1] CD_TR_WR_ADDR, output reg CD_UPLOAD_EN, // The bios writes to Z80 RAM without CD_UPLOAD_EN enabled. Maybe this is only watchdog disable? + output CD_VBLANK_IRQ_EN, + input IACK, output reg CD_IRQ, @@ -790,6 +792,8 @@ module cd_sys( end endfunction + assign CD_VBLANK_IRQ_EN = &{REG_FF0004[5:4]}; + assign M68K_DATA = (SYSTEM_CDx & ~nAS & M68K_RW & IACK) ? {8'h00, CD_IRQ_VECTOR} : // Vectored interrupt handler (READING & {M68K_ADDR[11:1], 1'b0} == 12'h004) ? {4'h0, REG_FF0004} : (READING & {M68K_ADDR[11:1], 1'b0} == 12'h11C) ? {3'b110, CD_LID, CD_JUMPERS, 8'h00} : // Top mech diff --git a/rtl/video/irq.v b/rtl/video/irq.v index 1b3b956..b74608a 100644 --- a/rtl/video/irq.v +++ b/rtl/video/irq.v @@ -19,7 +19,8 @@ module irq( input [2:0] ACK_BITS, input RESET_IRQ, input TIMER_IRQ, - input VBL_IRQ, + input VBL_IRQ, + input CD_VBL_EN, input CLK, output IPL0, IPL1 ); @@ -36,7 +37,7 @@ module irq( wire B56_Q, B56_nQ, B52_Q, B52_nQ, C52_Q; FD3 B56(RESET_IRQ, 1'b0, ACK[0], B56_Q, B56_nQ); FD3 B52(TIMER_IRQ, 1'b0, ACK[1], B52_Q, B52_nQ); - FD3 C52(VBL_IRQ, 1'b0, ACK[2], C52_Q); + FD3 C52(VBL_IRQ, ~CD_VBL_EN, ACK[2], C52_Q); // B49 wire B49_OUT = B52_Q | B56_nQ; diff --git a/rtl/video/lspc2_a2.v b/rtl/video/lspc2_a2.v index d4b7ee1..0eff353 100644 --- a/rtl/video/lspc2_a2.v +++ b/rtl/video/lspc2_a2.v @@ -65,7 +65,9 @@ module lspc2_a2( output nPBUS_OUT_EN, input VMODE, - + + input CD_VBLANK_IRQ_EN, + output [14:0] FIXMAP_ADDR // Extracted for NEO-CMC ); @@ -589,7 +591,7 @@ module lspc2_a2( resetp RSTP(CLK_24MB, RESET, nRESETP); wire BNK; - irq IRQ(WR_IRQ_ACK, M68K_DATA[2:0], RESET, D46A_OUT, BNK, LSPC_6M, IPL0, IPL1); + irq IRQ(WR_IRQ_ACK, M68K_DATA[2:0], RESET, D46A_OUT, BNK, CD_VBLANK_IRQ_EN, LSPC_6M, IPL0, IPL1); wire Q53_CO, FLIP, P50_CO; videosync VS(CLK_24MB, LSPC_3M, LSPC_1_5M, Q53_CO, nRESETP, VMODE, PIXELC, RASTERC, HSYNC, VSYNC, BNK,