// license:BSD-3-Clause
// copyright-holders:Curt Coder
/**********************************************************************
RCA CDP1864C COS/MOS PAL Compatible Color TV Interface
**********************************************************************
_____ _____
INLACE 1 |* \_/ | 40 Vdd
CLK IN_ 2 | | 39 AUD
CLR OUT_ 3 | | 38 CLR IN_
AOE 4 | | 37 DMA0_
SC1 5 | | 36 INT_
SC0 6 | | 35 TPA
MRD_ 7 | | 34 TPB
BUS 7 8 | | 33 EVS
BUS 6 9 | | 32 V SYNC
BUS 5 10 | CDP1864 | 31 H SYNC
BUS 4 11 | | 30 C SYNC_
BUS 3 12 | | 29 RED
BUS 2 13 | | 28 BLUE
BUS 1 14 | | 27 GREEN
BUS 0 15 | | 26 BCK GND_
CON_ 16 | | 25 BURST
N2 17 | | 24 ALT
EF_ 18 | | 23 R DATA
N0 19 | | 22 G DATA
Vss 20 |_____________| 21 B DATA
http://homepage.mac.com/ruske/cosmacelf/cdp1864.pdf
**********************************************************************/
#ifndef MAME_SOUND_CDP1864_H
#define MAME_SOUND_CDP1864_H
#pragma once
#include "machine/rescap.h"
#include "video/resnet.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> cdp1864_device
class cdp1864_device : public device_t,
public device_sound_interface,
public device_video_interface
{
public:
static constexpr unsigned VISIBLE_COLUMNS = 64;
static constexpr unsigned VISIBLE_LINES = 192;
static constexpr unsigned HBLANK_END = 1 * 8;
static constexpr unsigned HBLANK_START = 13 * 8;
static constexpr unsigned HSYNC_START = 0 * 8;
static constexpr unsigned HSYNC_END = 1 * 8;
static constexpr unsigned SCREEN_START = 4 * 8;
static constexpr unsigned SCREEN_END = 12 * 8;
static constexpr unsigned SCREEN_WIDTH = 14 * 8;
static constexpr unsigned TOTAL_SCANLINES = 312;
static constexpr unsigned SCANLINE_VBLANK_START = TOTAL_SCANLINES - 4;
static constexpr unsigned SCANLINE_VBLANK_END = 20;
static constexpr unsigned SCANLINE_VSYNC_START = 0;
static constexpr unsigned SCANLINE_VSYNC_END = 4;
static constexpr unsigned SCANLINE_DISPLAY_START = 60; // ???
static constexpr unsigned SCANLINE_DISPLAY_END = SCANLINE_DISPLAY_START + VISIBLE_LINES;
static constexpr unsigned SCANLINE_INT_START = SCANLINE_DISPLAY_START - 2;
static constexpr unsigned SCANLINE_INT_END = SCANLINE_DISPLAY_START;
static constexpr unsigned SCANLINE_EFX_TOP_START = SCANLINE_DISPLAY_START - 4;
static constexpr unsigned SCANLINE_EFX_TOP_END = SCANLINE_DISPLAY_START;
static constexpr unsigned SCANLINE_EFX_BOTTOM_START = SCANLINE_DISPLAY_END - 4;
static constexpr unsigned SCANLINE_EFX_BOTTOM_END = SCANLINE_DISPLAY_END;
// construction/destruction
cdp1864_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
auto inlace_cb() { return m_read_inlace.bind(); }
auto int_cb() { return m_write_int.bind(); }
auto dma_out_cb() { return m_write_dma_out.bind(); }
auto efx_cb() { return m_write_efx.bind(); }
auto hsync_cb() { return m_write_hsync.bind(); }
auto rdata_cb() { return m_read_rdata.bind(); }
auto bdata_cb() { return m_read_bdata.bind(); }
auto gdata_cb() { return m_read_gdata.bind(); }
void set_chrominance(double r, double b, double g, double bkg) { m_chr_r = r; m_chr_b = b; m_chr_g = g; m_chr_bkg = bkg; }
DECLARE_READ8_MEMBER( dispon_r );
DECLARE_READ8_MEMBER( dispoff_r );
DECLARE_WRITE8_MEMBER( step_bgcolor_w );
DECLARE_WRITE8_MEMBER( tone_latch_w );
DECLARE_WRITE8_MEMBER( dma_w );
DECLARE_WRITE_LINE_MEMBER( con_w );
DECLARE_WRITE_LINE_MEMBER( aoe_w );
DECLARE_WRITE_LINE_MEMBER( evs_w );
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
protected:
// device-level overrides
virtual void device_config_complete() override;
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
// internal callbacks
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
private:
enum
{
TIMER_INT,
TIMER_EFX,
TIMER_DMA,
TIMER_HSYNC
};
void initialize_palette();
static constexpr int bckgnd[4] = { 2, 0, 4, 1 };
devcb_read_line m_read_inlace;
devcb_read_line m_read_rdata;
devcb_read_line m_read_bdata;
devcb_read_line m_read_gdata;
devcb_write_line m_write_int;
devcb_write_line m_write_dma_out;
devcb_write_line m_write_efx;
devcb_write_line m_write_hsync;
bitmap_rgb32 m_bitmap; // bitmap
sound_stream *m_stream; // sound output
// video state
double m_chr_r; // red chrominance resistor value
double m_chr_b; // blue chrominance resistor value
double m_chr_g; // green chrominance resistor value
double m_chr_bkg; // background chrominance resistor value
rgb_t m_palette[16];
int m_disp; // display on
int m_dmaout; // DMA request active
int m_bgcolor; // background color
int m_con; // color on
// sound state
int m_aoe; // audio on
int m_latch; // sound latch
int16_t m_signal; // current signal
int m_incr; // initial wave state
// timers
emu_timer *m_int_timer;
emu_timer *m_efx_timer;
emu_timer *m_dma_timer;
emu_timer *m_hsync_timer;
};
// device type definition
DECLARE_DEVICE_TYPE(CDP1864, cdp1864_device)
#endif // MAME_DEVICES_SOUND_CDP1864_H