Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion mappers/004/chip_mmc3.sv
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ module chip_mmc3(
input cpu_m3,

input SSTBus sst,
output [7:0]sst_di
output [7:0]sst_di,
output [2:0]block_sel
);

assign sst_di[7:0] =
Expand Down Expand Up @@ -64,6 +65,8 @@ module chip_mmc3(
ppu_addr[11:10] == 2 ? r8001[4][7:0] :
r8001[5][7:0];

assign block_sel[2:0] = rA001[2:0];

wire [3:0]reg_addr = {!cpu_ce_n, cpu_a14, cpu_a13, cpu_a0};

wire prg_mod = r8000[6];
Expand Down
3 changes: 2 additions & 1 deletion mappers/004/map_004.sv
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,8 @@ module map_004(//MMC3
.cpu_m3(cpu.m3),

.sst(sst),
.sst_di(sst_di)
.sst_di(sst_di),
.block_sel()
);


Expand Down
126 changes: 126 additions & 0 deletions mappers/004/map_044.sv

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file is a very minor copy-paste change of map_004.sv.

Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@

module map_044( // MMC3 pirate multicart

input MapIn mai,
output MapOut mao
);
//************************************************************* base header
CpuBus cpu;
PpuBus ppu;
SysCfg cfg;
SSTBus sst;
assign cpu = mai.cpu;
assign ppu = mai.ppu;
assign cfg = mai.cfg;
assign sst = mai.sst;

MemCtrl prg;
MemCtrl chr;
MemCtrl srm;
assign mao.prg = prg;
assign mao.chr = chr;
assign mao.srm = srm;

assign prg.dati = cpu.data;
assign chr.dati = ppu.data;
assign srm.dati = cpu.data;

wire int_cpu_oe;
wire int_ppu_oe;
wire [7:0]int_cpu_data;
wire [7:0]int_ppu_data;

assign mao.map_cpu_oe = int_cpu_oe | (srm.ce & srm.oe) | (prg.ce & prg.oe);
assign mao.map_cpu_do = int_cpu_oe ? int_cpu_data : srm.ce ? mai.srm_do : mai.prg_do;

assign mao.map_ppu_oe = int_ppu_oe | (chr.ce & chr.oe);
assign mao.map_ppu_do = int_ppu_oe ? int_ppu_data : mai.chr_do;
//************************************************************* configuration
assign mao.prg_mask_off = 0;
assign mao.chr_mask_off = 0;
assign mao.srm_mask_off = 0;
assign mao.mir_4sc = 1;//enable support for 4-screen mirroring. for activation should be enabled in cfg.mir_4 also
assign mao.bus_cf = 0;//bus conflicts
//************************************************************* save state regs read
assign mao.sst_di[7:0] =
sst.addr[7:0] < 127 ? sst_di :
sst.addr[7:0] == 127 ? cfg.map_idx : 8'hff;
//************************************************************* mapper-controlled pins
assign srm.ce = ram_ce;
assign srm.oe = cpu.rw;
assign srm.we = !ram_we_n;
assign srm.addr[12:0] = cpu.addr[12:0];

assign prg.ce = !prg_ce_n;
assign prg.oe = cpu.rw;
assign prg.we = 0;
assign prg.addr[12:0] = cpu.addr[12:0];
assign prg.addr[16:13] = prg_addr[16:13];
assign prg.addr[17] =
block_sel[2:1] == 3 ? prg_addr[17] : block_sel[0];
assign prg.addr[19:18] = block_sel[2:1];

assign chr.ce = mao.ciram_ce;
assign chr.oe = !ppu.oe;
assign chr.we = 0;
assign chr.addr[9:0] = ppu.addr[9:0];
assign chr.addr[16:10] = chr_addr[16:10];
assign chr.addr[17] =
block_sel[2:1] == 3 ? chr_addr[17] : block_sel[0];
assign chr.addr[19:18] = block_sel[2:1];

//A10-Vmir, A11-Hmir
assign mao.ciram_a10 = ciram_a10;
assign mao.ciram_ce = !ppu.addr[13];

assign mao.irq = !irq_n;
//************************************************************* mapper implementation below

wire irq_n;
wire ciram_a10;
wire ram_ce;
wire ram_ce_n;
wire ram_we_n;
wire prg_ce_n;
wire [20:13]prg_addr;
wire [17:10]chr_addr;
wire [2:0]block_sel;

wire [7:0]sst_di;

chip_mmc3 mmc3_inst(

.cpu_data(cpu.data[7:0]),
.cpu_a14(cpu.addr[14]),
.cpu_a13(cpu.addr[13]),
.cpu_a0(cpu.addr[0]),
.cpu_ce_n(!cpu.addr[15]),
.cpu_rw(cpu.rw),
.cpu_m2(cpu.m2),
.ppu_addr(ppu.addr[12:10]),

.irq_n(irq_n),
.ciram_a10(ciram_a10),
.ram_ce(ram_ce),
.ram_ce_n(ram_ce_n),
.ram_we_n(ram_we_n),
.prg_ce_n(prg_ce_n),
.prg_addr(prg_addr),
.chr_addr(chr_addr),

.clk(mai.clk),
.rst(mai.map_rst),
.map_sub(mai.cfg.map_sub),
.mir_h(cfg.mir_h),
.cpu_m3(cpu.m3),

.sst(sst),
.sst_di(sst_di),
.block_sel(block_sel)
);



endmodule


4 changes: 4 additions & 0 deletions mappers/004/map_hub.sv
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ module map_hub(
mai.cfg.map_idx == 4 ? map_out_004 :
mai.cfg.map_idx == 9 ? map_out_009 :
mai.cfg.map_idx == 10 ? map_out_009 :
mai.cfg.map_idx == 44 ? map_out_044 :
mai.cfg.map_idx == 155 ? map_out_001 :
map_out_nom;

Expand All @@ -35,4 +36,7 @@ module map_hub(
MapOut map_out_009;
map_009 m009(mai, map_out_009);

MapOut map_out_044;
map_044 m044(mai, map_out_044);

endmodule
Binary file modified mappers/004/output_files/top.rbf
Binary file not shown.
1 change: 1 addition & 0 deletions mappers/004/top.qsf
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ set_global_assignment -name SYSTEMVERILOG_FILE map_004.sv
set_global_assignment -name SYSTEMVERILOG_FILE map_004_s1.sv
set_global_assignment -name SYSTEMVERILOG_FILE map_004_s3.sv
set_global_assignment -name SYSTEMVERILOG_FILE map_009.sv
set_global_assignment -name SYSTEMVERILOG_FILE map_044.sv
set_global_assignment -name SYSTEMVERILOG_FILE chip_mmc1.sv
set_global_assignment -name SYSTEMVERILOG_FILE chip_mmc3.sv
set_global_assignment -name SYSTEMVERILOG_FILE irq_mmc3.sv
Expand Down