mmc4.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /*
  2. * MMC4 Mapper - The peTI-NESulator Project
  3. * mmc4.h
  4. *
  5. * Created by Manoel TRAPIER.
  6. * Copyright (c) 2003-2018 986-Studio. 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. /* MAPPER WARNING: This mapper need to attach to the PPU memory... Need more work on this parts.. */
  27. void mmc4_MapperWriteRegA(register byte Addr, register byte Value)
  28. {
  29. LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
  30. mmc4_RegA = Value;
  31. set_prom_bank_16k(0x8000, Value & 0x0F);
  32. }
  33. void mmc4_MapperWriteRegB(register byte Addr, register byte Value)
  34. {
  35. LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
  36. mmc4_RegB = Value;
  37. set_vrom_bank_4k(0x0000, Value & 0x1F);
  38. }
  39. void mmc4_MapperWriteRegC(register byte Addr, register byte Value)
  40. {
  41. LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
  42. mmc4_RegC = Value;
  43. set_vrom_bank_4k(0x0000, Value & 0x1F);
  44. }
  45. void mmc4_MapperWriteRegD(register byte Addr, register byte Value)
  46. {
  47. LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
  48. mmc4_RegD = Value;
  49. set_vrom_bank_4k(0x1000, Value & 0x1F);
  50. }
  51. void mmc4_MapperWriteRegE(register byte Addr, register byte Value)
  52. {
  53. LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
  54. mmc4_RegE = Value;
  55. set_vrom_bank_4k(0x1000, Value & 0x1F);
  56. }
  57. void mmc4_MapperWriteRegF(register byte Addr, register byte Value)
  58. {
  59. LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
  60. mmc4_RegF = Value;
  61. if (Value & 0x01)
  62. ppu_setMirroring(PPU_MIRROR_HORIZTAL);
  63. else
  64. ppu_setMirroring(PPU_MIRROR_VERTICAL);
  65. }
  66. void mmc4_MapperDump(FILE *fp)
  67. {
  68. }
  69. int mmc4_InitMapper(NesCart * cart)
  70. {
  71. int i;
  72. set_prom_bank_16k(0x8000, 0);
  73. set_prom_bank_16k(0xC000, GETLAST16KBANK(cart));
  74. if (cart->VROMSize > 0)
  75. set_vrom_bank_8k(0x0000,0);
  76. /* Mapper should register itself for write hook */
  77. for (i = 0xA0; i < 0xB0 ; i++)
  78. {
  79. set_page_wr_hook(i, mmc4_MapperWriteRegA);
  80. set_page_writeable(i, true);
  81. }
  82. for (i = 0xB0; i < 0xC0 ; i++)
  83. {
  84. set_page_wr_hook(i, mmc4_MapperWriteRegB);
  85. set_page_writeable(i, true);
  86. }
  87. for (i = 0xC0; i < 0xD0 ; i++)
  88. {
  89. set_page_wr_hook(i, mmc4_MapperWriteRegC);
  90. set_page_writeable(i, true);
  91. }
  92. for (i = 0xD0; i < 0xE0 ; i++)
  93. {
  94. set_page_wr_hook(i, mmc4_MapperWriteRegD);
  95. set_page_writeable(i, true);
  96. }
  97. for (i = 0xE0; i < 0xF0 ; i++)
  98. {
  99. set_page_wr_hook(i, mmc4_MapperWriteRegE);
  100. set_page_writeable(i, true);
  101. }
  102. for (i = 0xF0; i < 0x100 ; i++)
  103. {
  104. set_page_wr_hook(i, mmc4_MapperWriteRegF);
  105. set_page_writeable(i, true);
  106. }
  107. for (i = 0x60; i < 0x80 ; i++)
  108. {
  109. set_page_writeable(i, true);
  110. set_page_readable(i, true);
  111. }
  112. //ppu_setScreenMode(PPU_SCMODE_NORMAL);
  113. //ppu_setMirroring(PPU_MIRROR_HORIZTAL);
  114. return 0;
  115. }