FPGA/cx4: implement reset vector access
This commit is contained in:
parent
7643790fed
commit
314da586a4
@ -21,6 +21,7 @@ module address(
|
|||||||
input CLK,
|
input CLK,
|
||||||
input [2:0] MAPPER, // MCU detected mapper
|
input [2:0] MAPPER, // MCU detected mapper
|
||||||
input [23:0] SNES_ADDR, // requested address from SNES
|
input [23:0] SNES_ADDR, // requested address from SNES
|
||||||
|
input SNES_CS, // SNES ROMSEL signal
|
||||||
output [23:0] ROM_ADDR, // Address to request from SRAM0
|
output [23:0] ROM_ADDR, // Address to request from SRAM0
|
||||||
output ROM_SEL, // enable SRAM0 (active low)
|
output ROM_SEL, // enable SRAM0 (active low)
|
||||||
output IS_SAVERAM, // address/CS mapped as SRAM?
|
output IS_SAVERAM, // address/CS mapped as SRAM?
|
||||||
@ -30,7 +31,8 @@ module address(
|
|||||||
input [23:0] ROM_MASK,
|
input [23:0] ROM_MASK,
|
||||||
input use_msu1,
|
input use_msu1,
|
||||||
output msu_enable,
|
output msu_enable,
|
||||||
output cx4_enable
|
output cx4_enable,
|
||||||
|
output cx4_vect_enable
|
||||||
);
|
);
|
||||||
|
|
||||||
wire [23:0] SRAM_SNES_ADDR;
|
wire [23:0] SRAM_SNES_ADDR;
|
||||||
@ -40,7 +42,7 @@ wire [23:0] SRAM_SNES_ADDR;
|
|||||||
- MMIO @ 6000-7fff
|
- MMIO @ 6000-7fff
|
||||||
*/
|
*/
|
||||||
|
|
||||||
assign IS_ROM = (SNES_ADDR[15]);
|
assign IS_ROM = SNES_ADDR[15] & ~SNES_CS;
|
||||||
|
|
||||||
assign SRAM_SNES_ADDR = ({2'b00, SNES_ADDR[22:16], SNES_ADDR[14:0]}
|
assign SRAM_SNES_ADDR = ({2'b00, SNES_ADDR[22:16], SNES_ADDR[14:0]}
|
||||||
& ROM_MASK);
|
& ROM_MASK);
|
||||||
@ -61,4 +63,5 @@ initial cx4_enable_r = 6'b000000;
|
|||||||
always @(posedge CLK) cx4_enable_r <= {cx4_enable_r[4:0], cx4_enable_w};
|
always @(posedge CLK) cx4_enable_r <= {cx4_enable_r[4:0], cx4_enable_w};
|
||||||
assign cx4_enable = &cx4_enable_r[5:2];
|
assign cx4_enable = &cx4_enable_r[5:2];
|
||||||
|
|
||||||
|
assign cx4_vect_enable = &SNES_ADDR[15:5];
|
||||||
endmodule
|
endmodule
|
||||||
|
|||||||
@ -23,6 +23,7 @@ module cx4(
|
|||||||
output [7:0] DO,
|
output [7:0] DO,
|
||||||
input [12:0] ADDR,
|
input [12:0] ADDR,
|
||||||
input CS,
|
input CS,
|
||||||
|
input SNES_VECT_EN,
|
||||||
input nRD,
|
input nRD,
|
||||||
input nWR,
|
input nWR,
|
||||||
input CLK,
|
input CLK,
|
||||||
@ -44,7 +45,7 @@ parameter BUSY_CPU = 2'b10;
|
|||||||
wire datram_enable = CS & (ADDR[11:0] < 12'hc00);
|
wire datram_enable = CS & (ADDR[11:0] < 12'hc00);
|
||||||
wire mmio_enable = CS & (ADDR[12:5] == 8'b11111010) & (ADDR[4:0] < 5'b10011);
|
wire mmio_enable = CS & (ADDR[12:5] == 8'b11111010) & (ADDR[4:0] < 5'b10011);
|
||||||
wire status_enable = CS & (ADDR[12:5] == 8'b11111010) & (ADDR[4:0] >= 5'b10011);
|
wire status_enable = CS & (ADDR[12:5] == 8'b11111010) & (ADDR[4:0] >= 5'b10011);
|
||||||
wire vector_enable = CS & (ADDR[12:5] == 8'b11111011);
|
wire vector_enable = (CS & (ADDR[12:5] == 8'b11111011)) | (cx4_active & SNES_VECT_EN);
|
||||||
wire gpr_enable = CS & (&(ADDR[12:7]) && ADDR[5:4] != 2'b11);
|
wire gpr_enable = CS & (&(ADDR[12:7]) && ADDR[5:4] != 2'b11);
|
||||||
wire pgmrom_enable = CS & (ADDR[12:5] == 8'b11110000);
|
wire pgmrom_enable = CS & (ADDR[12:5] == 8'b11110000);
|
||||||
|
|
||||||
|
|||||||
@ -268,6 +268,7 @@ address snes_addr(
|
|||||||
.CLK(CLK2),
|
.CLK(CLK2),
|
||||||
.MAPPER(MAPPER),
|
.MAPPER(MAPPER),
|
||||||
.SNES_ADDR(SNES_ADDR), // requested address from SNES
|
.SNES_ADDR(SNES_ADDR), // requested address from SNES
|
||||||
|
.SNES_CS(SNES_CS),
|
||||||
.ROM_ADDR(MAPPED_SNES_ADDR), // Address to request from SRAM (active low)
|
.ROM_ADDR(MAPPED_SNES_ADDR), // Address to request from SRAM (active low)
|
||||||
.ROM_SEL(ROM_SEL), // which SRAM unit to access
|
.ROM_SEL(ROM_SEL), // which SRAM unit to access
|
||||||
.IS_SAVERAM(IS_SAVERAM),
|
.IS_SAVERAM(IS_SAVERAM),
|
||||||
@ -279,7 +280,8 @@ address snes_addr(
|
|||||||
//MSU-1
|
//MSU-1
|
||||||
.msu_enable(msu_enable),
|
.msu_enable(msu_enable),
|
||||||
//CX4
|
//CX4
|
||||||
.cx4_enable(cx4_enable)
|
.cx4_enable(cx4_enable),
|
||||||
|
.cx4_vect_enable(cx4_vect_enable)
|
||||||
);
|
);
|
||||||
|
|
||||||
reg [7:0] CX4_DINr;
|
reg [7:0] CX4_DINr;
|
||||||
@ -290,6 +292,7 @@ cx4 snes_cx4 (
|
|||||||
.DO(CX4_SNES_DATA_OUT),
|
.DO(CX4_SNES_DATA_OUT),
|
||||||
.ADDR(SNES_ADDR[12:0]),
|
.ADDR(SNES_ADDR[12:0]),
|
||||||
.CS(cx4_enable),
|
.CS(cx4_enable),
|
||||||
|
.SNES_VECT_EN(cx4_vect_enable),
|
||||||
.nRD(SNES_READ),
|
.nRD(SNES_READ),
|
||||||
.nWR(SNES_WRITE),
|
.nWR(SNES_WRITE),
|
||||||
.CLK(CLK2),
|
.CLK(CLK2),
|
||||||
@ -344,9 +347,12 @@ assign CX4_SNES_DATA_IN = SNES_DATA;
|
|||||||
reg [7:0] SNES_DINr;
|
reg [7:0] SNES_DINr;
|
||||||
reg [7:0] ROM_DOUTr;
|
reg [7:0] ROM_DOUTr;
|
||||||
|
|
||||||
assign SNES_DATA = (!SNES_READ) ? (msu_enable ? MSU_SNES_DATA_OUT
|
assign SNES_DATA = (!SNES_READ)
|
||||||
|
? (msu_enable ? MSU_SNES_DATA_OUT
|
||||||
:cx4_enable ? CX4_SNES_DATA_OUT
|
:cx4_enable ? CX4_SNES_DATA_OUT
|
||||||
:SNES_DINr /*(ROM_ADDR0 ? ROM_DATA[7:0] : ROM_DATA[15:8])*/) : 8'bZ;
|
:(cx4_active & cx4_vect_enable) ? CX4_SNES_DATA_OUT
|
||||||
|
: SNES_DINr)
|
||||||
|
: 8'bZ;
|
||||||
|
|
||||||
reg [3:0] ST_MEM_DELAYr;
|
reg [3:0] ST_MEM_DELAYr;
|
||||||
reg MCU_RD_PENDr;
|
reg MCU_RD_PENDr;
|
||||||
@ -559,8 +565,8 @@ assign ROM_BLE = !ROM_WE ? !ROM_ADDR0 : 1'b0;
|
|||||||
|
|
||||||
assign SNES_DATABUS_OE = msu_enable ? 1'b0 :
|
assign SNES_DATABUS_OE = msu_enable ? 1'b0 :
|
||||||
cx4_enable ? 1'b0 :
|
cx4_enable ? 1'b0 :
|
||||||
((IS_ROM & SNES_CS)
|
(cx4_active & cx4_vect_enable) ? 1'b0 :
|
||||||
|(!IS_ROM & !IS_SAVERAM & !IS_WRITABLE)
|
((!IS_ROM & !IS_SAVERAM & !IS_WRITABLE)
|
||||||
|(SNES_READ & SNES_WRITE)
|
|(SNES_READ & SNES_WRITE)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user