summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/acorn_vidc.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/acorn_vidc.h')
-rw-r--r--src/devices/machine/acorn_vidc.h176
1 files changed, 116 insertions, 60 deletions
diff --git a/src/devices/machine/acorn_vidc.h b/src/devices/machine/acorn_vidc.h
index 7a73e6c277c..49b5c0dca54 100644
--- a/src/devices/machine/acorn_vidc.h
+++ b/src/devices/machine/acorn_vidc.h
@@ -13,7 +13,6 @@
#include "speaker.h"
#include "sound/dac.h"
-#include "sound/volt_reg.h"
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
@@ -33,107 +32,164 @@ class acorn_vidc10_device : public device_t,
public device_video_interface
{
public:
- // construction/destruction
- acorn_vidc10_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
// I/O operations
- DECLARE_WRITE32_MEMBER( write );
- DECLARE_READ_LINE_MEMBER( flyback_r );
+ void write(offs_t offset, u32 data, u32 mem_mask = ~0);
+ int flyback_r();
auto vblank() { return m_vblank_cb.bind(); }
auto sound_drq() { return m_sound_drq_cb.bind(); }
// MEMC comms
- void write_vram(uint32_t offset, uint8_t data) { m_data_vram[offset & (m_data_vram_mask)] = data; }
- void write_cram(uint32_t offset, uint8_t data) { m_cursor_vram[offset & (m_cursor_vram_mask)] = data; }
- void write_dac(uint8_t channel, uint8_t data);
- void clear_dac(uint8_t channel) { m_dac[channel & 7]->write(0); }
+ void write_vram(u32 offset, u8 data) { m_data_vram[offset & (m_data_vram_mask)] = data; }
+ void write_cram(u32 offset, u8 data) { m_cursor_vram[offset & (m_cursor_vram_mask)] = data; }
+ void write_dac(u8 channel, u8 data);
+ void clear_dac(u8 channel) { m_dac[channel & 7]->write(0); }
void update_sound_mode(bool state) { m_sound_mode = state; refresh_sound_frequency(); }
void set_cursor_enable(bool state) { m_cursor_enable = state; }
- uint32_t get_cursor_size() { return (m_crtc_regs[CRTC_VCER] - m_crtc_regs[CRTC_VCSR]) * (32/4); }
+ u32 get_cursor_size() { return (m_crtc_regs[CRTC_VCER] - m_crtc_regs[CRTC_VCSR]) * (32/4); }
+
+ virtual bool get_dac_mode() { return false; }
protected:
- acorn_vidc10_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+ acorn_vidc10_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int dac_type);
// device-level overrides
//virtual void device_validity_check(validity_checker &valid) const override;
- virtual void device_add_mconfig(machine_config &config) override;
- virtual uint32_t palette_entries() const override;
+ virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
+ virtual u32 palette_entries() const noexcept override;
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;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
virtual space_config_vector memory_space_config() const override;
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ virtual u32 get_pixel_clock();
-private:
- const address_space_config m_space_config;
+ TIMER_CALLBACK_MEMBER(vblank_timer);
+ TIMER_CALLBACK_MEMBER(sound_drq_timer);
+
+ address_space_config m_space_config;
+
+ void regs_map(address_map &map) ATTR_COLD;
+
+ enum {
+ CRTC_HCR = 0, CRTC_HSWR, CRTC_HBSR, CRTC_HDSR, CRTC_HDER, CRTC_HBER, CRTC_HCSR, CRTC_HIR,
+ CRTC_VCR, CRTC_VSWR, CRTC_VBSR, CRTC_VDSR, CRTC_VDER, CRTC_VBER, CRTC_VCSR, CRTC_VCER
+ };
+ u32 m_crtc_regs[16];
+
+ inline void screen_vblank_line_update();
+ inline void screen_dynamic_res_change();
+ void refresh_sound_frequency();
+
+ u16 m_pal_4bpp_base;
+ u16 m_pal_cursor_base;
+ u16 m_pal_border_base;
- void regs_map(address_map &map);
+ u8 m_bpp_mode, m_crtc_interlace;
+ u8 m_sound_frequency_latch;
+ bool m_sound_mode;
- required_device<speaker_device> m_lspeaker;
- required_device<speaker_device> m_rspeaker;
required_device_array<dac_16bit_r2r_twos_complement_device, 8> m_dac;
+ int m_dac_type;
+
+ required_device<speaker_device> m_speaker;
+
+ virtual void refresh_stereo_image(u8 channel);
+ const int m_sound_max_channels = 8;
+private:
devcb_write_line m_vblank_cb;
devcb_write_line m_sound_drq_cb;
- DECLARE_WRITE32_MEMBER( pal_data_display_w );
- DECLARE_WRITE32_MEMBER( pal_data_cursor_w );
- DECLARE_WRITE32_MEMBER( stereo_image_w );
- DECLARE_WRITE32_MEMBER( crtc_w );
- DECLARE_WRITE32_MEMBER( sound_frequency_w );
- DECLARE_WRITE32_MEMBER( control_w );
+ void pal_data_display_w(offs_t offset, u32 data);
+ void pal_data_cursor_w(offs_t offset, u32 data);
+ void stereo_image_w(offs_t offset, u32 data);
+ void crtc_w(offs_t offset, u32 data);
+ void sound_frequency_w(u32 data);
+ void control_w(u32 data);
- uint8_t m_pixel_clock, m_bpp_mode, m_crtc_interlace;
+ u8 m_pixel_clock;
+ bool m_cursor_enable;
//bool m_flyback;
- enum {
- TIMER_VIDEO = 1,
- TIMER_SOUND = 2
- };
emu_timer *m_video_timer;
emu_timer *m_sound_timer;
- inline void screen_vblank_line_update();
- void screen_dynamic_res_change();
-
- enum {
- CRTC_HCR = 0, CRTC_HSWR, CRTC_HBSR, CRTC_HDSR, CRTC_HDER, CRTC_HBER, CRTC_HCSR, CRTC_HIR,
- CRTC_VCR, CRTC_VSWR, CRTC_VBSR, CRTC_VDSR, CRTC_VDER, CRTC_VBER, CRTC_VCSR, CRTC_VCER
- };
- uint32_t m_crtc_regs[16];
- u8 *m_data_vram;
- u8 *m_cursor_vram;
+ std::unique_ptr<u8[]> m_data_vram;
+ std::unique_ptr<u8[]> m_cursor_vram;
// TODO: correct data vram size
const u32 m_data_vram_mask = 0x1fffff;
const u32 m_cursor_vram_mask = 0x7fff;
const u32 m_data_vram_size = m_data_vram_mask+1;
const u32 m_cursor_vram_size = m_cursor_vram_mask+1;
- bool m_cursor_enable;
- void draw(bitmap_rgb32 &bitmap, const rectangle &cliprect, u8 *vram, uint8_t bpp, int xstart, int ystart, int xsize, int ysize, bool is_cursor);
- inline void update_4bpp_palette(uint16_t index, uint32_t paldata);
+ void draw(bitmap_rgb32 &bitmap, const rectangle &cliprect, u8 *vram, u8 bpp, int xstart, int ystart, int xsize, int ysize, bool is_cursor);
+ inline void update_4bpp_palette(u16 index, u32 paldata);
+ u32 m_crtc_raw_horz[2];
+ inline u32 convert_crtc_hdisplay(u8 index);
- u8 m_sound_frequency_latch;
- bool m_sound_frequency_test_bit;
- bool m_sound_mode;
+ bool m_sound_frequency_test_bit;
u8 m_stereo_image[8];
- const float m_sound_input_gain = 0.05;
- const int m_sound_max_channels = 8;
+ const float m_sound_input_gain = 0.05f;
int16_t m_ulaw_lookup[256];
- void refresh_sound_frequency();
- inline void refresh_stereo_image(uint8_t channel);
};
-class acorn_vidc10_lcd_device : public acorn_vidc10_device
+class acorn_vidc1_device : public acorn_vidc10_device
{
public:
// construction/destruction
- acorn_vidc10_lcd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-protected:
- virtual void device_add_mconfig(machine_config &config) override;
+ acorn_vidc1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
+class acorn_vidc1a_device : public acorn_vidc10_device
+{
+public:
+ // construction/destruction
+ acorn_vidc1a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
// device type definition
-DECLARE_DEVICE_TYPE(ACORN_VIDC10, acorn_vidc10_device)
-DECLARE_DEVICE_TYPE(ACORN_VIDC10_LCD, acorn_vidc10_lcd_device)
+DECLARE_DEVICE_TYPE(ACORN_VIDC1, acorn_vidc1_device)
+DECLARE_DEVICE_TYPE(ACORN_VIDC1A, acorn_vidc1a_device)
+
+class arm_vidc20_device : public acorn_vidc10_device
+{
+public:
+ // construction/destruction
+ arm_vidc20_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ void write_dac32(u8 channel, u16 data);
+ virtual bool get_dac_mode() override;
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
+ void regs_map(address_map &map) ATTR_COLD;
+ virtual u32 palette_entries() const noexcept override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
+ virtual void device_config_complete() override;
+ u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ virtual u32 get_pixel_clock() override;
+
+private:
+ void vidc20_pal_data_display_w(offs_t offset, u32 data);
+ void vidc20_pal_data_index_w(u32 data);
+ void vidc20_pal_data_cursor_w(offs_t offset, u32 data);
+ void vidc20_crtc_w(offs_t offset, u32 data);
+ void vidc20_control_w(u32 data);
+ void vidc20_sound_frequency_w(u32 data);
+ void vidc20_sound_control_w(u32 data);
+ void fsynreg_w(u32 data);
+
+ u8 m_pal_data_index;
+ inline void update_8bpp_palette(u16 index, u32 paldata);
+ bool m_dac_serial_mode;
+ u8 m_pixel_source;
+ u8 m_pixel_rate;
+ u8 m_vco_r_modulo;
+ u8 m_vco_v_modulo;
+
+ required_device_array<dac_16bit_r2r_twos_complement_device, 2> m_dac32;
+
+ virtual void refresh_stereo_image(u8 channel) override;
+};
+DECLARE_DEVICE_TYPE(ARM_VIDC20, arm_vidc20_device)
//**************************************************************************
@@ -141,4 +197,4 @@ DECLARE_DEVICE_TYPE(ACORN_VIDC10_LCD, acorn_vidc10_lcd_device)
//**************************************************************************
-#endif // MAME_MACHINE_ACORN_VIDC10_H
+#endif // MAME_MACHINE_ACORN_VIDC_H