diff options
Diffstat (limited to 'src/mame/drivers/vboy.cpp')
-rw-r--r-- | src/mame/drivers/vboy.cpp | 228 |
1 files changed, 89 insertions, 139 deletions
diff --git a/src/mame/drivers/vboy.cpp b/src/mame/drivers/vboy.cpp index b7914b9ed28..76d8d9df2b7 100644 --- a/src/mame/drivers/vboy.cpp +++ b/src/mame/drivers/vboy.cpp @@ -70,106 +70,84 @@ m_font[((woffs) + 0x1c000) ^ 7] = dat; /* flip x+y */ -/* FIXME: most if not all of these must be uint8_t */ -struct vboy_regs_t -{ - uint32_t lpc, lpc2, lpt, lpr; - uint32_t khb, klb; - uint8_t thb, tlb; - uint32_t tcr, wcr, kcr; -}; - -struct vip_regs_t -{ - uint16_t INTPND; - uint16_t INTENB; - uint16_t DPSTTS; - uint16_t DPCTRL; - uint16_t BRTA; - uint16_t BRTB; - uint16_t BRTC; - uint16_t REST; - uint16_t FRMCYC; - uint16_t CTA; - uint16_t XPSTTS; - uint16_t XPCTRL; - uint16_t VER; - uint16_t SPT[4]; - uint16_t GPLT[4]; - uint16_t JPLT[4]; - uint16_t BKCOL; -}; - -struct vboy_timer_t -{ - uint16_t count; - uint16_t latch; -}; - -struct vboy_timer_t; - class vboy_state : public driver_device { public: vboy_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_cart(*this, "cartslot"), - m_maintimer(*this, "timer_main"), - m_palette(*this, "palette") + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_cart(*this, "cartslot") + , m_maintimer(*this, "timer_main") + , m_palette(*this, "palette") { - m_vip_regs.INTPND = 0; - m_vip_regs.INTENB = 0; - m_vip_regs.DPSTTS = 0; - m_vip_regs.DPCTRL = 0; - m_vip_regs.BRTA = 0; - m_vip_regs.BRTB = 0; - m_vip_regs.BRTC = 0; - m_vip_regs.REST = 0; - m_vip_regs.FRMCYC = 0; - m_vip_regs.CTA = 0; - m_vip_regs.XPSTTS = 0; - m_vip_regs.XPCTRL = 0; - m_vip_regs.VER = 0; - m_vip_regs.SPT[0] = 0; - m_vip_regs.SPT[1] = 0; - m_vip_regs.SPT[2] = 0; - m_vip_regs.SPT[3] = 0; - m_vip_regs.GPLT[0] = 0; - m_vip_regs.GPLT[1] = 0; - m_vip_regs.GPLT[2] = 0; - m_vip_regs.GPLT[3] = 0; - m_vip_regs.JPLT[0] = 0; - m_vip_regs.JPLT[1] = 0; - m_vip_regs.JPLT[2] = 0; - m_vip_regs.JPLT[3] = 0; - m_vip_regs.BKCOL = 0; - - m_vboy_regs.lpc = 0; - m_vboy_regs.lpc2 = 0; - m_vboy_regs.lpt = 0; - m_vboy_regs.lpr = 0; - m_vboy_regs.khb = 0; - m_vboy_regs.klb = 0; - m_vboy_regs.thb = 0; - m_vboy_regs.tlb = 0; - m_vboy_regs.tcr = 0; - m_vboy_regs.wcr = 0; - m_vboy_regs.kcr = 0x80; - - m_vboy_timer.count = 0; - m_vboy_timer.latch = 0; } void vboy(machine_config &config); +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + virtual void video_start() override; + private: + // FIXME: most if not all of these must be uint8_t + struct vboy_regs_t + { + uint32_t lpc = 0, lpc2 = 0, lpt = 0, lpr = 0; + uint32_t khb = 0, klb = 0; + uint8_t thb = 0, tlb = 0; + uint32_t tcr = 0, wcr = 0, kcr = 0x80; + }; + + struct vip_regs_t + { + uint16_t INTPND = 0; + uint16_t INTENB = 0; + uint16_t DPSTTS = 0; + uint16_t DPCTRL = 0; + uint16_t BRTA = 0; + uint16_t BRTB = 0; + uint16_t BRTC = 0; + uint16_t REST = 0; + uint16_t FRMCYC = 0; + uint16_t CTA = 0; + uint16_t XPSTTS = 0; + uint16_t XPCTRL = 0; + uint16_t VER = 0; + uint16_t SPT[4] = { 0, 0, 0, 0 }; + uint16_t GPLT[4] = { 0, 0, 0, 0 }; + uint16_t JPLT[4] = { 0, 0, 0, 0 }; + uint16_t BKCOL = 0; + }; + + struct vboy_timer_t + { + uint16_t count = 0; + uint16_t latch = 0; + }; + required_device<cpu_device> m_maincpu; required_device<vboy_cart_slot_device> m_cart; required_device<timer_device> m_maintimer; required_device<palette_device> m_palette; memory_region *m_cart_rom; + std::unique_ptr<uint16_t[]> m_font; + std::unique_ptr<uint16_t[]> m_bgmap; + std::unique_ptr<uint8_t[]> m_l_frame_0; + std::unique_ptr<uint8_t[]> m_l_frame_1; + std::unique_ptr<uint8_t[]> m_r_frame_0; + std::unique_ptr<uint8_t[]> m_r_frame_1; + vboy_regs_t m_vboy_regs; + vip_regs_t m_vip_regs; + vboy_timer_t m_vboy_timer; + std::unique_ptr<int32_t[]> m_ovr_tempdraw_map; + uint16_t m_frame_count; + uint8_t m_displayfb; + uint8_t m_drawfb; + uint8_t m_row_num; + attotime m_input_latch_time; + DECLARE_READ32_MEMBER(io_r); DECLARE_WRITE32_MEMBER(io_w); DECLARE_READ16_MEMBER(vip_r); @@ -192,22 +170,8 @@ private: DECLARE_WRITE8_MEMBER(lfb1_w); DECLARE_WRITE8_MEMBER(rfb0_w); DECLARE_WRITE8_MEMBER(rfb1_w); - std::unique_ptr<uint16_t[]> m_font; - std::unique_ptr<uint16_t[]> m_bgmap; - std::unique_ptr<uint8_t[]> m_l_frame_0; - std::unique_ptr<uint8_t[]> m_l_frame_1; - std::unique_ptr<uint8_t[]> m_r_frame_0; - std::unique_ptr<uint8_t[]> m_r_frame_1; - vboy_regs_t m_vboy_regs; - vip_regs_t m_vip_regs; - vboy_timer_t m_vboy_timer; - std::unique_ptr<int32_t[]> m_ovr_tempdraw_map; - uint16_t m_frame_count; - uint8_t m_displayfb; - uint8_t m_drawfb; - uint8_t m_row_num; - attotime m_input_latch_time; - void m_timer_tick(void); + + void m_timer_tick(); void m_scanline_tick(int scanline, uint8_t screen_type); void m_set_irq(uint16_t irq_vector); @@ -219,11 +183,8 @@ private: void draw_affine_map(bitmap_ind16 &bitmap, const rectangle &cliprect, uint16_t param_base, int gx, int gp, int gy, int h, int w, uint16_t x_mask, uint16_t y_mask, uint8_t ovr, bool right, int bg_map_num); uint8_t display_world(int num, bitmap_ind16 &bitmap, const rectangle &cliprect, bool right, int &cur_spt); - void m_set_brightness(void); - virtual void machine_start() override; - virtual void machine_reset() override; - virtual void video_start() override; - DECLARE_PALETTE_INIT(vboy); + void m_set_brightness(); + void vboy_palette(palette_device &palette) const; uint32_t screen_update_vboy_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_vboy_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); TIMER_DEVICE_CALLBACK_MEMBER(timer_main_tick); @@ -252,28 +213,25 @@ void vboy_state::video_start() void vboy_state::put_obj(bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y, uint16_t code, uint8_t pal) { - uint16_t data; - uint8_t yi, xi, dat, col; - - for (yi = 0; yi < 8; yi++) + for (uint8_t yi = 0; yi < 8; yi++) { - data = READ_FONT(code * 8 + yi); + uint16_t const data = READ_FONT(code * 8 + yi); - for (xi = 0; xi < 8; xi++) + for (uint8_t xi = 0; xi < 8; xi++) { - int res_x,res_y; - - dat = ((data >> (xi << 1)) & 0x03); - - res_x = x + xi; - res_y = y + yi; - - col = (pal >> (dat*2)) & 3; + uint8_t const dat = ((data >> (xi << 1)) & 0x03); if (dat) { + uint8_t const res_x = x + xi; + uint8_t const res_y = y + yi; + if (cliprect.contains(res_x, res_y)) + { + uint8_t const col = (pal >> (dat * 2)) & 3; + bitmap.pix16((res_y), (res_x)) = m_palette->pen(col); + } } } } @@ -283,23 +241,16 @@ void vboy_state::put_obj(bitmap_ind16 &bitmap, const rectangle &cliprect, int x, void vboy_state::fill_ovr_char(uint16_t code, uint8_t pal) { - uint16_t data; - uint8_t yi, xi, dat; - int col; - - for (yi = 0; yi < 8; yi++) + for (uint8_t yi = 0; yi < 8; yi++) { - data = READ_FONT(code * 8 + yi); + uint16_t const data = READ_FONT(code * 8 + yi); - for (xi = 0; xi < 8; xi++) + for (uint8_t xi = 0; xi < 8; xi++) { - dat = ((data >> (xi << 1)) & 0x03); - col = (pal >> (dat*2)) & 3; - - if(dat == 0) - col = -1; + uint8_t const dat = ((data >> (xi << 1)) & 0x03); + int const col = (dat == 0) ? -1 : ((pal >> (dat * 2)) & 3); - WRITE_OVR_TEMPDRAW_MAP(yi*8+xi, col); + WRITE_OVR_TEMPDRAW_MAP(yi * 8 + xi, col); } } } @@ -747,9 +698,9 @@ WRITE32_MEMBER( vboy_state::io_w ) * *********************************/ /* -TODO: brightness presumably isn't a linear algorythm, also REST needs to be taken into account (needs a working example) +TODO: brightness presumably isn't a linear algorithm, also REST needs to be taken into account (needs a working example) */ -void vboy_state::m_set_brightness(void) +void vboy_state::m_set_brightness() { int a,b,c; @@ -1262,7 +1213,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(vboy_state::timer_pad_tick) m_maincpu->set_input_line(0, HOLD_LINE); } -PALETTE_INIT_MEMBER(vboy_state, vboy) +void vboy_state::vboy_palette(palette_device &palette) const { palette.set_pen_color(0, rgb_t::black()); palette.set_pen_color(1, rgb_t::black()); @@ -1371,20 +1322,19 @@ MACHINE_CONFIG_START(vboy_state::vboy) /* video hardware */ config.set_default_layout(layout_vboy); - MCFG_PALETTE_ADD("palette", 4) - MCFG_PALETTE_INIT_OWNER(vboy_state, vboy) + PALETTE(config, m_palette, FUNC(vboy_state::vboy_palette), 4); /* Left screen */ MCFG_SCREEN_ADD("3dleft", RASTER) MCFG_SCREEN_RAW_PARAMS(XTAL(20'000'000)/2,757,0,384,264,0,224) MCFG_SCREEN_UPDATE_DRIVER(vboy_state, screen_update_vboy_left) - MCFG_SCREEN_PALETTE("palette") + MCFG_SCREEN_PALETTE(m_palette) /* Right screen */ MCFG_SCREEN_ADD("3dright", RASTER) MCFG_SCREEN_RAW_PARAMS(XTAL(20'000'000)/2,757,0,384,264,0,224) MCFG_SCREEN_UPDATE_DRIVER(vboy_state, screen_update_vboy_right) - MCFG_SCREEN_PALETTE("palette") + MCFG_SCREEN_PALETTE(m_palette) /* cartridge */ MCFG_VBOY_CARTRIDGE_ADD("cartslot", vboy_cart, nullptr) |