1 // license:BSD-3-Clause 2 // copyright-holders:Carl 3 #ifndef MAME_VIDEO_SCN2674_H 4 #define MAME_VIDEO_SCN2674_H 5 6 #pragma once 7 8 9 #define SCN2672_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int x, int y, uint8_t linecount, uint8_t charcode, uint8_t attrcode, uint16_t address, bool cursor, bool dw, bool lg, bool ul, bool blink) 10 11 #define SCN2674_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int x, int y, uint8_t linecount, uint8_t charcode, uint8_t attrcode, uint16_t address, bool cursor, bool dw, bool lg, bool ul, bool blink) 12 13 14 class scn2674_device : public device_t, 15 public device_video_interface, 16 public device_memory_interface 17 { 18 public: 19 typedef device_delegate<void (bitmap_rgb32 &bitmap, int x, int y, uint8_t linecount, uint8_t charcode, uint8_t attrcode, uint16_t address, bool cursor, bool dw, bool lg, bool ul, bool blink)> draw_character_delegate; 20 21 // static configuration intr_callback()22 auto intr_callback() { return m_intr_cb.bind(); } breq_callback()23 auto breq_callback() { return m_breq_cb.bind(); } mbc_callback()24 auto mbc_callback() { return m_mbc_cb.bind(); } mbc_char_callback()25 auto mbc_char_callback() { return m_mbc_char_cb.bind(); } mbc_attr_callback()26 auto mbc_attr_callback() { return m_mbc_attr_cb.bind(); } set_character_width(int value)27 void set_character_width(int value) { m_hpixels_per_column = value; } 28 set_display_callback(T &&...args)29 template <typename... T> void set_display_callback(T &&... args) { m_display_cb.set(std::forward<T>(args)...); } 30 31 scn2674_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 32 33 uint8_t read(offs_t offset); 34 void write(offs_t offset, uint8_t data); buffer_r()35 uint8_t buffer_r() { return m_char_buffer; } buffer_w(offs_t offset,uint8_t data)36 void buffer_w(offs_t offset, uint8_t data) { m_char_buffer = data; } attr_buffer_r()37 uint8_t attr_buffer_r() { return m_attr_buffer; } attr_buffer_w(offs_t offset,uint8_t data)38 void attr_buffer_w(offs_t offset, uint8_t data) { m_attr_buffer = data; } 39 40 uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 41 42 protected: 43 scn2674_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool extend_addressing); 44 45 virtual void device_start() override; 46 virtual void device_reset() override; 47 48 virtual space_config_vector memory_space_config() const override; 49 50 TIMER_CALLBACK_MEMBER(scanline_timer); 51 TIMER_CALLBACK_MEMBER(breq_timer); 52 TIMER_CALLBACK_MEMBER(vblank_timer); 53 54 //protected: 55 bitmap_rgb32 m_bitmap; 56 devcb_write_line m_intr_cb; 57 devcb_write_line m_breq_cb; 58 devcb_write_line m_mbc_cb; 59 devcb_read8 m_mbc_char_cb; 60 devcb_read8 m_mbc_attr_cb; 61 62 uint8_t m_IR_pointer; 63 uint16_t m_screen1_address; 64 uint16_t m_screen2_address; 65 uint16_t m_cursor_address; 66 uint8_t m_irq_register; 67 uint8_t m_status_register; 68 uint8_t m_irq_mask; 69 bool m_gfx_enabled; 70 bool m_display_enabled; 71 bool m_dadd_enabled; 72 bool m_display_enabled_field; 73 bool m_display_enabled_scanline; 74 bool m_cursor_enabled; 75 uint8_t m_hpixels_per_column; 76 bool m_double_ht_wd; 77 uint8_t m_scanline_per_char_row; 78 bool m_csync_select; 79 uint8_t m_buffer_mode_select; 80 bool m_interlace_enable; 81 uint8_t m_equalizing_constant; 82 bool m_use_row_table; 83 uint8_t m_horz_sync_width; 84 uint8_t m_horz_back_porch; 85 uint8_t m_vert_front_porch; 86 uint8_t m_vert_back_porch; 87 uint8_t m_rows_per_screen; 88 uint8_t m_character_blink_rate_divisor; 89 uint8_t m_character_per_row; 90 uint8_t m_cursor_first_scanline; 91 uint8_t m_cursor_last_scanline; 92 uint8_t m_cursor_underline_position; 93 uint8_t m_cursor_rate_divisor; 94 bool m_cursor_blink; 95 uint8_t m_vsync_width; 96 uint16_t m_display_buffer_first_address; 97 uint8_t m_display_buffer_last_address; 98 uint16_t m_display_pointer_address; 99 uint8_t m_reset_scanline_counter_on_scrollup; 100 uint8_t m_reset_scanline_counter_on_scrolldown; 101 bool m_scroll_start; 102 bool m_scroll_end; 103 uint8_t m_scroll_lines; 104 uint8_t m_split_register[2]; 105 uint8_t m_double[2]; 106 bool m_spl[2]; 107 uint8_t m_dbl1; 108 uint8_t m_char_buffer; 109 uint8_t m_attr_buffer; 110 int m_linecounter; 111 uint16_t m_address; 112 int m_start1change; 113 114 virtual void write_init_regs(uint8_t data); 115 void set_gfx_enabled(bool enabled); 116 void set_display_enabled(bool enabled, int n); 117 void set_cursor_enabled(bool enabled); 118 void reset_interrupt_status(uint8_t bits); 119 void write_interrupt_mask(bool enabled, uint8_t bits); 120 void write_delayed_command(uint8_t data); 121 void write_command(uint8_t data); 122 virtual void write_screen2_address(bool msb, uint8_t data); 123 124 void recompute_parameters(); 125 126 void scn2674_vram(address_map &map); 127 128 draw_character_delegate m_display_cb; 129 emu_timer *m_scanline_timer; 130 emu_timer *m_breq_timer; 131 emu_timer *m_vblank_timer; 132 address_space *m_char_space; 133 address_space *m_attr_space; 134 const address_space_config m_char_space_config; 135 const address_space_config m_attr_space_config; 136 }; 137 138 class scn2672_device : public scn2674_device 139 { 140 public: 141 scn2672_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 142 143 protected: 144 virtual void write_init_regs(uint8_t data) override; 145 virtual void write_screen2_address(bool msb, uint8_t data) override; 146 }; 147 148 149 DECLARE_DEVICE_TYPE(SCN2672, scn2672_device) 150 DECLARE_DEVICE_TYPE(SCN2674, scn2674_device) 151 152 #endif // MAME_VIDEO_SCN2674_H 153