// license:BSD-3-Clause // copyright-holders:Jean-Francois DEL NERO /********************************************************************* ef9365.h Thomson EF9365/EF9366 video controller *********************************************************************/ #ifndef MAME_VIDEO_EF9365_H #define MAME_VIDEO_EF9365_H #pragma once #include "emupal.h" //************************************************************************** // TYPE DEFINITIONS //************************************************************************** // ======================> ef9365_device class ef9365_device : public device_t, public device_memory_interface, public device_video_interface { public: static constexpr unsigned BITPLANE_MAX_SIZE = 0x8000; static constexpr unsigned MAX_BITPLANES = 8; static constexpr int DISPLAY_MODE_256x256 = 0x00; static constexpr int DISPLAY_MODE_512x512 = 0x01; static constexpr int DISPLAY_MODE_512x256 = 0x02; static constexpr int DISPLAY_MODE_128x128 = 0x03; static constexpr int DISPLAY_MODE_64x64 = 0x04; // construction/destruction ef9365_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // configuration template void set_palette_tag(T &&tag) { m_palette.set_tag(std::forward(tag)); } void set_nb_bitplanes(int nb_bitplanes ); void set_display_mode(int display_mode ); auto irq_handler() { return m_irq_handler.bind(); } // device interface uint8_t data_r(offs_t offset); void data_w(offs_t offset, uint8_t data); void update_scanline(uint16_t scanline); void set_color_filler( uint8_t color ); void set_color_entry( int index, uint8_t r, uint8_t g, uint8_t b ); uint8_t get_last_readback_word(int bitplane_number, int * pixel_offset); uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); protected: // device-level overrides 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 const tiny_rom_entry *device_rom_region() const override; // device_config_memory_interface overrides virtual space_config_vector memory_space_config() const override; // address space configurations const address_space_config m_space_config; private: int get_char_pix( unsigned char c, int x, int y ); void plot(int x_pos,int y_pos); int draw_character( unsigned char c, int block, int smallblock ); int draw_vector(uint16_t start_x,uint16_t start_y,short delta_x,short delta_y); uint16_t get_x_reg(); uint16_t get_y_reg(); void set_x_reg(uint16_t x); void set_y_reg(uint16_t y); void screen_scanning( int force_clear ); void set_busy_flag(int period); void set_video_mode(void); void draw_border(uint16_t line); void ef9365_exec(uint8_t cmd); int cycles_to_us(int cycles); void dump_bitplanes_word(); void update_interrupts(); void ef9365(address_map &map); // internal state static constexpr device_timer_id BUSY_TIMER = 0; required_region_ptr m_charset; address_space *m_videoram; uint8_t m_irq_state; uint8_t m_irq_vb; uint8_t m_irq_lb; uint8_t m_irq_rdy; uint8_t m_current_color; uint8_t m_bf; //busy flag uint8_t m_registers[0x10]; //registers uint8_t m_state; //status register uint8_t m_border[80]; //border color int nb_of_bitplanes; int nb_of_colors; int bitplane_xres; int bitplane_yres; uint16_t overflow_mask_x; uint16_t overflow_mask_y; int vsync_scanline_pos; uint8_t m_readback_latch[MAX_BITPLANES]; // Last DRAM Readback buffer (Filled after a Direct Memory Access Request command) int m_readback_latch_pix_offset; uint32_t clock_freq; bitmap_rgb32 m_screen_out; // timers emu_timer *m_busy_timer; required_device m_palette; devcb_write_line m_irq_handler; }; // device type definition DECLARE_DEVICE_TYPE(EF9365, ef9365_device) #endif // MAME_VIDEO_EF9365_H