address.v 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. `timescale 1 ns / 1 ns
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company: Rehkopf
  4. // Engineer: Rehkopf
  5. //
  6. // Create Date: 01:13:46 05/09/2009
  7. // Design Name:
  8. // Module Name: address
  9. // Project Name:
  10. // Target Devices:
  11. // Tool versions:
  12. // Description: Address logic w/ SaveRAM masking
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Additional Comments:
  18. //
  19. //////////////////////////////////////////////////////////////////////////////////
  20. module address(
  21. input CLK,
  22. input [2:0] MAPPER, // MCU detected mapper
  23. input [23:0] SNES_ADDR, // requested address from SNES
  24. input SNES_CS, // "CART" pin from SNES (active low)
  25. output [22:0] ROM_ADDR, // Address to request from SRAM0
  26. output ROM_SEL, // enable SRAM0 (active low)
  27. input MCU_OVR, // enable MCU master mode (active low)
  28. input MODE, // MCU(1) or SNES(0) ("bus phase")
  29. output IS_SAVERAM, // address/CS mapped as SRAM?
  30. output IS_ROM, // address mapped as ROM?
  31. output IS_WRITABLE, // address somehow mapped as writable area?
  32. input [23:0] MCU_ADDR, // allow address to be set externally
  33. input ADDR_WRITE,
  34. output ROM_ADDR0,
  35. input [23:0] SAVERAM_MASK,
  36. input [23:0] ROM_MASK,
  37. input use_msu,
  38. output msu_enable,
  39. output use_bsx,
  40. input [14:0] bsx_regs
  41. );
  42. wire [1:0] SRAM_BANK;
  43. wire [23:0] SRAM_ADDR_FULL;
  44. /* currently supported mappers:
  45. Index Mapper
  46. 000 HiROM
  47. 001 LoROM
  48. 010 ExHiROM (48-64Mbit)
  49. 011 BS-X
  50. 110 brainfuck interleaved 96MBit Star Ocean =)
  51. 111 menu (ROM in upper SRAM)
  52. */
  53. /* HiROM: SRAM @ Bank 0x30-0x3f, 0xb0-0xbf
  54. Offset 6000-7fff */
  55. assign IS_ROM = ( (MAPPER == 3'b000) ? ((!SNES_ADDR[22] & SNES_ADDR[15])
  56. |(SNES_ADDR[22]))
  57. : (MAPPER == 3'b001) ? ((!SNES_ADDR[22] & SNES_ADDR[15])
  58. |(SNES_ADDR[22]))
  59. : (MAPPER == 3'b010) ? ((!SNES_ADDR[22] & SNES_ADDR[15])
  60. |(SNES_ADDR[22]))
  61. : (MAPPER == 3'b011) ? ((!SNES_ADDR[22] & SNES_ADDR[15])
  62. |(SNES_ADDR[22]))
  63. : (MAPPER == 3'b110) ? ((!SNES_ADDR[22] & SNES_ADDR[15])
  64. |(SNES_ADDR[22]))
  65. : (MAPPER == 3'b111) ? ((!SNES_ADDR[22] & SNES_ADDR[15])
  66. |(SNES_ADDR[22]))
  67. : 1'b0);
  68. assign IS_SAVERAM = ((MAPPER == 3'b000 || MAPPER == 3'b010 || MAPPER == 3'b110 || MAPPER == 3'b111) ? (!SNES_ADDR[22]
  69. & SNES_ADDR[21:20]
  70. & &SNES_ADDR[14:13]
  71. & !SNES_ADDR[15]
  72. & SNES_CS
  73. )
  74. /* LoROM: SRAM @ Bank 0x70-0x7d, 0xf0-0xfd
  75. Offset 0000-7fff TODO: 0000-ffff for
  76. small ROMs */
  77. :(MAPPER == 3'b001) ? (&SNES_ADDR[22:20]
  78. & (SNES_ADDR[19:16] < 4'b1110)
  79. & !SNES_ADDR[15]
  80. & !SNES_CS)
  81. /* BS-X: SRAM @ Bank 0x10-0x17
  82. Offset 5000-5fff */
  83. :(MAPPER == 3'b011) ? ((SNES_ADDR[23:19] == 5'b00010)
  84. & (SNES_ADDR[15:12] == 4'b0101)
  85. )
  86. : 1'b0);
  87. assign IS_WRITABLE = IS_SAVERAM | (
  88. (MAPPER == 3'b011)
  89. ? (
  90. (bsx_regs[3] && SNES_ADDR[23:20]==4'b0110)
  91. |(!bsx_regs[5] && SNES_ADDR[23:20]==4'b0100)
  92. |(!bsx_regs[6] && SNES_ADDR[23:20]==4'b0101)
  93. |(SNES_ADDR[23:19] == 5'b01110)
  94. |(SNES_ADDR[23:21] == 3'b001 && SNES_ADDR[15:13] == 3'b011))
  95. : 1'b0);
  96. /* BSX regs:
  97. Index Function
  98. 1 0=map flash to ROM area; 1=map PRAM to ROM area
  99. 2 1=HiROM; 0=LoROM
  100. 3 1=Mirror PRAM @60-6f:0000-ffff
  101. 5 1=DO NOT mirror PRAM @40-4f:0000-ffff
  102. 6 1=DO NOT mirror PRAM @50-5f:0000-ffff
  103. 7 1=map BSX cartridge ROM @00-1f:8000-ffff
  104. 8 1=map BSX cartridge ROM @80-9f:8000-ffff
  105. */
  106. assign SRAM_ADDR_FULL = (MODE) ? MCU_ADDR
  107. : ((MAPPER == 3'b000) ?
  108. (IS_SAVERAM ? 24'hE00000 + ((SNES_ADDR[14:0] - 15'h6000) & SAVERAM_MASK)
  109. : ({1'b0, SNES_ADDR[22:0]} & ROM_MASK))
  110. :(MAPPER == 3'b001) ?
  111. (IS_SAVERAM ? 24'hE00000 + (SNES_ADDR[14:0] & SAVERAM_MASK)
  112. : ({2'b00, SNES_ADDR[22:16], SNES_ADDR[14:0]} & ROM_MASK))
  113. :(MAPPER == 3'b010) ?
  114. (IS_SAVERAM ? 24'hE00000 + ((SNES_ADDR[14:0] - 15'h6000) & SAVERAM_MASK)
  115. : ({1'b0, !SNES_ADDR[23], SNES_ADDR[21:0]} & ROM_MASK))
  116. :(MAPPER == 3'b011) ?
  117. (IS_SAVERAM ? 24'hE00000 + {SNES_ADDR[18:16], SNES_ADDR[11:0]}
  118. : IS_WRITABLE ? (24'h400000 + (SNES_ADDR & 24'h07FFFF))
  119. : ((bsx_regs[7] && SNES_ADDR[23:21] == 3'b000)
  120. |(bsx_regs[8] && SNES_ADDR[23:21] == 3'b100))
  121. ? (24'h800000 + ({1'b0, SNES_ADDR[23:16], SNES_ADDR[14:0]} & 24'h0FFFFF))
  122. : ((bsx_regs[1] ? 24'h400000 : 24'h000000)
  123. + bsx_regs[2] ? ({2'b00, SNES_ADDR[21:0]} & (ROM_MASK >> bsx_regs[1]))
  124. : ({1'b0, SNES_ADDR[23:16], SNES_ADDR[14:0]} & (ROM_MASK >> bsx_regs[1]))))
  125. :(MAPPER == 3'b110) ?
  126. (IS_SAVERAM ? 24'hE00000 + ((SNES_ADDR[14:0] - 15'h6000) & SAVERAM_MASK)
  127. : (SNES_ADDR[15] ? ({1'b0, SNES_ADDR[23:16], SNES_ADDR[14:0]})
  128. : ({2'b10, SNES_ADDR[23], SNES_ADDR[21:16], SNES_ADDR[14:0]})))
  129. :(MAPPER == 3'b111) ?
  130. (IS_SAVERAM ? 24'hFF0000 + ((SNES_ADDR[14:0] - 15'h6000) & SAVERAM_MASK)
  131. : (({1'b0, SNES_ADDR[22:0]} & ROM_MASK) + 24'hE00000))
  132. : 24'b0);
  133. assign ROM_ADDR = SRAM_ADDR_FULL[23:1];
  134. assign ROM_SEL = 1'b0; // (MODE) ? CS_ARRAY[SRAM_BANK] : IS_SAVERAM ? 4'b1000 : CS_ARRAY[SRAM_BANK];
  135. assign ROM_ADDR0 = SRAM_ADDR_FULL[0];
  136. //488888
  137. assign msu_enable = (!SNES_ADDR[22] && ((SNES_ADDR[15:0] & 16'hfff8) == 16'h2000));
  138. assign use_bsx = (MAPPER == 3'b011);
  139. endmodule