12 unsigned int ce :1; /*chip enable*/
13 unsigned int rw :1; /*assert on write.*/
14 unsigned int vblank :1; /*connected to nmi*/
18 unsigned char control1; /*write only*/
19 unsigned char control2; /*write only*/
20 unsigned char status; /*read only*/
21 unsigned char sprite_addr;
22 unsigned char sprite_data;
24 unsigned char vram_addr;
25 unsigned char vram_data;
29 unsigned int rd :1; /*read*/
30 unsigned int wr :1; /*write.*/
33 static struct ppu_cpu_pin ppu_pin;
34 static struct ppu_cart_pin cart_pin;
35 struct ppu_register ppu_reg;
38 static pthread_t ppu_thread_id;
39 static int ppu_end_loop;
40 static sem_t ppu_sem_id;
43 * JAPAN/US uses NTSC standard.
46 * ---------------------------------------------------------
47 * Frames per second 60
48 * Time per frame (milliseconds) 16.67
49 * Scanlines per frame (of which is V-Blank) 262 (20)
50 * CPU cycles per scanline 113.33
51 * Resolution 256 x 224
56 void set_ppu_addr(unsigned char data) {
59 unsigned char get_ppu_data(void) {
63 void set_ppu_data(unsigned char data) {
66 static void *ppu_loop(void* arg) {
67 //struct timespec ts = {CPU_CLOCK_SEC, CPU_CLOCK_NSEC / 10};
69 while (!ppu_end_loop) {
70 sem_wait(&ppu_sem_id);
82 memset(&ppu_reg, 0, sizeof(ppu_reg));
88 ret = sem_init(&ppu_sem_id, 0, 0);
93 ret = pthread_attr_init(&attr);
99 ret = pthread_create(&ppu_thread_id, &attr, ppu_loop, NULL);
107 void clean_ppu(void) {
111 sem_post(&ppu_sem_id);
112 pthread_join(ppu_thread_id, &ret);
114 sem_destroy(&ppu_sem_id);
115 dprint("ppu thread joined.\n");