@@ -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