// license:BSD-3-Clause // copyright-holders:AJR /********************************************************************** National Semiconductor DP8350 Series CRT Controllers *********************************************************************** _____ _____ RSB 1 |* \__/ | 40 Vcc VBLANK 2 | | 39 RSA 50/60 HZ 3 | | 38 RL VSYNC 4 | | 37 RAE FULL/HALF 5 | | 36 A0 LC3 6 | | 35 A1 LC2 7 | | 34 A2 LC1 8 | | 33 A3 LC0 9 | | 32 A4 CLC 10 | | 31 A5 CGP 11 | DP835X | 30 A6 LBRE 12 | | 29 A7 LRC 13 | | 28 A8 HSYNC 14 | | 27 A9 RESET 15 | | 26 A10 LBC 16 | | 25 A11 ECLC 17 | | 24 LCGA LVSR 18 | | 23 DRC CUR 19 | | 22 X2 GND 20 |______________| 21 X1 **********************************************************************/ #ifndef MAME_VIDEO_DP8350_H #define MAME_VIDEO_DP8350_H #pragma once //************************************************************************** // TYPE DEFINITIONS //************************************************************************** // ======================> dp835x_device class dp835x_device : public device_t, public device_video_interface { public: // device configuration auto lrc_callback() { return m_lrc_callback.bind(); } auto clc_callback() { return m_clc_callback.bind(); } auto lc_callback() { return m_lc_callback.bind(); } auto lbre_callback() { return m_lbre_callback.bind(); } auto hsync_callback() { return m_hsync_callback.bind(); } auto vsync_callback() { return m_vsync_callback.bind(); } auto vblank_callback() { return m_vblank_callback.bind(); } void set_half_shift(bool half_shift) { m_half_shift = half_shift; } // write handlers DECLARE_WRITE_LINE_MEMBER(refresh_control); DECLARE_WRITE_LINE_MEMBER(character_generator_program); void register_load(u8 rs, u16 addr); // read handlers DECLARE_READ_LINE_MEMBER(lrc_r); u8 lc_r() { return m_lc; } DECLARE_READ_LINE_MEMBER(lbre_r); DECLARE_READ_LINE_MEMBER(hsync_r); DECLARE_READ_LINE_MEMBER(vsync_r); DECLARE_READ_LINE_MEMBER(vblank_r); // address getters (TODO: accurate character-by-character emulation) u16 top_of_page() const { return m_topr; } u16 row_start() const { return m_row_start; } u16 cursor_address() const { return m_cr; } protected: // base type constructor dp835x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int char_width, int char_height, int chars_per_row, int rows_per_frame, int vsync_delay_f1, int vsync_width_f1, int vblank_interval_f1, int vsync_delay_f0, int vsync_width_f0, int vblank_interval_f0, int chars_per_line, int hsync_delay, int hsync_width, int vblank_stop, bool cursor_on_all_lines, int lbc_0_width, int hsync_serration, bool hsync_active, bool vsync_active, bool vblank_active); // device-specific overrides virtual void device_config_complete() override; virtual void device_resolve_objects() override; virtual void device_start() override; virtual void device_clock_changed() override; virtual void device_reset() override; private: // internal helpers void reconfigure_screen(); // timer callbacks TIMER_CALLBACK_MEMBER(hblank_start); TIMER_CALLBACK_MEMBER(hblank_near_end); TIMER_CALLBACK_MEMBER(hsync_update); // mask parameters const int m_char_width; // character field cell size (width in dots) const int m_char_height; // character field cell size (height in scan lines) const int m_chars_per_row; // video characters per row const int m_rows_per_frame; // video characters per frame const int m_vsync_delay[2]; // delay from VBLANK start to VSYNC in scan lines const int m_vsync_width[2]; // vertical sync width in scan lines const int m_vblank_interval[2]; // scan lines of vertical blanking const int m_chars_per_line; // character times per scan line const int m_hsync_delay; // delay from HBLANK start to HSYNC in character times const int m_hsync_width; // horizontal sync width in character times const int m_vblank_stop; // VBLANK stop before video start in scan lines const bool m_cursor_on_all_lines; // true if cursor active on all scan lines of row const int m_lbc_0_width; // width of LBC 0 output within character time const int m_hsync_serration; // width of HSYNC pulse serrations within VSYNC (0 if unused) const bool m_hsync_active; // active level of horizontal sync pulse const bool m_vsync_active; // active level of vertical sync pulse const bool m_vblank_active; // active level of vertical blanking pulse // derived parameters const int m_dots_per_line; // number of dots per scan line const int m_dots_per_row; // number of dots displayed in each scan line const int m_video_scan_lines; // number of active scan lines between VBLANK periods // misc. configuration bool m_half_shift; // adjust screen parameters to allow half-dot shifting // device callbacks devcb_write_line m_lrc_callback; // line rate clock output (active high) devcb_write_line m_clc_callback; // clear line counter output (active low during blanking) devcb_write8 m_lc_callback; // line counter output devcb_write_line m_lbre_callback; // line buffer recirculate enable output (active high) devcb_write_line m_hsync_callback; // horizontal sync output (polarity may vary by type) devcb_write_line m_vsync_callback; // vertical sync output (polarity may vary by type) devcb_write_line m_vblank_callback; // vertical blanking output (polarity may vary by type) // internal registers and control parameters bool m_60hz_refresh; // refresh rate selector (true = f1, false = f0) bool m_cgpi; // character generator program/address mode input u16 m_topr; // top-of-page register u16 m_rsr; // row start register (to be loaded during next row) u16 m_cr; // cursor register u16 m_row_start; // start of current row u16 m_line; // current scan line (starting at HBLANK) // output state u8 m_lc; // 4-bit line counter // timers emu_timer *m_hblank_start_timer; emu_timer *m_hblank_near_end_timer; emu_timer *m_hsync_on_timer; emu_timer *m_hsync_off_timer; }; // ======================> dp8350_device class dp8350_device : public dp835x_device { public: // device constructor dp8350_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); }; // ======================> dp8367_device class dp8367_device : public dp835x_device { public: // device constructor dp8367_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); }; // ======================> dp835x_a_device class dp835x_a_device : public dp835x_device { public: // device constructor dp835x_a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); }; // device type declarations DECLARE_DEVICE_TYPE(DP8350, dp8350_device) DECLARE_DEVICE_TYPE(DP8367, dp8367_device) DECLARE_DEVICE_TYPE(DP835X_A, dp835x_a_device) #endif // MAME_VIDEO_DP8350_H