PageRenderTime 69ms CodeModel.GetById 35ms RepoModel.GetById 1ms app.codeStats 0ms

/verilog/sd2snes_sdd1/address.v

https://github.com/mrehkopf/sd2snes
Verilog | 154 lines | 78 code | 14 blank | 62 comment | 31 complexity | baa6d97204d918d405cc0c348280dcd0 MD5 | raw file
Possible License(s): GPL-2.0
  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 [15:0] featurebits, // peripheral enable/disable
  23. input [2:0] MAPPER, // MCU detected mapper
  24. input [23:0] SNES_ADDR, // requested address from SNES
  25. input [7:0] SNES_PA, // peripheral address from SNES
  26. input SNES_ROMSEL, // ROMSEL from SNES
  27. output [23:0] ROM_ADDR, // Address to request from SRAM0
  28. output ROM_HIT, // enable SRAM0
  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] SAVERAM_MASK,
  33. input [23:0] ROM_MASK,
  34. output msu_enable,
  35. output srtc_enable,
  36. output use_bsx,
  37. output bsx_tristate,
  38. input [14:0] bsx_regs,
  39. output dspx_enable,
  40. output dspx_dp_enable,
  41. output dspx_a0,
  42. output r213f_enable,
  43. output r2100_hit,
  44. output snescmd_enable,
  45. output nmicmd_enable,
  46. output return_vector_enable,
  47. output branch1_enable,
  48. output branch2_enable,
  49. output branch3_enable
  50. );
  51. /* feature bits. see src/fpga_spi.c for mapping */
  52. parameter [2:0]
  53. FEAT_DSPX = 0,
  54. FEAT_ST0010 = 1,
  55. FEAT_SRTC = 2,
  56. FEAT_MSU1 = 3,
  57. FEAT_213F = 4,
  58. FEAT_2100 = 6
  59. ;
  60. wire [23:0] SRAM_SNES_ADDR;
  61. /* currently supported mappers:
  62. Index Mapper
  63. 000 HiROM
  64. 001 LoROM
  65. 010 ExHiROM (48-64Mbit)
  66. 011 BS-X
  67. 100 ExLoROM (StarOCean and SFA2)
  68. 110 brainfuck interleaved 96MBit Star Ocean =)
  69. 111 menu (ROM in upper SRAM)
  70. */
  71. // active high to select ROM in banks 00-3f,80-bf:8000-ffff and 40-7d,c0-ff:0000-ffff
  72. // (decoded by SNES)
  73. assign IS_ROM = ~SNES_ROMSEL;
  74. // select backup RAM when
  75. // ST0010 chip is present, SRAM is mapped to
  76. assign IS_SAVERAM = SAVERAM_MASK[0]&(featurebits[FEAT_ST0010]?((SNES_ADDR[22:19] == 4'b1101) & &(~SNES_ADDR[15:12]) & SNES_ADDR[11])
  77. // for HiROM, ExtHIROM or interleaved StarOcean -> $3X:[$6000-$7FFF] or $BX:[$6000-$7FFF]
  78. :((MAPPER == 3'b000 || MAPPER == 3'b010 || MAPPER == 3'b110) ? (!SNES_ADDR[22] & SNES_ADDR[21] & &SNES_ADDR[14:13] & !SNES_ADDR[15])
  79. // for ExtLoROM -> $7X:[$6000-$7FFF]
  80. :(MAPPER == 3'b100) ? ((SNES_ADDR[23:19] == 5'b01110) && (SNES_ADDR[15:13] == 3'b011))
  81. // LoROM: SRAM @ Bank 0x70-0x7d, 0xf0-0xff
  82. // Offset 0000-7fff for ROM >= 32 MBit, otherwise 0000-ffff
  83. :(MAPPER == 3'b001)? (&SNES_ADDR[22:20] & (~SNES_ROMSEL) & (~SNES_ADDR[15] | ~ROM_MASK[21]))
  84. // BS-X: SRAM @ Bank 0x10-0x17 Offset 5000-5fff
  85. :(MAPPER == 3'b011) ? ((SNES_ADDR[23:19] == 5'b00010) & (SNES_ADDR[15:12] == 4'b0101) )
  86. // Menu mapper: 8Mbit "SRAM" @ Bank 0xf0-0xff (entire banks!)
  87. :(MAPPER == 3'b111) ? (&SNES_ADDR[23:20])
  88. : 1'b0));
  89. // '1' to signal access to cartrigde writable range (Backup RAM or BS-X RAM)
  90. assign IS_WRITABLE = IS_SAVERAM;
  91. /* BSX regs:
  92. Index Function
  93. 1 0=map flash to ROM area; 1=map PRAM to ROM area
  94. 2 1=HiROM; 0=LoROM
  95. 3 1=Mirror PRAM @60-6f:0000-ffff
  96. 5 1=DO NOT mirror PRAM @40-4f:0000-ffff
  97. 6 1=DO NOT mirror PRAM @50-5f:0000-ffff
  98. 7 1=map BSX cartridge ROM @00-1f:8000-ffff
  99. 8 1=map BSX cartridge ROM @80-9f:8000-ffff
  100. */
  101. // HiROM
  102. assign SRAM_SNES_ADDR = ((MAPPER == 3'b000) ? (IS_SAVERAM ? 24'hE00000 + ({SNES_ADDR[20:16], SNES_ADDR[12:0]} & SAVERAM_MASK)
  103. : ({1'b0, SNES_ADDR[22:0]} & ROM_MASK))
  104. // LoROM
  105. :(MAPPER == 3'b001) ? (IS_SAVERAM ? 24'hE00000 + ({SNES_ADDR[20:16], SNES_ADDR[14:0]} & SAVERAM_MASK)
  106. : ({1'b0, ~SNES_ADDR[23], SNES_ADDR[22:16], SNES_ADDR[14:0]} & ROM_MASK))
  107. // ExtHiROM
  108. :(MAPPER == 3'b010) ? (IS_SAVERAM ? 24'hE00000 + ({7'b0000000, SNES_ADDR[19:16], SNES_ADDR[12:0]} & SAVERAM_MASK)
  109. : ({1'b0, !SNES_ADDR[23], SNES_ADDR[21:0]} & ROM_MASK))
  110. // ExtLoROM
  111. :(MAPPER == 3'b100) ? (IS_SAVERAM ? 24'hE00000 + ({7'b0000000, SNES_ADDR[19:16], SNES_ADDR[12:0]} & SAVERAM_MASK)
  112. : ({1'b0, !SNES_ADDR[23], SNES_ADDR[21:0]} & ROM_MASK))
  113. // interleaved StarOcean
  114. :(MAPPER == 3'b110) ? (IS_SAVERAM ? 24'hE00000 + ((SNES_ADDR[14:0] - 15'h6000) & SAVERAM_MASK)
  115. :(SNES_ADDR[15] ? ({1'b0, SNES_ADDR[23:16], SNES_ADDR[14:0]})
  116. :({2'b10, SNES_ADDR[23], SNES_ADDR[21:16], SNES_ADDR[14:0]}) ) )
  117. // menu
  118. :(MAPPER == 3'b111) ? (IS_SAVERAM ? SNES_ADDR
  119. : (({1'b0, SNES_ADDR[22:0]} & ROM_MASK) + 24'hC00000) )
  120. : 24'b0);
  121. assign ROM_ADDR = SRAM_SNES_ADDR;
  122. // '1' when accesing PSRAM for ROM, Backup RAM, BS-X RAM
  123. assign ROM_HIT = IS_ROM | IS_WRITABLE;
  124. // '1' when accessing to MSU register map $2000:$2007
  125. assign msu_enable = featurebits[FEAT_MSU1] & (!SNES_ADDR[22] && ((SNES_ADDR[15:0] & 16'hfff8) == 16'h2000));
  126. // MAGNO -> disabled for S-DD1 core
  127. //assign use_bsx = (MAPPER == 3'b011);
  128. assign use_bsx = 1'b0;
  129. // MAGNO -> disabled for S-DD1 core
  130. //assign srtc_enable = featurebits[FEAT_SRTC] & (!SNES_ADDR[22] && ((SNES_ADDR[15:0] & 16'hfffe) == 16'h2800));
  131. assign srtc_enable = 1'b0;
  132. assign r213f_enable = featurebits[FEAT_213F] & (SNES_PA == 8'h3f);
  133. assign r2100_hit = (SNES_PA == 8'h00);
  134. assign snescmd_enable = ({SNES_ADDR[22], SNES_ADDR[15:9]} == 8'b0_0010101);
  135. assign nmicmd_enable = (SNES_ADDR == 24'h002BF2);
  136. assign return_vector_enable = (SNES_ADDR == 24'h002A6C);
  137. assign branch1_enable = (SNES_ADDR == 24'h002A1F);
  138. assign branch2_enable = (SNES_ADDR == 24'h002A59);
  139. assign branch3_enable = (SNES_ADDR == 24'h002A5E);
  140. endmodule