Fix CPU/DMA OAM access
diff --git a/verilog/rtl/boy.v b/verilog/rtl/boy.v index b437e09..819131d 100644 --- a/verilog/rtl/boy.v +++ b/verilog/rtl/boy.v
@@ -394,6 +394,10 @@ cpu_din = brom_dout; end // -- These are shared between CPU and DMA -- + else if (cpu_a >= 16'hfe00 && cpu_a <= 16'hfe9f) begin // OAM + oam_cpu_wr = cpu_wr; + cpu_din = (dma_occupy_bus) ? (8'hff) : (oam_dout); + end else if (cpu_a <= 16'hfdff) begin // External/ Work RAM/ Video RAM ext_cpu_wr = cpu_wr; cpu_din = (dma_occupy_bus) ? (8'hff) : (din);
diff --git a/verilog/rtl/dma.v b/verilog/rtl/dma.v index d384a53..2b0d924 100644 --- a/verilog/rtl/dma.v +++ b/verilog/rtl/dma.v
@@ -94,16 +94,11 @@ count <= 8'd0; end DMA_DELAY: begin - if (ct == 2'b11) begin - state <= DMA_TRANSFER_READ_ADDR; + if (ct == 2'b10) begin + state <= DMA_TRANSFER_WRITE_WAIT; end end DMA_TRANSFER_READ_ADDR: begin - dma_wr <= 1'b0; - cpu_mem_disable <= 1'b1; - // Load the temp register with data from memory - dma_a <= {dma_start_addr, count}; // Output read address - dma_rd <= 1'b1; if (mmio_wr) begin // Allow re-triggering state <= DMA_DELAY; count <= 8'd0; @@ -122,6 +117,7 @@ // Write the temp register to memory dma_a <= {8'hfe, count}; // Output write address dma_wr <= 1'b1; + count <= count + 8'd1; if (mmio_wr) begin // Allow re-triggering state <= DMA_DELAY; count <= 8'd0; @@ -138,11 +134,17 @@ else if (count == 8'h9f) begin state <= DMA_IDLE; + cpu_mem_disable <= 1'b0; count <= 8'd0; end else begin state <= DMA_TRANSFER_READ_ADDR; - count <= count + 8'd1; + // Output address + dma_wr <= 1'b0; + cpu_mem_disable <= 1'b1; + // Load the temp register with data from memory + dma_a <= {dma_start_addr, count}; // Output read address + dma_rd <= 1'b1; end end default: begin