1 // license:BSD-3-Clause 2 // copyright-holders:Dan Boris 3 /************************************************************************* 4 5 Atari I, Robot hardware 6 7 *************************************************************************/ 8 #ifndef MAME_INCLUDES_IROBOT_H 9 #define MAME_INCLUDES_IROBOT_H 10 11 #pragma once 12 13 #include "machine/timer.h" 14 #include "machine/x2212.h" 15 #include "sound/pokey.h" 16 #include "emupal.h" 17 #include "screen.h" 18 19 #define IR_TIMING 1 /* try to emulate MB and VG running time */ 20 21 class irobot_state : public driver_device 22 { 23 public: irobot_state(const machine_config & mconfig,device_type type,const char * tag)24 irobot_state(const machine_config &mconfig, device_type type, const char *tag) : 25 driver_device(mconfig, type, tag), 26 m_videoram(*this, "videoram"), 27 m_maincpu(*this, "maincpu"), 28 m_gfxdecode(*this, "gfxdecode"), 29 m_screen(*this, "screen"), 30 m_palette(*this, "palette"), 31 #if IR_TIMING 32 m_irvg_timer(*this, "irvg_timer"), 33 m_irmb_timer(*this, "irmb_timer"), 34 #endif 35 m_novram(*this, "nvram"), 36 m_pokey(*this, "pokey%u", 1U), 37 m_leds(*this, "led%u", 0U) 38 { } 39 40 void init_irobot(); 41 42 void irobot(machine_config &config); 43 44 private: 45 struct irmb_ops 46 { 47 const struct irmb_ops *nxtop; 48 uint32_t func; 49 uint32_t diradd; 50 uint32_t latchmask; 51 uint32_t *areg; 52 uint32_t *breg; 53 uint8_t cycles; 54 uint8_t diren; 55 uint8_t flags; 56 uint8_t ramsel; 57 }; 58 59 virtual void machine_start() override; 60 virtual void machine_reset() override; 61 virtual void video_start() override; 62 void irobot_map(address_map &map); 63 64 void irobot_clearirq_w(uint8_t data); 65 void irobot_clearfirq_w(uint8_t data); 66 uint8_t irobot_sharedmem_r(offs_t offset); 67 void irobot_sharedmem_w(offs_t offset, uint8_t data); 68 void irobot_statwr_w(uint8_t data); 69 void irobot_out0_w(uint8_t data); 70 void irobot_rom_banksel_w(uint8_t data); 71 uint8_t irobot_status_r(); 72 void irobot_paletteram_w(offs_t offset, uint8_t data); 73 uint8_t quad_pokeyn_r(offs_t offset); 74 void quad_pokeyn_w(offs_t offset, uint8_t data); 75 void irobot_palette(palette_device &palette) const; 76 uint32_t screen_update_irobot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 77 TIMER_CALLBACK_MEMBER(scanline_callback); 78 TIMER_DEVICE_CALLBACK_MEMBER(irobot_irvg_done_callback); 79 TIMER_DEVICE_CALLBACK_MEMBER(irobot_irmb_done_callback); 80 void irobot_poly_clear(uint8_t *bitmap_base); 81 void irobot_poly_clear(); 82 void draw_line(uint8_t *polybitmap, int x1, int y1, int x2, int y2, int col); 83 void irobot_run_video(); 84 uint32_t irmb_din(const irmb_ops *curop); 85 void irmb_dout(const irmb_ops *curop, uint32_t d); 86 void load_oproms(); 87 void irmb_run(); 88 89 required_shared_ptr<uint8_t> m_videoram; 90 uint8_t m_vg_clear; 91 uint8_t m_bufsel; 92 uint8_t m_alphamap; 93 uint8_t *m_combase; 94 uint8_t m_irvg_vblank; 95 uint8_t m_irvg_running; 96 uint8_t m_irmb_running; 97 uint8_t *m_comRAM[2]; 98 uint8_t *m_mbRAM; 99 uint8_t *m_mbROM; 100 uint8_t m_statwr; 101 uint8_t m_out0; 102 uint8_t m_outx; 103 uint8_t m_mpage; 104 uint8_t *m_combase_mb; 105 std::unique_ptr<irmb_ops[]> m_mbops; 106 const irmb_ops *m_irmb_stack[16]; 107 uint32_t m_irmb_regs[16]; 108 uint32_t m_irmb_latch; 109 std::unique_ptr<uint8_t[]> m_polybitmap1; 110 std::unique_ptr<uint8_t[]> m_polybitmap2; 111 int m_ir_xmin; 112 int m_ir_ymin; 113 int m_ir_xmax; 114 int m_ir_ymax; 115 emu_timer *m_scanline_timer; 116 117 required_device<cpu_device> m_maincpu; 118 required_device<gfxdecode_device> m_gfxdecode; 119 required_device<screen_device> m_screen; 120 required_device<palette_device> m_palette; 121 #if IR_TIMING 122 required_device<timer_device> m_irvg_timer; 123 required_device<timer_device> m_irmb_timer; 124 #endif 125 required_device<x2212_device> m_novram; 126 required_device_array<pokey_device, 4> m_pokey; 127 output_finder<2> m_leds; 128 }; 129 130 #endif // MAME_INCLUDES_IROBOT_H 131