diff options
author | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2016-06-06 21:12:52 +0300 |
---|---|---|
committer | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2016-06-06 21:12:52 +0300 |
commit | 03e8814d1cda3239bd5077d7328be337a130df5b (patch) | |
tree | 11c5e639a928b23b3b4e37d85d534769daab8162 | |
parent | 1228909ec142991dece1102cd3b3f252f128a714 (diff) |
Some fixes, new mapper
-rw-r--r-- | CoolGirl.v | 35 | ||||
-rw-r--r-- | mappers.vh | 200 |
2 files changed, 127 insertions, 108 deletions
@@ -1,23 +1,24 @@ module CoolGirl # ( - parameter USE_MAPPER_009_010 = 1, // mapper #9 - MMC2, #10 - MMC4 - parameter USE_MAPPER_011 = 1, // mapper #11 - Color Dreams - parameter USE_MAPPER_018 = 1, // mapper #18 - parameter USE_MAPPER_021_022_023_025 = 1, // mappers #21, #22, #23, #25 - VRC2, VRC4 - parameter USE_MAPPER_022 = 1, // mapper #22 - VRC2a (shifted CHR lines) + parameter USE_MAPPER_009_010 = 1, // mapper #009 - MMC2, #10 - MMC4 + parameter USE_MAPPER_011 = 1, // mapper #011 - Color Dreams + parameter USE_MAPPER_018 = 1, // mapper #018 + parameter USE_MAPPER_021_022_023_025 = 1, // mappers #021, #022, #023, #025 - VRC2, VRC4 + parameter USE_MAPPER_022 = 1, // mapper #022 - VRC2a (shifted CHR lines) parameter USE_VRC4_INTERRUPTS = 1, // for VRC4 - parameter USE_MAPPER_032 = 1, // mapper #32 - IREM-G101 - parameter USE_MAPPER_033_048 = 1, // mappers #33 & #48 - Taito - parameter USE_MAPPER_048_INTERRUPTS = 1, // mapper #48 - Taito - parameter USE_MAPPER_066 = 1, // mapper #66 - GxROM - parameter USE_MAPPER_069 = 1, // mapper #69 - Sunsoft - parameter USE_MAPPER_071 = 1, // mapper #71 (for Fire Hawk only) - parameter USE_MAPPER_078 = 1, // mapper #78 - Holy Diver - parameter USE_MAPPER_087 = 1, // mapper #87 - parameter USE_MAPPER_090 = 1, // mapper #90 - JY, for Aladdin only - parameter USE_MAPPER_093 = 1, // mapper #93 - parameter USE_MAPPER_097 = 1, // mapper #97 - IREM TAMS1 + parameter USE_MAPPER_032 = 1, // mapper #032 - IREM-G101 + parameter USE_MAPPER_033_048 = 1, // mappers #033 & #048 - Taito + parameter USE_MAPPER_048_INTERRUPTS = 1, // mapper #048 - Taito + parameter USE_MAPPER_065 = 1, // mapper #065 - Irem's H3001 + parameter USE_MAPPER_066 = 1, // mapper #066 - GxROM + parameter USE_MAPPER_069 = 1, // mapper #069 - Sunsoft + parameter USE_MAPPER_071 = 1, // mapper #071 (for Fire Hawk only) + parameter USE_MAPPER_078 = 1, // mapper #078 - Holy Diver + parameter USE_MAPPER_087 = 1, // mapper #087 + parameter USE_MAPPER_090 = 1, // mapper #090 - JY, for Aladdin only + parameter USE_MAPPER_093 = 1, // mapper #093 + parameter USE_MAPPER_097 = 1, // mapper #097 - IREM TAMS1 parameter USE_MAPPER_118 = 1, // mapper #118 - TxSROM - parameter USE_MAPPER_163 = 1, // mapper #163 + parameter USE_MAPPER_163 = 0, // mapper #163 parameter USE_MAPPER_189 = 1, // mapper #189 parameter USE_MAPPER_228 = 1 // mapper #228 - Cheetahmen II only ) @@ -5,7 +5,7 @@ reg map_rom_on_6000 = 0; reg [7:0] prg_bank_6000 = 0; reg [7:0] prg_bank_a = 0; - reg [7:0] prg_bank_b = 6'b111101; + reg [7:0] prg_bank_b = 1; reg [7:0] prg_bank_c = 6'b111110; reg [7:0] prg_bank_d = 6'b111111; reg [2:0] chr_mode = 0; @@ -161,26 +161,84 @@ ); assign irq = (irq_scanline_out | irq_cpu_out) ? 1'b0 : 1'bZ; - - /* - reg romsel_alt = 1; - reg romsel_alt_clean = 0; - - always @ (*) - begin - if (~romsel) - romsel_alt = 0; - else if (romsel_alt_clean) - romsel_alt = 1; - end - */ // for VRC wire vrc_2b_hi = cpu_addr_in[1] | cpu_addr_in[3] | cpu_addr_in[5] | cpu_addr_in[7]; wire vrc_2b_low = cpu_addr_in[0] | cpu_addr_in[2] | cpu_addr_in[4] | cpu_addr_in[6]; always @ (negedge m2) - begin + begin + // IRQ for VRC4 + if (USE_MAPPER_021_022_023_025 & USE_VRC4_INTERRUPTS & (mapper == 5'b11000) & (irq_cpu_control[1])) + begin + // Cycle mode without prescaler is not used by any games? It's missed in fceux source code. + if (irq_cpu_control[2]) // cycle mode + begin + irq_cpu_value[7:0] = irq_cpu_value[7:0] + 1'b1; // just count IRQ value + if (irq_cpu_value[7:0] == 0) + begin + irq_cpu_out = 1; + irq_cpu_value[7:0] = irq_cpu_latch[7:0]; + end + end else begin // scanline mode + vrc4_irq_prescaler = vrc4_irq_prescaler + 1'b1; // count prescaler + if ((vrc4_irq_prescaler_counter[1] == 0 && vrc4_irq_prescaler == 114) || (vrc4_irq_prescaler_counter[1] == 1 && vrc4_irq_prescaler == 113)) // 114, 114, 113 + begin + irq_cpu_value[7:0] = irq_cpu_value[7:0] + 1'b1; + vrc4_irq_prescaler = 0; + vrc4_irq_prescaler_counter = vrc4_irq_prescaler_counter + 1'b1; + if (vrc4_irq_prescaler_counter == 2'b11) vrc4_irq_prescaler_counter = 2'b00; + if (irq_cpu_value[7:0] == 0) + begin + irq_cpu_out = 1; + irq_cpu_value[7:0] = irq_cpu_latch[7:0]; + end + end + end + end + + // IRQ for Sunsoft FME-7 + if (USE_MAPPER_069 & (mapper == 5'b11001) & (irq_cpu_control[1])) + begin + if ((irq_cpu_value[15:0] == 0) & irq_cpu_control[0]) irq_cpu_out = 1; + irq_cpu_value[15:0] = irq_cpu_value[15:0] - 1'b1; + end + + // Mapper #18 - Sunsoft-2 + if (USE_MAPPER_018 && mapper == 5'b00111) + begin + // Mapper #65 - Irem's H3001 + if (irq_cpu_control[0]) + begin + if (irq_cpu_control[3]) + begin + if (irq_cpu_value[3:0] == 0) irq_cpu_out = 1; + irq_cpu_value[3:0] = irq_cpu_value[3:0] - 1'b1; + end else if (irq_cpu_control[2]) begin + if (irq_cpu_value[7:0] == 0) irq_cpu_out = 1; + irq_cpu_value[7:0] = irq_cpu_value[7:0] - 1'b1; + end else if (irq_cpu_control[1]) begin + if (irq_cpu_value[11:0] == 0) irq_cpu_out = 1; + irq_cpu_value[11:0] = irq_cpu_value[11:0] - 1'b1; + end else begin + if (irq_cpu_value[15:0] == 0) irq_cpu_out = 1; + irq_cpu_value[15:0] = irq_cpu_value[15:0] - 1'b1; + end + end + end + + if (USE_MAPPER_065 && mapper == 5'b01110) + begin + if (irq_cpu_control[0]) + begin + if (irq_cpu_value[15:0] > 0) + begin + irq_cpu_value[15:0] = irq_cpu_value[15:0] - 1; + if (irq_cpu_value[15:0] == 0) irq_cpu_out = 1; + end + end + end + if (cpu_rw_in == 1) // read begin writed = 0; @@ -189,7 +247,7 @@ end else if (cpu_rw_in == 0 && !writed) // write begin writed = 1; - if (romsel /*& romsel_alt*/) // $0000-$7FFF + if (romsel) // $0000-$7FFF begin if ((cpu_addr_in[14:12] == 3'b101) && (lockout == 0)) // $5000-5FFF & lockout is off begin @@ -277,7 +335,6 @@ // temp/test - /* if (mapper == 5'b11111) begin if (cpu_addr_in[14:0] == 15'h4025) @@ -285,16 +342,13 @@ mirroring = {1'b0, cpu_data_in[3]}; end end - */ end else begin // $8000-$FFFF // temp/test - /* if (mapper == 5'b11111) begin prg_bank_6000 = cpu_data_in[4:1] + 4; map_rom_on_6000 = 1; end - */ // Mapper #2 - UxROM // flag0 - mapper #71 - for Fire Hawk only. @@ -417,10 +471,10 @@ if (cpu_addr_in[14:12] == 3'b000) // $800x begin case (cpu_addr_in[1:0]) - 2'b00: prg_bank_a = cpu_data_in; - 2'b01: prg_bank_b = cpu_data_in; - 2'b10: prg_bank_c = cpu_data_in; - 2'b11: prg_bank_d = cpu_data_in; + 2'b00: prg_bank_a[5:0] = cpu_data_in[5:0]; + 2'b01: prg_bank_b[5:0] = cpu_data_in[5:0]; + 2'b10: prg_bank_c[5:0] = cpu_data_in[5:0]; + 2'b11: prg_bank_d[5:0] = cpu_data_in[5:0]; endcase end if (cpu_addr_in[14:12] == 3'b001) // $900x @@ -458,6 +512,35 @@ */ end + // Mapper #65 - Irem's H3001 + if (USE_MAPPER_065 && mapper == 5'b01110) + begin + case ({cpu_addr_in[14:12], cpu_addr_in[2:0]}) + 6'b000000: prg_bank_a[5:0] = cpu_data_in[5:0]; // $8000 + 6'b001001: mirroring = {1'b0, cpu_data_in[0]}; // $9001, mirroring + 6'b001011: begin + irq_cpu_control[0] = cpu_data_in[7]; // $9003, enable IRQ + irq_cpu_out = 0; + end + 6'b001100: begin + irq_cpu_value[15:0] = {r0, r1}; // $9004, IRQ reload + irq_cpu_out = 0; + end + 6'b001101: r0 = cpu_data_in; // $9005, IRQ high value + 6'b001110: r1 = cpu_data_in; // $9006, IRQ low value + 6'b010000: prg_bank_b[5:0] = cpu_data_in[5:0]; // $A000 + 6'b011000: chr_bank_a = cpu_data_in; // $B000 + 6'b011001: chr_bank_b = cpu_data_in; // $B001 + 6'b011010: chr_bank_c = cpu_data_in; // $B002 + 6'b011011: chr_bank_d = cpu_data_in; // $B003 + 6'b011100: chr_bank_e = cpu_data_in; // $B004 + 6'b011101: chr_bank_f = cpu_data_in; // $B005 + 6'b011110: chr_bank_g = cpu_data_in; // $B006 + 6'b011111: chr_bank_h = cpu_data_in; // $B007 + 3'b100000: prg_bank_c[5:0] = cpu_data_in[5:0]; // $C000 + endcase + end + // Mapper #1 - MMC1 /* r0 - load register @@ -568,7 +651,7 @@ 3'b111: if (!USE_MAPPER_189 | ~flags[1]) prg_bank_b[5:0] = cpu_data_in[5:0]; endcase end - 3'b010: mirroring = cpu_data_in[1:0]; // $A000-$BFFE, even (mirroring) + 3'b010: mirroring = {1'b0, cpu_data_in[0]}; // $A000-$BFFE, even (mirroring) 3'b100: irq_scanline_latch = cpu_data_in; // $C000-$DFFE, even (IRQ latch) 3'b101: irq_scanline_reload = 1; // $C001-$DFFF, odd 3'b110: irq_scanline_enabled = 0; // $E000-$FFFE, even @@ -584,7 +667,7 @@ 4'b0000: begin prg_bank_a[5:0] = cpu_data_in[5:0]; // $8000, PRG Reg 0 (8k @ $8000) if (~flags[0]) // #33 - mirroring = cpu_data_in[6]; + mirroring = {1'b0, cpu_data_in[6]}; end 4'b0001: prg_bank_b[5:0] = cpu_data_in[5:0]; // $8001, PRG Reg 1 (8k @ $A000) 4'b0010: chr_bank_a = {cpu_data_in[6:0], 1'b0}; // $8002, CHR Reg 0 (2k @ $0000) @@ -755,71 +838,6 @@ // some IRQ stuff if (irq_scanline_reload_clear) irq_scanline_reload = 0; - - // IRQ for VRC4 - if (USE_MAPPER_021_022_023_025 & USE_VRC4_INTERRUPTS & (mapper == 5'b11000) & (irq_cpu_control[1])) - begin - // Cycle mode without prescaler is not used by any games? It's missed in fceux source code. - if (irq_cpu_control[2]) // cycle mode - begin - irq_cpu_value[7:0] = irq_cpu_value[7:0] + 1'b1; // just count IRQ value - if (irq_cpu_value[7:0] == 0) - begin - irq_cpu_out = 1; - irq_cpu_value[7:0] = irq_cpu_latch[7:0]; - end - end else begin // scanline mode - vrc4_irq_prescaler = vrc4_irq_prescaler + 1'b1; // count prescaler - if ((vrc4_irq_prescaler_counter[1] == 0 && vrc4_irq_prescaler == 114) || (vrc4_irq_prescaler_counter[1] == 1 && vrc4_irq_prescaler == 113)) // 114, 114, 113 - begin - irq_cpu_value[7:0] = irq_cpu_value[7:0] + 1'b1; - vrc4_irq_prescaler = 0; - vrc4_irq_prescaler_counter = vrc4_irq_prescaler_counter + 1'b1; - if (vrc4_irq_prescaler_counter == 2'b11) vrc4_irq_prescaler_counter = 2'b00; - if (irq_cpu_value[7:0] == 0) - begin - irq_cpu_out = 1; - irq_cpu_value[7:0] = irq_cpu_latch[7:0]; - end - end - end - end - - // IRQ for Sunsoft FME-7 - if (USE_MAPPER_069 & (mapper == 5'b11001) & (irq_cpu_control[1])) - begin - if ((irq_cpu_value[15:0] == 0) & irq_cpu_control[0]) irq_cpu_out = 1; - irq_cpu_value[15:0] = irq_cpu_value[15:0] - 1'b1; - end - - // Mapper #18 - Sunsoft-2 - if (USE_MAPPER_018 && mapper == 5'b00111) - begin - if (irq_cpu_control[0]) - begin - if (irq_cpu_control[3]) - begin - if (irq_cpu_value[3:0] == 0) irq_cpu_out = 1; - irq_cpu_value[3:0] = irq_cpu_value[3:0] - 1'b1; - end else if (irq_cpu_control[2]) begin - if (irq_cpu_value[7:0] == 0) irq_cpu_out = 1; - irq_cpu_value[7:0] = irq_cpu_value[7:0] - 1'b1; - end else if (irq_cpu_control[1]) begin - if (irq_cpu_value[11:0] == 0) irq_cpu_out = 1; - irq_cpu_value[11:0] = irq_cpu_value[11:0] - 1'b1; - end else begin - if (irq_cpu_value[15:0] == 0) irq_cpu_out = 1; - irq_cpu_value[15:0] = irq_cpu_value[15:0] - 1'b1; - end - end - end - - /* - if (~romsel_alt) - romsel_alt_clean = 1; - else - romsel_alt_clean = 0; - */ end // Fire scanline IRQ if counter is zero |