bppu.hpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. class bPPU : public PPU {
  2. public:
  3. void enter();
  4. void add_clocks(unsigned clocks);
  5. uint8 region;
  6. unsigned line;
  7. enum { NTSC = 0, PAL = 1 };
  8. enum { BG1 = 0, BG2 = 1, BG3 = 2, BG4 = 3, OAM = 4, BACK = 5, COL = 5 };
  9. enum { SC_32x32 = 0, SC_64x32 = 1, SC_32x64 = 2, SC_64x64 = 3 };
  10. struct {
  11. bool interlace;
  12. bool overscan;
  13. } display;
  14. struct {
  15. //open bus support
  16. uint8 ppu1_mdr, ppu2_mdr;
  17. //bg line counters
  18. uint16 bg_y[4];
  19. //$2100
  20. bool display_disabled;
  21. uint8 display_brightness;
  22. //$2101
  23. uint8 oam_basesize;
  24. uint8 oam_nameselect;
  25. uint16 oam_tdaddr;
  26. //$2102-$2103
  27. uint16 oam_baseaddr;
  28. uint16 oam_addr;
  29. bool oam_priority;
  30. uint8 oam_firstsprite;
  31. //$2104
  32. uint8 oam_latchdata;
  33. //$2105
  34. bool bg_tilesize[4];
  35. bool bg3_priority;
  36. uint8 bg_mode;
  37. //$2106
  38. uint8 mosaic_size;
  39. bool mosaic_enabled[4];
  40. uint16 mosaic_countdown;
  41. //$2107-$210a
  42. uint16 bg_scaddr[4];
  43. uint8 bg_scsize[4];
  44. //$210b-$210c
  45. uint16 bg_tdaddr[4];
  46. //$210d-$2114
  47. uint8 bg_ofslatch;
  48. uint16 m7_hofs, m7_vofs;
  49. uint16 bg_hofs[4];
  50. uint16 bg_vofs[4];
  51. //$2115
  52. bool vram_incmode;
  53. uint8 vram_mapping;
  54. uint8 vram_incsize;
  55. //$2116-$2117
  56. uint16 vram_addr;
  57. //$211a
  58. uint8 mode7_repeat;
  59. bool mode7_vflip;
  60. bool mode7_hflip;
  61. //$211b-$2120
  62. uint8 m7_latch;
  63. uint16 m7a, m7b, m7c, m7d, m7x, m7y;
  64. //$2121
  65. uint16 cgram_addr;
  66. //$2122
  67. uint8 cgram_latchdata;
  68. //$2123-$2125
  69. bool window1_enabled[6];
  70. bool window1_invert [6];
  71. bool window2_enabled[6];
  72. bool window2_invert [6];
  73. //$2126-$2129
  74. uint8 window1_left, window1_right;
  75. uint8 window2_left, window2_right;
  76. //$212a-$212b
  77. uint8 window_mask[6];
  78. //$212c-$212d
  79. bool bg_enabled[5], bgsub_enabled[5];
  80. //$212e-$212f
  81. bool window_enabled[5], sub_window_enabled[5];
  82. //$2130
  83. uint8 color_mask, colorsub_mask;
  84. bool addsub_mode;
  85. bool direct_color;
  86. //$2131
  87. bool color_mode, color_halve;
  88. bool color_enabled[6];
  89. //$2132
  90. uint8 color_r, color_g, color_b;
  91. uint16 color_rgb;
  92. //$2133
  93. //overscan and interlace are checked once per frame to
  94. //determine if entire frame should be interlaced/non-interlace
  95. //and overscan adjusted. therefore, the variables act sort of
  96. //like a buffer, but they do still affect internal rendering
  97. bool mode7_extbg;
  98. bool pseudo_hires;
  99. bool overscan;
  100. uint16 scanlines;
  101. bool oam_interlace;
  102. bool interlace;
  103. //$2137
  104. uint16 hcounter, vcounter;
  105. bool latch_hcounter, latch_vcounter;
  106. bool counters_latched;
  107. //$2139-$213a
  108. uint16 vram_readbuffer;
  109. //$213e
  110. bool time_over, range_over;
  111. uint16 oam_itemcount, oam_tilecount;
  112. } regs;
  113. struct {
  114. //$2101
  115. uint8 oam_basesize;
  116. uint8 oam_nameselect;
  117. uint16 oam_tdaddr;
  118. } cache;
  119. alwaysinline bool interlace() const { return display.interlace; }
  120. alwaysinline bool overscan() const { return display.overscan; }
  121. alwaysinline bool hires() const { return (regs.pseudo_hires || regs.bg_mode == 5 || regs.bg_mode == 6); }
  122. uint16 get_vram_address();
  123. uint8 vram_mmio_read (uint16 addr);
  124. void vram_mmio_write (uint16 addr, uint8 data);
  125. uint8 oam_mmio_read (uint16 addr);
  126. void oam_mmio_write (uint16 addr, uint8 data);
  127. uint8 cgram_mmio_read (uint16 addr);
  128. void cgram_mmio_write(uint16 addr, uint8 data);
  129. void mmio_w2100(uint8 value); //INIDISP
  130. void mmio_w2101(uint8 value); //OBSEL
  131. void mmio_w2102(uint8 value); //OAMADDL
  132. void mmio_w2103(uint8 value); //OAMADDH
  133. void mmio_w2104(uint8 value); //OAMDATA
  134. void mmio_w2105(uint8 value); //BGMODE
  135. void mmio_w2106(uint8 value); //MOSAIC
  136. void mmio_w2107(uint8 value); //BG1SC
  137. void mmio_w2108(uint8 value); //BG2SC
  138. void mmio_w2109(uint8 value); //BG3SC
  139. void mmio_w210a(uint8 value); //BG4SC
  140. void mmio_w210b(uint8 value); //BG12NBA
  141. void mmio_w210c(uint8 value); //BG34NBA
  142. void mmio_w210d(uint8 value); //BG1HOFS
  143. void mmio_w210e(uint8 value); //BG1VOFS
  144. void mmio_w210f(uint8 value); //BG2HOFS
  145. void mmio_w2110(uint8 value); //BG2VOFS
  146. void mmio_w2111(uint8 value); //BG3HOFS
  147. void mmio_w2112(uint8 value); //BG3VOFS
  148. void mmio_w2113(uint8 value); //BG4HOFS
  149. void mmio_w2114(uint8 value); //BG4VOFS
  150. void mmio_w2115(uint8 value); //VMAIN
  151. void mmio_w2116(uint8 value); //VMADDL
  152. void mmio_w2117(uint8 value); //VMADDH
  153. void mmio_w2118(uint8 value); //VMDATAL
  154. void mmio_w2119(uint8 value); //VMDATAH
  155. void mmio_w211a(uint8 value); //M7SEL
  156. void mmio_w211b(uint8 value); //M7A
  157. void mmio_w211c(uint8 value); //M7B
  158. void mmio_w211d(uint8 value); //M7C
  159. void mmio_w211e(uint8 value); //M7D
  160. void mmio_w211f(uint8 value); //M7X
  161. void mmio_w2120(uint8 value); //M7Y
  162. void mmio_w2121(uint8 value); //CGADD
  163. void mmio_w2122(uint8 value); //CGDATA
  164. void mmio_w2123(uint8 value); //W12SEL
  165. void mmio_w2124(uint8 value); //W34SEL
  166. void mmio_w2125(uint8 value); //WOBJSEL
  167. void mmio_w2126(uint8 value); //WH0
  168. void mmio_w2127(uint8 value); //WH1
  169. void mmio_w2128(uint8 value); //WH2
  170. void mmio_w2129(uint8 value); //WH3
  171. void mmio_w212a(uint8 value); //WBGLOG
  172. void mmio_w212b(uint8 value); //WOBJLOG
  173. void mmio_w212c(uint8 value); //TM
  174. void mmio_w212d(uint8 value); //TS
  175. void mmio_w212e(uint8 value); //TMW
  176. void mmio_w212f(uint8 value); //TSW
  177. void mmio_w2130(uint8 value); //CGWSEL
  178. void mmio_w2131(uint8 value); //CGADDSUB
  179. void mmio_w2132(uint8 value); //COLDATA
  180. void mmio_w2133(uint8 value); //SETINI
  181. uint8 mmio_r2134(); //MPYL
  182. uint8 mmio_r2135(); //MPYM
  183. uint8 mmio_r2136(); //MPYH
  184. uint8 mmio_r2137(); //SLHV
  185. uint8 mmio_r2138(); //OAMDATAREAD
  186. uint8 mmio_r2139(); //VMDATALREAD
  187. uint8 mmio_r213a(); //VMDATAHREAD
  188. uint8 mmio_r213b(); //CGDATAREAD
  189. uint8 mmio_r213c(); //OPHCT
  190. uint8 mmio_r213d(); //OPVCT
  191. uint8 mmio_r213e(); //STAT77
  192. uint8 mmio_r213f(); //STAT78
  193. uint8 mmio_read(unsigned addr);
  194. void mmio_write(unsigned addr, uint8 data);
  195. void latch_counters();
  196. //PPU render functions
  197. #include "bppu_render.hpp"
  198. uint16 light_table_b[16][32];
  199. uint16 light_table_gr[16][32 * 32];
  200. uint16 mosaic_table[16][4096];
  201. void render_line();
  202. void update_oam_status();
  203. //required functions
  204. void run();
  205. void scanline();
  206. void render_scanline();
  207. void frame();
  208. void power();
  209. void reset();
  210. bPPU();
  211. ~bPPU();
  212. };