Files
Gameboy_MiSTer/rtl/mappers/misc.v

86 lines
2.1 KiB
Verilog

module misc_mapper (
input enable,
input clk_sys,
input ce_cpu,
input mapper_sel, // 0: Wisdom Tree, 1: Mani DMG-601
input savestate_load,
input [15:0] savestate_data,
inout [15:0] savestate_back_b,
input [8:0] rom_mask,
input [14:0] cart_addr,
input cart_a15,
input cart_wr,
input [7:0] cart_di,
input [7:0] cram_di,
inout [7:0] cram_do_b,
inout [16:0] cram_addr_b,
inout [22:0] mbc_addr_b,
inout ram_enabled_b,
inout has_battery_b
);
wire [22:0] mbc_addr;
wire ram_enabled;
wire [7:0] cram_do;
wire [16:0] cram_addr;
wire has_battery;
wire [15:0] savestate_back;
assign mbc_addr_b = enable ? mbc_addr : 23'hZ;
assign cram_do_b = enable ? cram_do : 8'hZ;
assign cram_addr_b = enable ? cram_addr : 17'hZ;
assign ram_enabled_b = enable ? ram_enabled : 1'hZ;
assign has_battery_b = enable ? has_battery : 1'hZ;
assign savestate_back_b = enable ? savestate_back : 16'hZ;
// --------------------- CPU register interface ------------------
reg [7:0] rom_bank_reg;
reg map_disable;
assign savestate_back[ 7: 0] = rom_bank_reg;
assign savestate_back[ 8] = map_disable;
assign savestate_back[15: 9] = 0;
always @(posedge clk_sys) begin
if(savestate_load & enable) begin
rom_bank_reg <= savestate_data[ 7: 0]; //8'd0;
map_disable <= savestate_data[ 8]; //1'b0;
end else if(~enable) begin
rom_bank_reg <= 8'd0;
map_disable <= 1'b0;
end else if(ce_cpu) begin
if (cart_wr & ~cart_a15) begin
if (mapper_sel) begin
// Mani DMG-601
if (~map_disable) begin
rom_bank_reg <= { 5'd0, cart_di[2:0] };
map_disable <= 1'b1;
end
end else begin
// Wisdom Tree
rom_bank_reg <= cart_addr[7:0];
end
end
end
end
// mask address lines to enable proper mirroring
wire [7:0] rom_bank = rom_bank_reg & rom_mask[8:1];
assign mbc_addr = { rom_bank, cart_addr[14:0] };
assign cram_do = 8'hFF;
assign cram_addr = { 4'b0000, cart_addr[12:0] };
assign ram_enabled = 0;
assign has_battery = 0;
endmodule