mmc4.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*
  2. * MMC4 Mapper - The TI-NESulator Project
  3. * mmc4.h
  4. *
  5. * Created by Manoel TRAPIER.
  6. * Copyright (c) 2007 986Corp. All rights reserved.
  7. *
  8. * $LastChangedDate: 2007-05-31 18:00:41 +0200 (jeu, 31 mai 2007) $
  9. * $Author: mtrapier $
  10. * $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/mmc4.h $
  11. * $Revision: 56 $
  12. *
  13. */
  14. byte mmc4_RegA;
  15. byte mmc4_RegB;
  16. byte mmc4_RegC;
  17. byte mmc4_RegD;
  18. byte mmc4_RegE;
  19. byte mmc4_RegF;
  20. #ifdef DEBUG
  21. #define LOG
  22. //printf
  23. #else
  24. #define LOG
  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) set_vrom_bank_8k(0x0000,0);
  74. /* Mapper should register itself for write hook */
  75. for (i = 0xA0; i < 0xB0 ; i++)
  76. {
  77. set_page_wr_hook(i, mmc4_MapperWriteRegA);
  78. set_page_writeable(i, true);
  79. }
  80. for (i = 0xB0; i < 0xC0 ; i++)
  81. {
  82. set_page_wr_hook(i, mmc4_MapperWriteRegB);
  83. set_page_writeable(i, true);
  84. }
  85. for (i = 0xC0; i < 0xD0 ; i++)
  86. {
  87. set_page_wr_hook(i, mmc4_MapperWriteRegC);
  88. set_page_writeable(i, true);
  89. }
  90. for (i = 0xD0; i < 0xE0 ; i++)
  91. {
  92. set_page_wr_hook(i, mmc4_MapperWriteRegD);
  93. set_page_writeable(i, true);
  94. }
  95. for (i = 0xE0; i < 0xF0 ; i++)
  96. {
  97. set_page_wr_hook(i, mmc4_MapperWriteRegE);
  98. set_page_writeable(i, true);
  99. }
  100. for (i = 0xF0; i < 0x100 ; i++)
  101. {
  102. set_page_wr_hook(i, mmc4_MapperWriteRegF);
  103. set_page_writeable(i, true);
  104. }
  105. for (i = 0x60; i < 0x80 ; i++)
  106. {
  107. set_page_writeable(i, true);
  108. set_page_readable(i, true);
  109. }
  110. //ppu_setScreenMode(PPU_SCMODE_NORMAL);
  111. //ppu_setMirroring(PPU_MIRROR_HORIZTAL);
  112. return 0;
  113. }