mmc4.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. * MMC4 Mapper - The TI-NESulator Project
  3. * mmc4.h
  4. *
  5. * Created by Manoel TRAPIER.
  6. * Copyright (c) 2007-2008 986Corp. All rights reserved.
  7. *
  8. * $LastChangedDate$
  9. * $Author$
  10. * $HeadURL$
  11. * $Revision$
  12. *
  13. */
  14. #include "mmc4.h"
  15. byte mmc4_RegA;
  16. byte mmc4_RegB;
  17. byte mmc4_RegC;
  18. byte mmc4_RegD;
  19. byte mmc4_RegE;
  20. byte mmc4_RegF;
  21. #ifdef DEBUG
  22. #define LOG(s) printf s
  23. #else
  24. #define LOG(s) { }
  25. #endif
  26. void mmc4_MapperWriteRegA(register byte Addr, register byte Value)
  27. {
  28. LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
  29. mmc4_RegA = Value;
  30. set_prom_bank_16k(0x8000, Value & 0x0F);
  31. }
  32. void mmc4_MapperWriteRegB(register byte Addr, register byte Value)
  33. {
  34. LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
  35. mmc4_RegB = Value;
  36. set_vrom_bank_4k(0x0000, Value & 0x1F);
  37. }
  38. void mmc4_MapperWriteRegC(register byte Addr, register byte Value)
  39. {
  40. LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
  41. mmc4_RegC = Value;
  42. set_vrom_bank_4k(0x0000, Value & 0x1F);
  43. }
  44. void mmc4_MapperWriteRegD(register byte Addr, register byte Value)
  45. {
  46. LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
  47. mmc4_RegD = Value;
  48. set_vrom_bank_4k(0x1000, Value & 0x1F);
  49. }
  50. void mmc4_MapperWriteRegE(register byte Addr, register byte Value)
  51. {
  52. LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
  53. mmc4_RegE = Value;
  54. set_vrom_bank_4k(0x1000, Value & 0x1F);
  55. }
  56. void mmc4_MapperWriteRegF(register byte Addr, register byte Value)
  57. {
  58. LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
  59. mmc4_RegF = Value;
  60. if (Value & 0x01)
  61. ppu_setMirroring(PPU_MIRROR_HORIZTAL);
  62. else
  63. ppu_setMirroring(PPU_MIRROR_VERTICAL);
  64. }
  65. void mmc4_MapperDump(FILE *fp)
  66. {
  67. }
  68. int mmc4_InitMapper(NesCart * cart)
  69. {
  70. int i;
  71. set_prom_bank_16k(0x8000,0);
  72. set_prom_bank_16k(0xC000, GETLAST16KBANK(cart));
  73. if (cart->VROMSize > 0)
  74. set_vrom_bank_8k(0x0000,0);
  75. /* Mapper should register itself for write hook */
  76. for (i = 0xA0; i < 0xB0 ; i++)
  77. {
  78. set_page_wr_hook(i, mmc4_MapperWriteRegA);
  79. set_page_writeable(i, true);
  80. }
  81. for (i = 0xB0; i < 0xC0 ; i++)
  82. {
  83. set_page_wr_hook(i, mmc4_MapperWriteRegB);
  84. set_page_writeable(i, true);
  85. }
  86. for (i = 0xC0; i < 0xD0 ; i++)
  87. {
  88. set_page_wr_hook(i, mmc4_MapperWriteRegC);
  89. set_page_writeable(i, true);
  90. }
  91. for (i = 0xD0; i < 0xE0 ; i++)
  92. {
  93. set_page_wr_hook(i, mmc4_MapperWriteRegD);
  94. set_page_writeable(i, true);
  95. }
  96. for (i = 0xE0; i < 0xF0 ; i++)
  97. {
  98. set_page_wr_hook(i, mmc4_MapperWriteRegE);
  99. set_page_writeable(i, true);
  100. }
  101. for (i = 0xF0; i < 0x100 ; i++)
  102. {
  103. set_page_wr_hook(i, mmc4_MapperWriteRegF);
  104. set_page_writeable(i, true);
  105. }
  106. for (i = 0x60; i < 0x80 ; i++)
  107. {
  108. set_page_writeable(i, true);
  109. set_page_readable(i, true);
  110. }
  111. //ppu_setScreenMode(PPU_SCMODE_NORMAL);
  112. //ppu_setMirroring(PPU_MIRROR_HORIZTAL);
  113. return 0;
  114. }