diff options
Diffstat (limited to 'src/mame/includes/gb.h')
-rw-r--r-- | src/mame/includes/gb.h | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/src/mame/includes/gb.h b/src/mame/includes/gb.h new file mode 100644 index 00000000000..714daafa832 --- /dev/null +++ b/src/mame/includes/gb.h @@ -0,0 +1,171 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol +/***************************************************************************** + * + * includes/gb.h + * + ****************************************************************************/ + +#ifndef GB_H_ +#define GB_H_ + +#include "audio/gb.h" +#include "cpu/lr35902/lr35902.h" +#include "bus/gameboy/gb_slot.h" +#include "machine/ram.h" +#include "video/gb_lcd.h" + +/* Interrupts */ +#define VBL_INT 0 /* V-Blank */ +#define LCD_INT 1 /* LCD Status */ +#define TIM_INT 2 /* Timer */ +#define SIO_INT 3 /* Serial I/O */ +#define EXT_INT 4 /* Joypad */ + +#ifdef TIMER +#undef TIMER +#endif + +/* Cartridge types */ +#define CART_RAM 0x01 /* Cartridge has RAM */ +#define BATTERY 0x02 /* Cartridge has a battery to save RAM */ +#define TIMER 0x04 /* Cartridge has a real-time-clock (MBC3 only) */ +#define RUMBLE 0x08 /* Cartridge has a rumble motor (MBC5 only) */ +#define SRAM 0x10 /* Cartridge has SRAM */ +#define UNKNOWN 0x80 /* Cartridge is of an unknown type */ + +#define DMG_FRAMES_PER_SECOND 59.732155 +#define SGB_FRAMES_PER_SECOND 61.17 + + +#define MAX_ROMBANK 512 +#define MAX_RAMBANK 256 + + + +class gb_state : public driver_device +{ +public: + gb_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_cartslot(*this, "gbslot"), + m_maincpu(*this, "maincpu"), + m_custom(*this, "custom"), + m_region_maincpu(*this, "maincpu"), + m_rambank(*this, "cgb_ram"), + m_inputs(*this, "INPUTS"), + m_bios_hack(*this, "SKIP_CHECK"), + m_ram(*this, RAM_TAG), + m_lcd(*this, "lcd") { } + + //gb_state driver_data; + UINT8 m_gb_io[0x10]; + + /* Timer related */ + UINT16 m_divcount; + UINT8 m_shift; + UINT16 m_shift_cycles; + UINT8 m_triggering_irq; + UINT8 m_reloading; + + /* Serial I/O related */ + UINT32 m_sio_count; /* Serial I/O counter */ + emu_timer *m_gb_serial_timer; + + /* SGB variables */ + INT8 m_sgb_packets; + UINT8 m_sgb_bitcount; + UINT8 m_sgb_bytecount; + UINT8 m_sgb_start; + UINT8 m_sgb_rest; + UINT8 m_sgb_controller_no; + UINT8 m_sgb_controller_mode; + UINT8 m_sgb_data[0x100]; + + /* CGB variables */ + UINT8 *m_gbc_rammap[8]; /* (CGB) Addresses of internal RAM banks */ + UINT8 m_gbc_rambank; /* (CGB) Current CGB RAM bank */ + + int m_bios_disable; + + DECLARE_WRITE8_MEMBER(gb_io_w); + DECLARE_WRITE8_MEMBER(gb_io2_w); + DECLARE_WRITE8_MEMBER(sgb_io_w); + DECLARE_READ8_MEMBER(gb_ie_r); + DECLARE_WRITE8_MEMBER(gb_ie_w); + DECLARE_READ8_MEMBER(gb_io_r); + DECLARE_WRITE8_MEMBER(gbc_io2_w); + DECLARE_READ8_MEMBER(gbc_io2_r); + DECLARE_PALETTE_INIT(gb); + DECLARE_MACHINE_START(sgb); + DECLARE_MACHINE_RESET(sgb); + DECLARE_PALETTE_INIT(sgb); + DECLARE_PALETTE_INIT(gbp); + DECLARE_MACHINE_START(gbc); + DECLARE_MACHINE_RESET(gbc); + DECLARE_PALETTE_INIT(gbc); + TIMER_CALLBACK_MEMBER(gb_serial_timer_proc); + DECLARE_WRITE8_MEMBER(gb_timer_callback); + + DECLARE_READ8_MEMBER(gb_cart_r); + DECLARE_READ8_MEMBER(gbc_cart_r); + DECLARE_WRITE8_MEMBER(gb_bank_w); + DECLARE_READ8_MEMBER(gb_ram_r); + DECLARE_WRITE8_MEMBER(gb_ram_w); + DECLARE_READ8_MEMBER(gb_echo_r); + DECLARE_WRITE8_MEMBER(gb_echo_w); + optional_device<gb_cart_slot_device> m_cartslot; + +protected: + required_device<lr35902_cpu_device> m_maincpu; + required_device<gameboy_sound_device> m_custom; + required_memory_region m_region_maincpu; + optional_memory_bank m_rambank; // cgb + required_ioport m_inputs; + required_ioport m_bios_hack; + optional_device<ram_device> m_ram; + required_device<gb_lcd_device> m_lcd; + + void gb_timer_increment(); + void gb_timer_check_irq(); + void gb_init(); + void gb_init_regs(); + void gb_video_reset(int mode); + void gb_video_start(int mode); + + void save_gb_base(); + void save_gbc_only(); + void save_sgb_only(); + + virtual void machine_start(); + virtual void machine_reset(); +}; + + +class megaduck_state : public gb_state +{ +public: + megaduck_state(const machine_config &mconfig, device_type type, const char *tag) + : gb_state(mconfig, type, tag) + , m_cartslot(*this, "duckslot") + { } + + DECLARE_READ8_MEMBER(megaduck_video_r); + DECLARE_WRITE8_MEMBER(megaduck_video_w); + DECLARE_WRITE8_MEMBER(megaduck_sound_w1); + DECLARE_READ8_MEMBER(megaduck_sound_r1); + DECLARE_WRITE8_MEMBER(megaduck_sound_w2); + DECLARE_READ8_MEMBER(megaduck_sound_r2); + DECLARE_MACHINE_START(megaduck); + DECLARE_MACHINE_RESET(megaduck); + DECLARE_PALETTE_INIT(megaduck); + + DECLARE_READ8_MEMBER(cart_r); + DECLARE_WRITE8_MEMBER(bank1_w); + DECLARE_WRITE8_MEMBER(bank2_w); + optional_device<megaduck_cart_slot_device> m_cartslot; +}; + + + +#endif /* GB_H_ */ |