1 // license:BSD-3-Clause 2 // copyright-holders:Wilbert Pol 3 /********************************************************************** 4 5 Hudson/NEC HuC6270 interface 6 7 **********************************************************************/ 8 9 #ifndef MAME_VIDEO_HUC6270_H 10 #define MAME_VIDEO_HUC6270_H 11 12 #pragma once 13 14 15 class huc6270_device : public device_t 16 { 17 public: 18 // construction/destruction 19 huc6270_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 20 set_vram_size(uint32_t vram_size)21 void set_vram_size(uint32_t vram_size) { m_vram_size = vram_size; } irq()22 auto irq() { return m_irq_changed_cb.bind(); } 23 24 u8 read(offs_t offset); 25 void write(offs_t offset, u8 data); 26 u16 next_pixel(); time_until_next_event()27 inline u16 time_until_next_event() 28 { 29 return m_horz_to_go * 8 + m_horz_steps; 30 } 31 32 DECLARE_WRITE_LINE_MEMBER( vsync_changed ); 33 DECLARE_WRITE_LINE_MEMBER( hsync_changed ); 34 35 static const uint16_t HUC6270_SPRITE = 0x0100; // sprite colour information 36 static const uint16_t HUC6270_BACKGROUND = 0x0000; // background colour information 37 38 protected: 39 // device-level overrides 40 virtual void device_start() override; 41 virtual void device_reset() override; 42 43 inline void fetch_bat_tile_row(); 44 void add_sprite( int index, int x, int pattern, int line, int flip_x, int palette, int priority, int sat_lsb ); 45 void select_sprites(); 46 inline void handle_vblank(); 47 inline void next_vert_state(); 48 inline void next_horz_state(); 49 inline void handle_dma(); 50 51 private: 52 enum class v_state : u8 { 53 VSW, 54 VDS, 55 VDW, 56 VCR 57 }; 58 59 enum class h_state : u8 { 60 HDS, 61 HDW, 62 HDE, 63 HSW 64 }; 65 66 67 /* Size of Video ram (mandatory) */ 68 uint32_t m_vram_size; 69 70 /* Callback for when the irq line may have changed (mandatory) */ 71 devcb_write_line m_irq_changed_cb; 72 73 uint8_t m_register_index; 74 75 /* HuC6270 registers */ 76 uint16_t m_mawr; 77 uint16_t m_marr; 78 uint16_t m_vrr; 79 uint16_t m_vwr; 80 uint16_t m_cr; 81 uint16_t m_rcr; 82 uint16_t m_bxr; 83 uint16_t m_byr; 84 uint16_t m_mwr; 85 uint16_t m_hsr; 86 uint16_t m_hdr; 87 uint16_t m_vpr; 88 uint16_t m_vdw; 89 uint16_t m_vcr; 90 uint16_t m_dcr; 91 uint16_t m_sour; 92 uint16_t m_desr; 93 uint16_t m_lenr; 94 uint16_t m_dvssr; 95 uint8_t m_status; 96 97 /* To keep track of external hsync and vsync signals */ 98 int m_hsync; 99 int m_vsync; 100 101 /* internal variables */ 102 v_state m_vert_state; 103 h_state m_horz_state; 104 int m_vd_triggered; 105 int m_vert_to_go; 106 int m_horz_to_go; 107 int m_horz_steps; 108 int m_raster_count; 109 int m_dvssr_written; 110 int m_satb_countdown; 111 int m_dma_enabled; 112 uint16_t m_byr_latched; 113 uint16_t m_bxr_latched; 114 uint16_t m_bat_address; 115 uint16_t m_bat_address_mask; 116 uint16_t m_bat_row; 117 uint16_t m_bat_column; 118 uint8_t m_bat_tile_row[8]; 119 /* Internal sprite attribute table. SATB DMA is used to transfer data 120 from VRAM to this internal table. 121 */ 122 uint16_t m_sat[4*64]; 123 int m_sprites_this_line; 124 int m_sprite_row_index; 125 uint16_t m_sprite_row[1024]; 126 std::unique_ptr<uint16_t[]> m_vram; 127 uint16_t m_vram_mask; 128 129 static constexpr uint8_t vram_increments[4] = { 1, 32, 64, 128 }; 130 }; 131 132 133 DECLARE_DEVICE_TYPE(HUC6270, huc6270_device) 134 135 #endif // MAME_VIDEO_HUC6270_H 136