diff options
author | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2021-06-05 21:48:19 +0300 |
---|---|---|
committer | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2021-06-05 21:48:19 +0300 |
commit | d3416837069454051fdf2c932a9664d8d3ad4fcc (patch) | |
tree | 95b219e7f5aaab3d91f808a187abdb75dc4514e5 | |
parent | d408fb05281baa5874380f716217fb0f66bf27cd (diff) |
Experimental software reset feature, refactoring
-rw-r--r-- | CoolGirl_config.vh | 5 | ||||
-rw-r--r-- | CoolGirl_mappers.vh | 114 |
2 files changed, 94 insertions, 25 deletions
diff --git a/CoolGirl_config.vh b/CoolGirl_config.vh index 3c130c8..b6d585f 100644 --- a/CoolGirl_config.vh +++ b/CoolGirl_config.vh @@ -44,4 +44,7 @@ parameter ENABLE_MAPPER_AC08 = 0, // mapper AC-08: Green Beret FDS co parameter ENABLE_FOUR_SCREEN = 1, // Enable four-screen support, required by some games parameter UxROM_BITSIZE = 4, // Maximum size for UxROM PRG (3=256KB - standard size, 4=512KB - required for some hacks/homebrew) parameter AxROM_BxROM_BITSIZE = 3, // Maximum size for AxROM/BxROM PRG (2=256KB - standard size, 3=512KB - required for some hacks/homebrew) -parameter MMC3_BITSIZE = 8 // Maximum size for MMC3 PRG (6=512KB - standard size, 8=2MB - required for some hacks/homebrew) +parameter MMC3_BITSIZE = 8, // Maximum size for MMC3 PRG (6=512KB - standard size, 8=2MB - required for some hacks/homebrew) + +parameter RESET_COMBINATION = 8'h24, +parameter RESET_COMBINATION_TIMER_SIZE = 0
\ No newline at end of file diff --git a/CoolGirl_mappers.vh b/CoolGirl_mappers.vh index 5e1721c..6c9faa8 100644 --- a/CoolGirl_mappers.vh +++ b/CoolGirl_mappers.vh @@ -26,6 +26,8 @@ reg prg_write_enabled = 0; reg [1:0] mirroring = 0; reg four_screen = 0; reg lockout = 0; +reg [8:0] controller_data = 0; +reg [1:0] reset_state = 0; // Multiplier reg [7:0] mul1 = 0; @@ -141,23 +143,37 @@ wire vrc_2b_low = cpu_addr_in[0] | cpu_addr_in[2] | cpu_addr_in[4] | cpu_addr_in wire cpu_data_out_enabled; wire [7:0] cpu_data_out; assign {cpu_data_out_enabled, cpu_data_out} = - (m2 & romsel & cpu_rw_in) ? - ( - ((mapper == 0) && (cpu_addr_in[14:12] == 3'b101)) ? {8'b10000000, new_dendy} : // $5000 - $5FFF - new dendy flag - (ENABLE_MAPPER_163 && (mapper == 6'b000110) && ({cpu_addr_in[14:12],cpu_addr_in[10:8]} == 6'b101001)) ? - {1'b1, mapper163_r2 | mapper163_r0 | mapper163_r1 | ~mapper163_r3} : - (ENABLE_MAPPER_163 && (mapper == 6'b000110) && ({cpu_addr_in[14:12],cpu_addr_in[10:8]} == 6'b101101)) ? - {1'b1, mapper163_r5[0] ? mapper163_r2 : mapper163_r1} : - (ENABLE_MAPPER_005 && (mapper == 6'b001111) && (cpu_addr_in[14:0] == 15'h5204)) ? - {1'b1, mmc5_irq_out, ~new_screen, 6'b000000} : - (ENABLE_MAPPER_036 && mapper == 6'b011101 && {cpu_addr_in[14:13], cpu_addr_in[8]} == 3'b101) ? // Need by Strike Wolf, being simplified mapper, this cart still uses some TCX mapper features andrely on it - {1'b1, 2'b00, prg_bank_a[3:2], 4'b00} : - (ENABLE_MAPPER_083 && mapper == 6'b100011 && {cpu_addr_in[14:12]} == 3'b101) ? // $5000 - DIP switches
- {1'b1, 6'b000000, flags[1:0]} :
- (ENABLE_MAPPER_090_MULTIPLIER && (mapper == 6'b001101) && (cpu_addr_in[14:0] == 15'h5800)) ? {1'b1, mul[7:0]} : - (ENABLE_MAPPER_090_MULTIPLIER && (mapper == 6'b001101) && (cpu_addr_in[14:0] == 15'h5801)) ? {1'b1, mul[15:8]} :
- 9'b000000000 - ): 9'b000000000; + (cpu_rw_in && m2) ? // reading? + ((RESET_COMBINATION != 0) && (reset_state != 0)) ? // resetting? + ( + // jmp [$FFFC] + reset_state == 1 ? + {1'b1, 8'h6C} + : reset_state == 2 ? + {1'b1, 8'hFC} + : + {1'b1, 8'hFF} + ) + : ( // not resetting + romsel ? // reading $0000-$7FFF? + ( + ((mapper == 0) && (cpu_addr_in[14:12] == 3'b101)) ? {8'b10000000, new_dendy} : // $5000 - $5FFF - new dendy flag + (ENABLE_MAPPER_163 && (mapper == 6'b000110) && ({cpu_addr_in[14:12],cpu_addr_in[10:8]} == 6'b101001)) ? + {1'b1, mapper163_r2 | mapper163_r0 | mapper163_r1 | ~mapper163_r3} : + (ENABLE_MAPPER_163 && (mapper == 6'b000110) && ({cpu_addr_in[14:12],cpu_addr_in[10:8]} == 6'b101101)) ? + {1'b1, mapper163_r5[0] ? mapper163_r2 : mapper163_r1} : + (ENABLE_MAPPER_005 && (mapper == 6'b001111) && (cpu_addr_in[14:0] == 15'h5204)) ? + {1'b1, mmc5_irq_out, ~new_screen, 6'b000000} : + (ENABLE_MAPPER_036 && mapper == 6'b011101 && {cpu_addr_in[14:13], cpu_addr_in[8]} == 3'b101) ? // Need by Strike Wolf, being simplified mapper, this cart still uses some TCX mapper features andrely on it + {1'b1, 2'b00, prg_bank_a[3:2], 4'b00} : + (ENABLE_MAPPER_083 && mapper == 6'b100011 && {cpu_addr_in[14:12]} == 3'b101) ? // $5000 - DIP switches
+ {1'b1, 6'b000000, flags[1:0]} :
+ (ENABLE_MAPPER_090_MULTIPLIER && (mapper == 6'b001101) && (cpu_addr_in[14:0] == 15'h5800)) ? {1'b1, mul[7:0]} : + (ENABLE_MAPPER_090_MULTIPLIER && (mapper == 6'b001101) && (cpu_addr_in[14:0] == 15'h5801)) ? {1'b1, mul[15:8]} :
+ 9'b00000000 + ): 9'b00000000 + ) + : 9'b00000000; // Mirroring: 00=vertical, 01=horizontal, 10=1Sa, 11=1Sb assign ppu_ciram_a10 = (ENABLE_MAPPER_118 & (mapper == 6'b010100) & flags[0]) ? chr_addr_mapped[17] : @@ -368,9 +384,54 @@ begin if (cpu_rw_in == 1) // read begin + // block two writes in a row (RMW) for games like Snow Bros. and Bill & Ted's Excellent Adventure + // also you can remove this check and just patch those games, lol writed <= 0; - // block two writes in a row (RMW) for games like Snow Bros. and Bill & Ted's Excellent Adventure - // also you can remove this check and just patch those games, lol + + if ((RESET_COMBINATION != 0) && (reset_state != 0)) + begin + // increase reset state after each read + reset_state = reset_state + 1'b1; + end + + // Reading controller + if ((RESET_COMBINATION != 0) && (cpu_addr_in == 15'h4016) && lockout) + begin + controller_data[8:0] = {controller_data[7:0], cpu_data_in[0]}; + if (controller_data[8:0] == {1'b1, RESET_COMBINATION}) + begin + // Reset combination pressed. Reset! + prg_base <= 0; + prg_mask <= 7'b1111000; + chr_mask <= 0; + prg_mode <= 0; + map_rom_on_6000 <= 0; + prg_bank_6000 <= 0; + prg_bank_a <= 0; + prg_bank_b <= 1; + prg_bank_c <= 8'b11111110; + prg_bank_d <= 8'b11111111; + chr_mode <= 0; + chr_bank_a <= 0; + chr_bank_b <= 1; + chr_bank_c <= 2; + chr_bank_d <= 3; + chr_bank_e <= 4; + chr_bank_f <= 5; + chr_bank_g <= 6; + chr_bank_h <= 7; + mapper <= 0; + flags <= 0; + sram_enabled <= 0; + sram_page <= 0; + chr_write_enabled <= 0; + prg_write_enabled <= 0; + mirroring <= 0; + four_screen <= 0; + lockout <= 0; + reset_state = 1; + end + end end else if (cpu_rw_in == 0 && !writed) // write begin writed <= 1; @@ -402,6 +463,11 @@ begin if (ENABLE_MAPPER_065 && mapper == 6'b001110) prg_bank_b <= 1; end + if ((RESET_COMBINATION != 0) && (cpu_addr_in == 15'h4016)) + begin + controller_data = 1; + end + // Mapper #163 if (ENABLE_MAPPER_163 && (mapper == 6'b000110)) begin @@ -998,11 +1064,11 @@ begin 3'b100: prg_bank_6000[3:0] <= cpu_data_in[3:0]; // $E000, PRG Reg (8k @ $6000) 3'b101: mirroring <= {1'b0, cpu_data_in[3]}; // Mirroring 3'b110: if (ENABLE_MAPPER_042_INTERRUPTS) begin - mapper42_irq_enabled <= cpu_data_in[1]; - if (!mapper42_irq_enabled) begin - mapper42_irq_value <= 0; - end - end + mapper42_irq_enabled <= cpu_data_in[1]; + if (!mapper42_irq_enabled) begin + mapper42_irq_value <= 0; + end + end endcase end |