summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/emu/sound/cdp1869.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/emu/sound/cdp1869.h')
-rw-r--r--trunk/src/emu/sound/cdp1869.h313
1 files changed, 313 insertions, 0 deletions
diff --git a/trunk/src/emu/sound/cdp1869.h b/trunk/src/emu/sound/cdp1869.h
new file mode 100644
index 00000000000..b56f82f76d6
--- /dev/null
+++ b/trunk/src/emu/sound/cdp1869.h
@@ -0,0 +1,313 @@
+/**********************************************************************
+
+ RCA CDP1869/1870/1876 Video Interface System (VIS) emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+**********************************************************************
+ _____ _____
+ TPA 1 |* \_/ | 40 Vdd
+ TPB 2 | | 39 PMSEL
+ _MRD 3 | | 38 _PMWR
+ _MWR 4 | | 37 CMSEL
+ MA0/8 5 | | 36 _CMWR
+ MA1/9 6 | | 35 PMA0
+ MA2/10 7 | | 34 PMA1
+ MA3/11 8 | | 33 PMA2
+ MA4/12 9 | | 32 PMA3
+ MA5/13 10 | | 31 PMA4
+ MA6/14 11 | CDP1869 | 30 PMA5
+ MA7/15 12 | | 29 PMA6
+ N0 13 | | 28 PMA7
+ N1 14 | | 27 PMA8
+ N2 15 | | 26 PMA9
+ _H SYNC 16 | | 25 CMA3/PMA10
+ _DISPLAY 17 | | 24 CMA2
+ _ADDRSTB 18 | | 23 CMA1
+ SOUND 19 | | 22 CMA0
+ Vss 20 |_____________| 21 _N=3
+
+ _____ _____
+ _PREDISPLAY 1 |* \_/ | 40 Vdd
+ _DISPLAY 2 | | 39 PAL/_NTSC
+ PCB 3 | | 38 CPUCLK
+ CCB1 4 | | 37 XTAL (DOT)
+ BUS7 5 | | 36 _XTAL (DOT)
+ CCB0 6 | | 35 _ADDRSTB
+ BUS6 7 | | 34 _MRD
+ CDB5 8 | | 33 TPB
+ BUS5 9 | | 32 CMSEL
+ CDB4 10 | | 31 BURST
+ BUS4 11 | CDP1870 | 30 _H SYNC
+ CDB3 12 | | 29 _COMPSYNC
+ BUS3 13 | | 28 LUM
+ CDB2 14 | | 27 PAL CHROM
+ BUS2 15 | | 26 NTSC CHROM
+ CDB1 16 | | 25 _XTAL (CHROM)
+ BUS1 17 | | 24 XTAL (CHROM)
+ CDB0 18 | | 23 _EMS
+ BUS0 19 | | 22 _EVS
+ Vss 20 |_____________| 21 _N=3
+
+ _____ _____
+ _PREDISPLAY 1 |* \_/ | 40 Vdd
+ _DISPLAY 2 | | 39 PAL/_NTSC
+ PCB 3 | | 38 CPUCLK
+ CCB1 4 | | 37 XTAL (DOT)
+ BUS7 5 | | 36 _XTAL (DOT)
+ CCB0 6 | | 35 _ADDRSTB
+ BUS6 7 | | 34 _MRD
+ CDB5 8 | | 33 TPB
+ BUS5 9 | | 32 CMSEL
+ CDB4 10 | | 31 BURST
+ BUS4 11 | CDP1876 | 30 _H SYNC
+ CDB3 12 | | 29 _COMPSYNC
+ BUS3 13 | | 28 RED
+ CDB2 14 | | 27 BLUE
+ BUS2 15 | | 26 GREEN
+ CDB1 16 | | 25 _XTAL (CHROM)
+ BUS1 17 | | 24 XTAL (CHROM)
+ CDB0 18 | | 23 _EMS
+ BUS0 19 | | 22 _EVS
+ Vss 20 |_____________| 21 _N=3
+
+**********************************************************************/
+
+#pragma once
+
+#ifndef __CDP1869__
+#define __CDP1869__
+
+#include "emu.h"
+
+
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+
+#define CDP1869_DOT_CLK_PAL (float)XTAL_5_626MHz
+#define CDP1869_DOT_CLK_NTSC (float)XTAL_5_67MHz
+#define CDP1869_COLOR_CLK_PAL (float)XTAL_8_867236MHz
+#define CDP1869_COLOR_CLK_NTSC (float)XTAL_7_15909MHz
+
+#define CDP1869_CPU_CLK_PAL (CDP1869_DOT_CLK_PAL / 2)
+#define CDP1869_CPU_CLK_NTSC (CDP1869_DOT_CLK_NTSC / 2)
+
+#define CDP1869_CHAR_WIDTH 6
+
+#define CDP1869_HSYNC_START (56 * CDP1869_CHAR_WIDTH)
+#define CDP1869_HSYNC_END (60 * CDP1869_CHAR_WIDTH)
+#define CDP1869_HBLANK_START (54 * CDP1869_CHAR_WIDTH)
+#define CDP1869_HBLANK_END ( 5 * CDP1869_CHAR_WIDTH)
+#define CDP1869_SCREEN_START_PAL ( 9 * CDP1869_CHAR_WIDTH)
+#define CDP1869_SCREEN_START_NTSC (10 * CDP1869_CHAR_WIDTH)
+#define CDP1869_SCREEN_START (10 * CDP1869_CHAR_WIDTH)
+#define CDP1869_SCREEN_END (50 * CDP1869_CHAR_WIDTH)
+#define CDP1869_SCREEN_WIDTH (60 * CDP1869_CHAR_WIDTH)
+
+#define CDP1869_TOTAL_SCANLINES_PAL 312
+#define CDP1869_SCANLINE_VBLANK_START_PAL 304
+#define CDP1869_SCANLINE_VBLANK_END_PAL 10
+#define CDP1869_SCANLINE_VSYNC_START_PAL 308
+#define CDP1869_SCANLINE_VSYNC_END_PAL 312
+#define CDP1869_SCANLINE_DISPLAY_START_PAL 44
+#define CDP1869_SCANLINE_DISPLAY_END_PAL 260
+#define CDP1869_SCANLINE_PREDISPLAY_START_PAL 43
+#define CDP1869_SCANLINE_PREDISPLAY_END_PAL 260
+#define CDP1869_VISIBLE_SCANLINES_PAL (CDP1869_SCANLINE_DISPLAY_END_PAL - CDP1869_SCANLINE_DISPLAY_START_PAL)
+
+#define CDP1869_TOTAL_SCANLINES_NTSC 262
+#define CDP1869_SCANLINE_VBLANK_START_NTSC 252
+#define CDP1869_SCANLINE_VBLANK_END_NTSC 10
+#define CDP1869_SCANLINE_VSYNC_START_NTSC 258
+#define CDP1869_SCANLINE_VSYNC_END_NTSC 262
+#define CDP1869_SCANLINE_DISPLAY_START_NTSC 36
+#define CDP1869_SCANLINE_DISPLAY_END_NTSC 228
+#define CDP1869_SCANLINE_PREDISPLAY_START_NTSC 35
+#define CDP1869_SCANLINE_PREDISPLAY_END_NTSC 228
+#define CDP1869_VISIBLE_SCANLINES_NTSC (CDP1869_SCANLINE_DISPLAY_END_NTSC - CDP1869_SCANLINE_DISPLAY_START_NTSC)
+
+#define CDP1869_PALETTE_LENGTH 8+64
+
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_CDP1869_ADD(_tag, _pixclock, _config, _map) \
+ MCFG_DEVICE_ADD(_tag, CDP1869, _pixclock) \
+ MCFG_DEVICE_CONFIG(_config) \
+ MCFG_DEVICE_ADDRESS_MAP(AS_0, _map)
+
+#define MCFG_CDP1869_SCREEN_PAL_ADD(_cdptag, _tag, _clock) \
+ MCFG_SCREEN_ADD(_tag, RASTER) \
+ MCFG_SCREEN_UPDATE_DEVICE(_cdptag, cdp1869_device, screen_update) \
+ MCFG_SCREEN_RAW_PARAMS(_clock, CDP1869_SCREEN_WIDTH, CDP1869_HBLANK_END, CDP1869_HBLANK_START, CDP1869_TOTAL_SCANLINES_PAL, CDP1869_SCANLINE_VBLANK_END_PAL, CDP1869_SCANLINE_VBLANK_START_PAL) \
+ MCFG_PALETTE_LENGTH(8+64)
+
+#define MCFG_CDP1869_SCREEN_NTSC_ADD(_cdptag, _tag, _clock) \
+ MCFG_SCREEN_ADD(_tag, RASTER) \
+ MCFG_SCREEN_UPDATE_DEVICE(_cdptag, cdp1869_device, screen_update) \
+ MCFG_SCREEN_RAW_PARAMS(_clock, CDP1869_SCREEN_WIDTH, CDP1869_HBLANK_END, CDP1869_HBLANK_START, CDP1869_TOTAL_SCANLINES_NTSC, CDP1869_SCANLINE_VBLANK_END_NTSC, CDP1869_SCANLINE_VBLANK_START_NTSC) \
+ MCFG_PALETTE_LENGTH(8+64)
+
+#define CDP1869_INTERFACE(_name) \
+ const cdp1869_interface (_name) =
+
+#define CDP1869_CHAR_RAM_READ(name) UINT8 name(device_t *device, UINT16 pma, UINT8 cma, UINT8 pmd)
+#define CDP1869_CHAR_RAM_WRITE(name) void name(device_t *device, UINT16 pma, UINT8 cma, UINT8 pmd, UINT8 data)
+#define CDP1869_PCB_READ(name) int name(device_t *device, UINT16 pma, UINT8 cma, UINT8 pmd)
+
+#define CDP1869_PAL \
+ DEVCB_LINE_VCC
+
+#define CDP1869_NTSC \
+ DEVCB_LINE_GND
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+typedef UINT8 (*cdp1869_char_ram_read_func)(device_t *device, UINT16 pma, UINT8 cma, UINT8 pmd);
+typedef void (*cdp1869_char_ram_write_func)(device_t *device, UINT16 pma, UINT8 cma, UINT8 pmd, UINT8 data);
+typedef int (*cdp1869_pcb_read_func)(device_t *device, UINT16 pma, UINT8 cma, UINT8 pmd);
+
+
+// ======================> cdp1869_interface
+
+struct cdp1869_interface
+{
+ const char *screen_tag; // screen we are acting on
+
+ // pixel clock of the chip is the device clock
+ int color_clock; // the chroma clock of the chip
+
+ // screen format
+ devcb_read_line in_pal_ntsc_cb;
+
+ // page memory color bit read function
+ cdp1869_pcb_read_func in_pcb_cb;
+
+ // character memory read function
+ cdp1869_char_ram_read_func in_char_ram_cb;
+
+ // character memory write function
+ cdp1869_char_ram_write_func out_char_ram_cb;
+
+ // if specified, this gets called for every change of the predisplay pin (CDP1870/76 pin 1)
+ devcb_write_line out_prd_cb;
+};
+
+
+
+// ======================> cdp1869_device
+
+class cdp1869_device : public device_t,
+ public device_sound_interface,
+ public device_memory_interface,
+ public cdp1869_interface
+{
+public:
+ // construction/destruction
+ cdp1869_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ DECLARE_WRITE8_MEMBER( out3_w );
+ DECLARE_WRITE8_MEMBER( out4_w );
+ DECLARE_WRITE8_MEMBER( out5_w );
+ DECLARE_WRITE8_MEMBER( out6_w );
+ DECLARE_WRITE8_MEMBER( out7_w );
+
+ DECLARE_READ8_MEMBER( char_ram_r );
+ DECLARE_WRITE8_MEMBER( char_ram_w );
+
+ DECLARE_READ8_MEMBER( page_ram_r );
+ DECLARE_WRITE8_MEMBER( page_ram_w );
+
+ DECLARE_READ_LINE_MEMBER( predisplay_r );
+ DECLARE_READ_LINE_MEMBER( pal_ntsc_r );
+
+ UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+protected:
+ // device-level overrides
+ virtual void device_config_complete();
+ virtual void device_start();
+ virtual void device_post_load();
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
+
+ // device_memory_interface overrides
+ virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const;
+
+ // device_sound_interface callbacks
+ virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
+
+ inline bool is_ntsc();
+ inline UINT8 read_page_ram_byte(offs_t address);
+ inline void write_page_ram_byte(offs_t address, UINT8 data);
+ inline UINT8 read_char_ram_byte(offs_t pma, offs_t cma, UINT8 pmd);
+ inline void write_char_ram_byte(offs_t pma, offs_t cma, UINT8 pmd, UINT8 data);
+ inline int read_pcb(offs_t pma, offs_t cma, UINT8 pmd);
+ inline void update_prd_changed_timer();
+ inline rgb_t get_rgb(int i, int c, int l);
+ inline int get_lines();
+ inline UINT16 get_pmemsize(int cols, int rows);
+ inline UINT16 get_pma();
+ inline int get_pen(int ccb0, int ccb1, int pcb);
+
+ void initialize_palette();
+ void draw_line(bitmap_ind16 &bitmap, const rectangle &rect, int x, int y, UINT8 data, int color);
+ void draw_char(bitmap_ind16 &bitmap, const rectangle &rect, int x, int y, UINT16 pma);
+
+private:
+ devcb_resolved_read_line m_in_pal_ntsc_func;
+ devcb_resolved_write_line m_out_prd_func;
+ cdp1869_pcb_read_func m_in_pcb_func;
+ cdp1869_char_ram_read_func m_in_char_ram_func;
+ cdp1869_char_ram_write_func m_out_char_ram_func;
+
+ screen_device *m_screen;
+ address_space *m_page_ram;
+ emu_timer *m_prd_timer;
+ sound_stream *m_stream;
+
+ // video state
+ int m_prd; // predisplay
+ int m_dispoff; // display off
+ int m_fresvert; // full resolution vertical
+ int m_freshorz; // full resolution horizontal
+ int m_cmem; // character memory access mode
+ int m_dblpage; // double page mode
+ int m_line16; // 16-line hi-res mode
+ int m_line9; // 9 line mode
+ int m_cfc; // color format control
+ UINT8 m_col; // character color control
+ UINT8 m_bkg; // background color
+ UINT16 m_pma; // page memory address
+ UINT16 m_hma; // home memory address
+
+ // sound state
+ INT16 m_signal; // current signal
+ int m_incr; // initial wave state
+ int m_toneoff; // tone off
+ int m_wnoff; // white noise off
+ UINT8 m_tonediv; // tone divisor
+ UINT8 m_tonefreq; // tone range select
+ UINT8 m_toneamp; // tone output amplitude
+ UINT8 m_wnfreq; // white noise range select
+ UINT8 m_wnamp; // white noise output amplitude
+
+ const address_space_config m_space_config;
+};
+
+
+// device type definition
+extern const device_type CDP1869;
+
+
+
+#endif