// license:BSD-3-Clause // copyright-holders:Wilbert Pol /*************************************************************************** i8244.h Intel 8244 (NTSC)/8245 (PAL) Graphics and sound chip ***************************************************************************/ #ifndef MAME_VIDEO_I8244_H #define MAME_VIDEO_I8244_H #pragma once #include "emupal.h" /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ // ======================> i8244_device class i8244_device : public device_t , public device_sound_interface , public device_video_interface { public: // construction/destruction i8244_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // configuration helpers auto irq_cb() { return m_irq_func.bind(); } auto postprocess_cb() { return m_postprocess_func.bind(); } DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); DECLARE_READ_LINE_MEMBER(vblank); DECLARE_READ_LINE_MEMBER(hblank); void i8244_palette(palette_device &palette) const; uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); inline bitmap_ind16 *get_bitmap() { return &m_tmp_bitmap; } // Global constants static constexpr int START_ACTIVE_SCAN = 42; static constexpr int BORDER_SIZE = 10; static constexpr int END_ACTIVE_SCAN = 42 + 10 + 320 + 10; static constexpr int START_Y = 1; static constexpr int SCREEN_HEIGHT = 243; static constexpr int LINE_CLOCKS = 455; static constexpr int LINES = 262; protected: union vdc_t { uint8_t reg[0x100]; struct { struct { uint8_t y,x,color,res; } sprites[4]; struct { uint8_t y,x,ptr,color; } foreground[12]; struct { struct { uint8_t y,x,ptr,color; } single[4]; } quad[4]; uint8_t shape[4][8]; uint8_t control; uint8_t status; uint8_t collision; uint8_t color; uint8_t y; uint8_t x; uint8_t res; uint8_t shift1; uint8_t shift2; uint8_t shift3; uint8_t sound; uint8_t res2[5+0x10]; uint8_t hgrid[2][0x10]; uint8_t vgrid[0x10]; } s; }; i8244_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int lines); // 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; // device_sound_interface overrides virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; void render_scanline(int vpos); int get_y_beam(); int get_x_beam(); offs_t fix_register_mirrors( offs_t offset ); // Local constants static constexpr uint8_t VDC_CONTROL_REG_STROBE_XY = 0x02; /* timers */ static constexpr device_timer_id TIMER_LINE = 0; static constexpr device_timer_id TIMER_HBLANK = 1; // callbacks devcb_write_line m_irq_func; devcb_write16 m_postprocess_func; bitmap_ind16 m_tmp_bitmap; emu_timer *m_line_timer; emu_timer *m_hblank_timer; sound_stream *m_stream; int m_start_vpos; int m_start_vblank; int m_screen_lines; vdc_t m_vdc; uint16_t m_sh_count; uint8_t m_x_beam_pos; uint8_t m_y_beam_pos; uint8_t m_control_status; uint8_t m_collision_status; int m_iff; }; class i8245_device : public i8244_device { public: // construction/destruction i8245_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); static constexpr int LINES = 312; }; // device type definition DECLARE_DEVICE_TYPE(I8244, i8244_device) DECLARE_DEVICE_TYPE(I8245, i8245_device) #endif // MAME_VIDEO_I8244_H