emu_nes

An NES emulator for learning how the 6502 and similar computers of the era worked
Log | Files | Refs | README | LICENSE

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 */