Skip to content

Commit 7d215a5

Browse files
committed
fix (#5): Initialize save RAM to 0
1 parent bd86beb commit 7d215a5

5 files changed

Lines changed: 690 additions & 652 deletions

File tree

dist/Cores/agg23.NES/data.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"name": "Save",
1414
"id": 10,
1515
"required": false,
16-
"parameters": "0xA4",
16+
"parameters": "0x84",
1717
"nonvolatile": true,
1818
"extensions": ["sav", "srm"],
1919
"address": "0x20000000",

src/fpga/apf/build_id.mif

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ DATA_RADIX = HEX;
99
CONTENT
1010
BEGIN
1111

12-
0E0 : 20221205;
13-
0E1 : 00120729;
14-
0E2 : a8474b78;
12+
0E0 : 20221206;
13+
0E1 : 00104039;
14+
0E2 : 63bd292a;
1515

1616
END;

src/fpga/core/core_top.v

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ module core_top (
471471
end else begin
472472
// Write sram size
473473
datatable_wren <= 1;
474-
datatable_data <= has_save ? 32'h40000 : 32'h0;
474+
datatable_data <= has_save ? 32'h40_000 : 32'h0;
475475
// Data slot index 1, not id 1
476476
datatable_addr <= 1 * 2 + 1;
477477
end
@@ -665,6 +665,8 @@ module core_top (
665665
reg [7:0] lightgun_dpad_aim_speed;
666666
reg swap_controllers;
667667

668+
wire ioctl_download_s;
669+
668670
wire hide_overscan_s;
669671
wire [1:0] mask_vid_edges_s;
670672
wire allow_extra_sprites_s;
@@ -677,9 +679,10 @@ module core_top (
677679
wire swap_controllers_s;
678680

679681
synch_3 #(
680-
.WIDTH(19)
682+
.WIDTH(20)
681683
) settings_s (
682684
{
685+
ioctl_download,
683686
hide_overscan,
684687
mask_vid_edges,
685688
allow_extra_sprites,
@@ -691,6 +694,7 @@ module core_top (
691694
swap_controllers
692695
},
693696
{
697+
ioctl_download_s,
694698
hide_overscan_s,
695699
mask_vid_edges_s,
696700
allow_extra_sprites_s,
@@ -769,7 +773,7 @@ module core_top (
769773
// APF
770774
.ioctl_wr(ioctl_wr),
771775
.ioctl_dout(ioctl_dout),
772-
.ioctl_download(ioctl_download),
776+
.ioctl_download(ioctl_download_s),
773777

774778
// Save data
775779
.has_save(has_save),

src/fpga/core/rtl/mister_top/main.sv

Lines changed: 64 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ module MAIN_NES (
463463
// ;
464464
// end
465465

466-
wire reset_nes = ~init_reset_n || download_reset || loader_fail || hold_reset || external_reset;
466+
wire reset_nes = ~init_reset_n || download_reset || loader_fail || hold_reset || external_reset || clearing_ram;
467467
// arm_reset || bk_loading || bk_loading_req || (old_sys_type != status[24:23]);
468468

469469
// reg [1:0] old_sys_type;
@@ -555,8 +555,8 @@ module MAIN_NES (
555555

556556
// reserved for backup ram save/load
557557
.ch2_addr(ch2_addr),
558-
.ch2_wr (ch2_wr),
559-
.ch2_din (ch2_din),
558+
.ch2_wr (clearing_ram ? clear_wr : ch2_wr),
559+
.ch2_din (clearing_ram ? 0 : ch2_din),
560560
.ch2_rd (ch2_rd),
561561
.ch2_dout(save_dout),
562562
.ch2_busy(save_busy),
@@ -583,12 +583,55 @@ module MAIN_NES (
583583
wire [7:0] save_dout;
584584
assign sd_buff_din = bram_en ? eeprom_dout : save_dout;
585585

586+
reg did_load_save = 0;
587+
reg clearing_ram = 0;
588+
reg [17:0] clear_ram_addr = 0;
589+
reg [3:0] clear_div = 0;
590+
reg clear_wr = 0;
591+
592+
reg prev_ioctl_download = 0;
593+
594+
always @(posedge clk_85_9) begin
595+
prev_ioctl_download <= ioctl_download;
596+
597+
if (sd_buff_wr) begin
598+
// Save has been loaded, don't clear save RAM
599+
did_load_save <= 1;
600+
end
601+
602+
if (prev_ioctl_download && ~ioctl_download && ~did_load_save) begin
603+
// All assets have been loaded and no save was loaded
604+
clearing_ram <= 1;
605+
end
606+
607+
if (clearing_ram) begin
608+
if (clear_div > 0) begin
609+
clear_div <= clear_div - 1;
610+
end else begin
611+
clear_wr <= 0;
612+
end
613+
614+
if (~clear_wr && ~save_busy) begin
615+
if (&clear_ram_addr) begin
616+
// Finished clearing RAM
617+
clearing_ram <= 0;
618+
end else begin
619+
// Move to next address and write
620+
clear_wr <= 1;
621+
clear_div <= 15;
622+
623+
clear_ram_addr <= clear_ram_addr + 1;
624+
end
625+
end
626+
end
627+
end
628+
586629
wire [7:0] eeprom_dout;
587630
dpram #(" ", 11) save_ram (
588631
.clock_a(clk_85_9),
589-
.address_a(bram_addr),
590-
.data_a(bram_dout),
591-
.wren_a(bram_write),
632+
.address_a(clearing_ram ? clear_ram_addr : bram_addr),
633+
.data_a(clearing_ram ? 0 : bram_dout),
634+
.wren_a(clearing_ram ? clear_wr : bram_write),
592635
.q_a(bram_din),
593636

594637
.clock_b(clk_ppu_21_47),
@@ -598,28 +641,28 @@ module MAIN_NES (
598641
.q_b(eeprom_dout)
599642
);
600643

601-
wire [17:0] save_addr = sd_buff_addr;
644+
wire [17:0] save_addr = clearing_ram ? clear_ram_addr : sd_buff_addr;
602645

603646
///////////////////////////// savestates /////////////////////////////////
604647

605-
wire [24:0] Savestate_SDRAMAddr;
606-
wire Savestate_SDRAMRdEn;
607-
wire Savestate_SDRAMWrEn;
608-
wire [ 7:0] Savestate_SDRAMWriteData;
609-
wire [ 7:0] Savestate_SDRAMReadData;
648+
wire [24:0] Savestate_SDRAMAddr;
649+
wire Savestate_SDRAMRdEn;
650+
wire Savestate_SDRAMWrEn;
651+
wire [ 7:0] Savestate_SDRAMWriteData;
652+
wire [ 7:0] Savestate_SDRAMReadData;
610653

611-
wire [63:0] SaveStateBus_Din;
612-
wire [ 9:0] SaveStateBus_Adr;
613-
wire SaveStateBus_wren;
614-
wire SaveStateBus_rst;
615-
wire [63:0] SaveStateBus_Dout;
616-
wire savestate_load;
654+
wire [63:0] SaveStateBus_Din;
655+
wire [ 9:0] SaveStateBus_Adr;
656+
wire SaveStateBus_wren;
657+
wire SaveStateBus_rst;
658+
wire [63:0] SaveStateBus_Dout;
659+
wire savestate_load;
617660

618661
wire [15:0] sdram_ss_in = SS_Ext[15:0];
619-
wire [15:0] sdram_ss_out;
662+
wire [15:0] sdram_ss_out;
620663

621-
wire [63:0] SS_Ext;
622-
wire [63:0] SS_Ext_BACK;
664+
wire [63:0] SS_Ext;
665+
wire [63:0] SS_Ext_BACK;
623666
eReg_SavestateV #(SSREG_INDEX_EXT, SSREG_DEFAULT_EXT) iREG_SAVESTATE_Ext (
624667
clk_ppu_21_47,
625668
SaveStateBus_Din,

0 commit comments

Comments
 (0)