wire [7:0] iflag = {3'b0,buttons,serial,tovf,lcdc,vblank};
reg [7:0] imask = 16'hFFFF;
- reg [7:0] ihold = 0;
+ reg [7:0] ihold = 8'b0;
wire [7:0] imasked = ihold & imask;
assign data = rd ?
imasked[3] ? 8'h58 :
imasked[4] ? 8'h60 : 8'h00;
- always @ (negedge clk)
+ always @(negedge clk)
begin
- if (wr) begin
+ if (wr && (addr == `ADDR_IF || addr == `ADDR_IE)) begin
case(addr)
`ADDR_IF : ihold <= iflag | data;
- `ADDR_IE : imask <= data;
+ `ADDR_IE : begin imask <= data; ihold <= ihold | iflag; end
endcase
end