ppu.h (1230B)
1 #ifndef PPU_H 2 #define PPU_H 3 4 #include <stdio.h> 5 #include <stdint.h> 6 7 #include "rom.h" 8 9 struct ppu { 10 uint8_t vram[2048]; 11 uint8_t oam[64*4]; 12 uint8_t oam_addr; /* $2003 */ 13 uint8_t palette[16*2]; 14 uint16_t cycles, scanlines; 15 struct rom *rom; 16 17 uint8_t last_read; 18 19 struct ppu_regs { 20 uint16_t v : 15; /* current vram address */ 21 uint16_t t : 15; /* temporary vram address */ 22 uint16_t scroll_x : 9; /* x scroll position */ 23 uint16_t scroll_y : 9; /* y scroll position */ 24 uint8_t write_toggle : 1; /* first/second write toggle */ 25 } regs; 26 27 struct ppu_ctrl { /* $2000 */ 28 uint8_t nmi_enable : 1; 29 uint8_t master_slave : 1; 30 uint8_t sprite_height : 1; 31 uint8_t bg_tile_sel : 1; 32 uint8_t sprite_tile_sel : 1; 33 uint8_t inc_mode : 1; 34 uint8_t nametable_base : 2; 35 } ctrl; 36 struct ppu_mask { /* $2001 */ 37 uint8_t colour_emphasis : 3; 38 uint8_t sprite_enable : 1; 39 uint8_t bg_enable : 1; 40 uint8_t sprite_left_enable : 1; 41 uint8_t bg_left_enable : 1; 42 uint8_t grayscale : 1; 43 } mask; 44 struct ppu_status { /* $2002 */ 45 uint8_t vblank : 1; 46 uint8_t sprite0_hit : 1; 47 uint8_t sprite_overflow : 1; 48 uint8_t pad : 5; 49 } status; 50 }; 51 extern struct ppu ppu; 52 53 void ppu_tick(void); 54 55 #endif /* PPU_H */