summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/emu/cpu/psx/mdec.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/emu/cpu/psx/mdec.h')
-rw-r--r--trunk/src/emu/cpu/psx/mdec.h74
1 files changed, 74 insertions, 0 deletions
diff --git a/trunk/src/emu/cpu/psx/mdec.h b/trunk/src/emu/cpu/psx/mdec.h
new file mode 100644
index 00000000000..d4dc2379c63
--- /dev/null
+++ b/trunk/src/emu/cpu/psx/mdec.h
@@ -0,0 +1,74 @@
+/*
+ * PlayStation DMA emulator
+ *
+ * Copyright 2003-2011 smf
+ *
+ */
+
+#pragma once
+
+#ifndef __PSXMDEC_H__
+#define __PSXMDEC_H__
+
+#include "emu.h"
+
+extern const device_type PSX_MDEC;
+
+#define DCTSIZE ( 8 )
+#define DCTSIZE2 ( DCTSIZE * DCTSIZE )
+
+#define MDEC_COS_PRECALC_BITS ( 21 )
+
+class psxmdec_device : public device_t
+{
+public:
+ psxmdec_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ WRITE32_MEMBER( write );
+ READ32_MEMBER( read );
+
+ void dma_write( UINT32 n_address, INT32 n_size );
+ void dma_read( UINT32 n_address, INT32 n_size );
+
+protected:
+ virtual void device_start();
+ virtual void device_reset();
+ virtual void device_post_load();
+
+private:
+ void mdec_cos_precalc();
+ void mdec_idct( INT32 *p_n_src, INT32 *p_n_dst );
+ UINT32 mdec_unpack( UINT32 n_address );
+ UINT16 mdec_clamp_r5( INT32 n_r ) const;
+ UINT16 mdec_clamp_g5( INT32 n_g ) const;
+ UINT16 mdec_clamp_b5( INT32 n_b ) const;
+ UINT16 mdec_clamp8( INT32 n_r ) const;
+ void mdec_yuv2_to_rgb15( void );
+ void mdec_yuv2_to_rgb24( void );
+ void mdec_makergb15( UINT32 n_address, INT32 n_r, INT32 n_g, INT32 n_b, INT32 *p_n_y, UINT16 n_stp );
+ void mdec_makergb24( UINT32 n_address, INT32 n_r, INT32 n_g, INT32 n_b, INT32 *p_n_y, UINT32 n_stp );
+
+ UINT32 n_decoded;
+ UINT32 n_offset;
+ UINT16 p_n_output[ 24 * 16 ];
+
+ INT32 p_n_quantize_y[ DCTSIZE2 ];
+ INT32 p_n_quantize_uv[ DCTSIZE2 ];
+ INT32 p_n_cos[ DCTSIZE2 ];
+ INT32 p_n_cos_precalc[ DCTSIZE2 * DCTSIZE2 ];
+
+ UINT32 n_0_command;
+ UINT32 n_0_address;
+ UINT32 n_0_size;
+ UINT32 n_1_command;
+ UINT32 n_1_status;
+
+ UINT16 p_n_clamp8[ 256 * 3 ];
+ UINT16 p_n_r5[ 256 * 3 ];
+ UINT16 p_n_g5[ 256 * 3 ];
+ UINT16 p_n_b5[ 256 * 3 ];
+
+ INT32 m_p_n_unpacked[ DCTSIZE2 * 6 * 2 ];
+};
+
+#endif