diff options
Diffstat (limited to 'trunk/src/emu/video/psx.h')
-rw-r--r-- | trunk/src/emu/video/psx.h | 342 |
1 files changed, 342 insertions, 0 deletions
diff --git a/trunk/src/emu/video/psx.h b/trunk/src/emu/video/psx.h new file mode 100644 index 00000000000..f242457cba2 --- /dev/null +++ b/trunk/src/emu/video/psx.h @@ -0,0 +1,342 @@ +/* + * PlayStation GPU emulator + * + * Copyright 2003-2011 smf + * + */ + +#pragma once + +#ifndef __PSXGPU_H__ +#define __PSXGPU_H__ + +#include "emu.h" + +#define MCFG_PSXGPU_ADD( cputag, tag, type, _vramSize, clock ) \ + MCFG_DEVICE_ADD( tag, type, clock ) \ + ((psxgpu_device *) device)->vramSize = _vramSize; \ + MCFG_PSX_DMA_CHANNEL_READ( cputag, 2, psx_dma_write_delegate( FUNC( psxgpu_device::dma_read ), (psxgpu_device *) device ) ) \ + MCFG_PSX_DMA_CHANNEL_WRITE( cputag, 2, psx_dma_read_delegate( FUNC( psxgpu_device::dma_write ), (psxgpu_device *) device ) ) + +#define MCFG_PSXGPU_REPLACE( cputag, tag, type, _vramSize, clock ) \ + MCFG_DEVICE_REPLACE( tag, type, clock ) \ + ((psxgpu_device *) device)->vramSize = _vramSize; \ + MCFG_PSX_DMA_CHANNEL_READ( cputag, 2, psx_dma_write_delegate( FUNC( psxgpu_device::dma_read ), (psxgpu_device *) device ) ) \ + MCFG_PSX_DMA_CHANNEL_WRITE( cputag, 2, psx_dma_read_delegate( FUNC( psxgpu_device::dma_write ), (psxgpu_device *) device ) ) + +#define MCFG_PSXGPU_VBLANK_CALLBACK( _delegate ) \ + ((screen_device *) config.device_find( device, "screen" ))->register_vblank_callback( _delegate ); + +extern const device_type CXD8514Q; +extern const device_type CXD8538Q; +extern const device_type CXD8561Q; +extern const device_type CXD8561BQ; +extern const device_type CXD8561CQ; +extern const device_type CXD8654Q; + +#define STOP_ON_ERROR ( 0 ) + +#define MAX_LEVEL ( 32 ) +#define MID_LEVEL ( ( MAX_LEVEL / 2 ) << 8 ) +#define MAX_SHADE ( 0x100 ) +#define MID_SHADE ( 0x80 ) + +#define DEBUG_COORDS ( 10 ) +#define DEBUG_MAX ( 512 ) + +typedef struct _psx_gpu_debug psx_gpu_debug; +struct _psx_gpu_debug +{ + bitmap_ind16 *mesh; + int b_clear; + int b_mesh; + int n_skip; + int b_texture; + int n_interleave; + int n_coord; + int n_coordx[ DEBUG_COORDS ]; + int n_coordy[ DEBUG_COORDS ]; +}; + +struct FLATVERTEX +{ + PAIR n_coord; +}; + +struct GOURAUDVERTEX +{ + PAIR n_bgr; + PAIR n_coord; +}; + +struct FLATTEXTUREDVERTEX +{ + PAIR n_coord; + PAIR n_texture; +}; + +struct GOURAUDTEXTUREDVERTEX +{ + PAIR n_bgr; + PAIR n_coord; + PAIR n_texture; +}; + +union PACKET +{ + UINT32 n_entry[ 16 ]; + + struct + { + PAIR n_cmd; + struct FLATVERTEX vertex[ 2 ]; + PAIR n_size; + } MoveImage; + + struct + { + PAIR n_bgr; + PAIR n_coord; + PAIR n_size; + } FlatRectangle; + + struct + { + PAIR n_bgr; + PAIR n_coord; + } FlatRectangle8x8; + + struct + { + PAIR n_bgr; + PAIR n_coord; + } FlatRectangle16x16; + + struct + { + PAIR n_bgr; + PAIR n_coord; + PAIR n_texture; + } Sprite8x8; + + struct + { + PAIR n_bgr; + PAIR n_coord; + PAIR n_texture; + } Sprite16x16; + + struct + { + PAIR n_bgr; + PAIR n_coord; + PAIR n_texture; + PAIR n_size; + } FlatTexturedRectangle; + + struct + { + PAIR n_bgr; + struct FLATVERTEX vertex[ 4 ]; + } FlatPolygon; + + struct + { + struct GOURAUDVERTEX vertex[ 4 ]; + } GouraudPolygon; + + struct + { + PAIR n_bgr; + struct FLATVERTEX vertex[ 2 ]; + } MonochromeLine; + + struct + { + struct GOURAUDVERTEX vertex[ 2 ]; + } GouraudLine; + + struct + { + PAIR n_bgr; + struct FLATTEXTUREDVERTEX vertex[ 4 ]; + } FlatTexturedPolygon; + + struct + { + struct GOURAUDTEXTUREDVERTEX vertex[ 4 ]; + } GouraudTexturedPolygon; + + struct + { + PAIR n_bgr; + struct FLATVERTEX vertex; + } Dot; +}; + +class psxgpu_device : public device_t +{ +public: + // construction/destruction + psxgpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock); + virtual machine_config_constructor device_mconfig_additions() const; + + UINT32 update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + WRITE32_MEMBER( write ); + READ32_MEMBER( read ); + void dma_read( UINT32 n_address, INT32 n_size ); + void dma_write( UINT32 n_address, INT32 n_size ); + void lightgun_set( int, int ); + int vramSize; + void vblank(screen_device &screen, bool vblank_state); + +protected: + virtual void device_start(); + virtual void device_reset(); + + void updatevisiblearea(); + void decode_tpage( UINT32 tpage ); + void FlatPolygon( int n_points ); + void FlatTexturedPolygon( int n_points ); + void GouraudPolygon( int n_points ); + void GouraudTexturedPolygon( int n_points ); + void MonochromeLine( void ); + void GouraudLine( void ); + void FrameBufferRectangleDraw( void ); + void FlatRectangle( void ); + void FlatRectangle8x8( void ); + void FlatRectangle16x16( void ); + void FlatTexturedRectangle( void ); + void Sprite8x8( void ); + void Sprite16x16( void ); + void Dot( void ); + void MoveImage( void ); + void psx_gpu_init( int n_gputype ); + void gpu_reset(); + void gpu_read( UINT32 *p_ram, INT32 n_size ); + void gpu_write( UINT32 *p_ram, INT32 n_size ); + +#if defined( MAME_DEBUG ) + void DebugMeshInit( void ); + void DebugMesh( int n_coordx, int n_coordy ); + void DebugMeshEnd( void ); + void DebugCheckKeys( void ); + int DebugMeshDisplay( bitmap_ind16 &bitmap, const rectangle &cliprect ); + int DebugTextureDisplay( bitmap_ind16 &bitmap ); +#endif + + INT32 m_n_tx; + INT32 m_n_ty; + INT32 n_abr; + INT32 n_tp; + INT32 n_ix; + INT32 n_iy; + INT32 n_ti; + + UINT16 *p_vram; + UINT32 n_vramx; + UINT32 n_vramy; + UINT32 n_twy; + UINT32 n_twx; + UINT32 n_twh; + UINT32 n_tww; + UINT32 n_drawarea_x1; + UINT32 n_drawarea_y1; + UINT32 n_drawarea_x2; + UINT32 n_drawarea_y2; + UINT32 n_horiz_disstart; + UINT32 n_horiz_disend; + UINT32 n_vert_disstart; + UINT32 n_vert_disend; + UINT32 b_reverseflag; + INT32 n_drawoffset_x; + INT32 n_drawoffset_y; + UINT32 m_n_displaystartx; + UINT32 n_displaystarty; + int m_n_gputype; + UINT32 n_gpustatus; + UINT32 n_gpuinfo; + UINT32 n_gpu_buffer_offset; + UINT32 n_lightgun_x; + UINT32 n_lightgun_y; + UINT32 n_screenwidth; + UINT32 n_screenheight; + + PACKET m_packet; + + psx_gpu_debug m_debug; + + UINT16 *p_p_vram[ 1024 ]; + + UINT16 p_n_redshade[ MAX_LEVEL * MAX_SHADE ]; + UINT16 p_n_greenshade[ MAX_LEVEL * MAX_SHADE ]; + UINT16 p_n_blueshade[ MAX_LEVEL * MAX_SHADE ]; + UINT16 p_n_redlevel[ 0x10000 ]; + UINT16 p_n_greenlevel[ 0x10000 ]; + UINT16 p_n_bluelevel[ 0x10000 ]; + + UINT16 p_n_f025[ MAX_LEVEL * MAX_SHADE ]; + UINT16 p_n_f05[ MAX_LEVEL * MAX_SHADE ]; + UINT16 p_n_f1[ MAX_LEVEL * MAX_SHADE ]; + UINT16 p_n_redb05[ 0x10000 ]; + UINT16 p_n_greenb05[ 0x10000 ]; + UINT16 p_n_blueb05[ 0x10000 ]; + UINT16 p_n_redb1[ 0x10000 ]; + UINT16 p_n_greenb1[ 0x10000 ]; + UINT16 p_n_blueb1[ 0x10000 ]; + UINT16 p_n_redaddtrans[ MAX_LEVEL * MAX_LEVEL ]; + UINT16 p_n_greenaddtrans[ MAX_LEVEL * MAX_LEVEL ]; + UINT16 p_n_blueaddtrans[ MAX_LEVEL * MAX_LEVEL ]; + UINT16 p_n_redsubtrans[ MAX_LEVEL * MAX_LEVEL ]; + UINT16 p_n_greensubtrans[ MAX_LEVEL * MAX_LEVEL ]; + UINT16 p_n_bluesubtrans[ MAX_LEVEL * MAX_LEVEL ]; + + UINT16 p_n_g0r0[ 0x10000 ]; + UINT16 p_n_b0[ 0x10000 ]; + UINT16 p_n_r1[ 0x10000 ]; + UINT16 p_n_b1g1[ 0x10000 ]; +}; + +class cxd8514q_device : public psxgpu_device +{ +public: + // construction/destruction + cxd8514q_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class cxd8538q_device : public psxgpu_device +{ +public: + // construction/destruction + cxd8538q_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class cxd8561q_device : public psxgpu_device +{ +public: + // construction/destruction + cxd8561q_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class cxd8561bq_device : public psxgpu_device +{ +public: + // construction/destruction + cxd8561bq_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class cxd8561cq_device : public psxgpu_device +{ +public: + // construction/destruction + cxd8561cq_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class cxd8654q_device : public psxgpu_device +{ +public: + // construction/destruction + cxd8654q_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +#endif |