kopia lustrzana https://github.com/Jean-MarcHarvengt/MCUME
242 wiersze
6.3 KiB
C
Executable File
242 wiersze
6.3 KiB
C
Executable File
/*
|
|
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
|
|
**
|
|
**
|
|
** This program is free software; you can redistribute it and/or
|
|
** modify it under the terms of version 2 of the GNU Library General
|
|
** Public License as published by the Free Software Foundation.
|
|
**
|
|
** This program is distributed in the hope that it will be useful,
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
** Library General Public License for more details. To obtain a
|
|
** copy of the GNU Library General Public License, write to the Free
|
|
** Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
**
|
|
** Any permitted reproduction of these routines, in whole or in part,
|
|
** must bear this legend.
|
|
**
|
|
**
|
|
** nes_ppu.h
|
|
**
|
|
** NES Picture Processing Unit (PPU) emulation header file
|
|
** $Id: nes_ppu.h,v 1.2 2001/04/27 14:37:11 neil Exp $
|
|
*/
|
|
|
|
#ifndef _NES_PPU_H_
|
|
#define _NES_PPU_H_
|
|
|
|
#include "bitmap.h"
|
|
|
|
/* PPU register defines */
|
|
#define PPU_CTRL0 0x2000
|
|
#define PPU_CTRL1 0x2001
|
|
#define PPU_STAT 0x2002
|
|
#define PPU_OAMADDR 0x2003
|
|
#define PPU_OAMDATA 0x2004
|
|
#define PPU_SCROLL 0x2005
|
|
#define PPU_VADDR 0x2006
|
|
#define PPU_VDATA 0x2007
|
|
|
|
#define PPU_OAMDMA 0x4014
|
|
#define PPU_JOY0 0x4016
|
|
#define PPU_JOY1 0x4017
|
|
|
|
/* $2000 */
|
|
#define PPU_CTRL0F_NMI 0x80
|
|
#define PPU_CTRL0F_OBJ16 0x20
|
|
#define PPU_CTRL0F_BGADDR 0x10
|
|
#define PPU_CTRL0F_OBJADDR 0x08
|
|
#define PPU_CTRL0F_ADDRINC 0x04
|
|
#define PPU_CTRL0F_NAMETAB 0x03
|
|
|
|
/* $2001 */
|
|
#define PPU_CTRL1F_OBJON 0x10
|
|
#define PPU_CTRL1F_BGON 0x08
|
|
#define PPU_CTRL1F_OBJMASK 0x04
|
|
#define PPU_CTRL1F_BGMASK 0x02
|
|
|
|
/* $2002 */
|
|
#define PPU_STATF_VBLANK 0x80
|
|
#define PPU_STATF_STRIKE 0x40
|
|
#define PPU_STATF_MAXSPRITE 0x20
|
|
|
|
/* Sprite attribute byte bitmasks */
|
|
#define OAMF_VFLIP 0x80
|
|
#define OAMF_HFLIP 0x40
|
|
#define OAMF_BEHIND 0x20
|
|
|
|
/* Maximum number of sprites per horizontal scanline */
|
|
#define PPU_MAXSPRITE 8
|
|
|
|
/* some mappers do *dumb* things */
|
|
typedef void (*ppulatchfunc_t)(uint32 address, uint8 value);
|
|
typedef void (*ppuvromswitch_t)(uint8 value);
|
|
|
|
typedef struct ppu_s
|
|
{
|
|
/* big nasty memory chunks */
|
|
uint8 nametab[0x1000];
|
|
uint8 oam[256];
|
|
uint8 palette[32];
|
|
uint8 *page[16];
|
|
|
|
/* hardware registers */
|
|
uint8 ctrl0, ctrl1, stat, oam_addr;
|
|
uint32 vaddr, vaddr_latch;
|
|
int tile_xofs, flipflop;
|
|
int vaddr_inc;
|
|
uint32 tile_nametab;
|
|
|
|
uint8 obj_height;
|
|
uint32 obj_base, bg_base;
|
|
|
|
bool bg_on, obj_on;
|
|
bool obj_mask, bg_mask;
|
|
|
|
uint8 latch, vdata_latch;
|
|
uint8 strobe;
|
|
|
|
bool strikeflag;
|
|
uint32 strike_cycle;
|
|
|
|
/* callbacks for naughty mappers */
|
|
ppulatchfunc_t latchfunc;
|
|
ppuvromswitch_t vromswitch;
|
|
|
|
/* copy of our current palette */
|
|
rgb_t curpal[256];
|
|
|
|
bool vram_accessible;
|
|
|
|
bool vram_present;
|
|
bool drawsprites;
|
|
} ppu_t;
|
|
|
|
|
|
/* TODO: should use this pointers */
|
|
extern void ppu_setlatchfunc(ppulatchfunc_t func);
|
|
extern void ppu_setvromswitch(ppuvromswitch_t func);
|
|
|
|
extern void ppu_getcontext(ppu_t *dest_ppu);
|
|
extern void ppu_setcontext(ppu_t *src_ppu);
|
|
|
|
/* Mirroring */
|
|
/* TODO: this is only used bloody once */
|
|
extern void ppu_mirrorhipages(void);
|
|
|
|
extern void ppu_mirror(int nt1, int nt2, int nt3, int nt4);
|
|
|
|
extern void ppu_setpage(int size, int page_num, uint8 *location);
|
|
extern uint8 *ppu_getpage(int page);
|
|
|
|
|
|
/* control */
|
|
extern void ppu_reset(int reset_type);
|
|
extern bool ppu_enabled(void);
|
|
extern void ppu_scanline(bitmap_t *bmp, int scanline, bool draw_flag);
|
|
extern void ppu_endscanline(int scanline);
|
|
extern void ppu_checknmi();
|
|
|
|
extern ppu_t *ppu_create(void);
|
|
extern void ppu_destroy(ppu_t **ppu);
|
|
|
|
/* IO */
|
|
extern uint8 ppu_read(uint32 address);
|
|
extern void ppu_write(uint32 address, uint8 value);
|
|
extern uint8 ppu_readhigh(uint32 address);
|
|
extern void ppu_writehigh(uint32 address, uint8 value);
|
|
|
|
/* rendering */
|
|
extern void ppu_setpal(ppu_t *src_ppu, rgb_t *pal);
|
|
extern void ppu_setdefaultpal(ppu_t *src_ppu);
|
|
|
|
/* bleh */
|
|
extern void ppu_dumppattern(bitmap_t *bmp, int table_num, int x_loc, int y_loc, int col);
|
|
extern void ppu_dumpoam(bitmap_t *bmp, int x_loc, int y_loc);
|
|
extern void ppu_displaysprites(bool display);
|
|
|
|
#endif /* _NES_PPU_H_ */
|
|
|
|
/*
|
|
** $Log: nes_ppu.h,v $
|
|
** Revision 1.2 2001/04/27 14:37:11 neil
|
|
** wheeee
|
|
**
|
|
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
|
|
** initial
|
|
**
|
|
** Revision 1.8 2000/11/29 12:58:23 matt
|
|
** timing/fiq fixes
|
|
**
|
|
** Revision 1.7 2000/11/27 19:36:16 matt
|
|
** more timing fixes
|
|
**
|
|
** Revision 1.6 2000/11/26 15:51:13 matt
|
|
** frame IRQ emulation
|
|
**
|
|
** Revision 1.5 2000/11/25 20:30:39 matt
|
|
** scanline emulation simplifications/timing fixes
|
|
**
|
|
** Revision 1.4 2000/11/19 13:40:19 matt
|
|
** more accurate ppu behavior
|
|
**
|
|
** Revision 1.3 2000/11/05 16:35:41 matt
|
|
** rolled rgb.h into bitmap.h
|
|
**
|
|
** Revision 1.2 2000/10/27 12:55:03 matt
|
|
** palette generating functions now take *this pointers
|
|
**
|
|
** Revision 1.1 2000/10/24 12:20:28 matt
|
|
** changed directory structure
|
|
**
|
|
** Revision 1.19 2000/10/22 15:02:32 matt
|
|
** simplified mirroring
|
|
**
|
|
** Revision 1.18 2000/10/21 21:36:04 matt
|
|
** ppu cleanups / fixes
|
|
**
|
|
** Revision 1.17 2000/10/21 19:26:59 matt
|
|
** many more cleanups
|
|
**
|
|
** Revision 1.16 2000/10/10 13:58:15 matt
|
|
** stroustrup squeezing his way in the door
|
|
**
|
|
** Revision 1.15 2000/07/31 04:27:59 matt
|
|
** one million cleanups
|
|
**
|
|
** Revision 1.14 2000/07/30 04:32:33 matt
|
|
** emulation of the NES frame IRQ
|
|
**
|
|
** Revision 1.13 2000/07/25 02:25:53 matt
|
|
** safer xxx_destroy calls
|
|
**
|
|
** Revision 1.12 2000/07/17 05:12:56 matt
|
|
** nes_ppu.c is no longer a scary place to be-- cleaner & faster
|
|
**
|
|
** Revision 1.11 2000/07/17 01:52:28 matt
|
|
** made sure last line of all source files is a newline
|
|
**
|
|
** Revision 1.10 2000/07/10 05:28:30 matt
|
|
** moved joypad/oam dma from apu to ppu
|
|
**
|
|
** Revision 1.9 2000/07/10 03:03:16 matt
|
|
** added ppu_getcontext() routine
|
|
**
|
|
** Revision 1.8 2000/07/06 16:42:40 matt
|
|
** better palette setting interface
|
|
**
|
|
** Revision 1.7 2000/07/04 23:13:26 matt
|
|
** added an irq line drawing debug feature hack
|
|
**
|
|
** Revision 1.6 2000/06/26 04:58:08 matt
|
|
** accuracy changes
|
|
**
|
|
** Revision 1.5 2000/06/20 00:04:35 matt
|
|
** removed STATQUIRK macro
|
|
**
|
|
** Revision 1.4 2000/06/09 15:12:26 matt
|
|
** initial revision
|
|
**
|
|
*/
|