X-Git-Url: http://git.joshuawise.com/fpgaboy.git/blobdiff_plain/68ce013e5fe7c5d1c4e07fe8ba1eb0ba2855b280..9e1c03b633deae6254b6df312a48eba6047e266e:/Interrupt.v diff --git a/Interrupt.v b/Interrupt.v index fcc396b..201c328 100644 --- a/Interrupt.v +++ b/Interrupt.v @@ -13,16 +13,20 @@ module Interrupt( input serial, input buttons, output master, + input ack, output [7:0] jaddr); wire [7:0] iflag = {3'b0,buttons,serial,tovf,lcdc,vblank}; reg [7:0] imask = 16'hFFFF; reg [7:0] ihold = 8'b0; wire [7:0] imasked = ihold & imask; + + reg rdlatch = 0; + reg [15:0] addrlatch = 0; - assign data = rd ? - (addr == `ADDR_IF) ? ihold : - (addr == `ADDR_IE) ? imask : + assign data = rdlatch ? + (addrlatch == `ADDR_IF) ? ihold : + (addrlatch == `ADDR_IE) ? imask : 8'bzzzzzzzz : 8'bzzzzzzzz; @@ -42,9 +46,18 @@ module Interrupt( `ADDR_IE : begin imask <= data; ihold <= ihold | iflag; end endcase - end + end else if (ack) + ihold <= ihold & + (imasked[0] ? 8'b11111110 : + imasked[1] ? 8'b11111101 : + imasked[2] ? 8'b11111011 : + imasked[3] ? 8'b11110111 : + imasked[4] ? 8'b11101111 : + 8'b11111111); else ihold <= ihold | iflag; + rdlatch <= rd; + addrlatch <= addr; end endmodule