// license:MAME|LGPL-2.1+ // copyright-holders:Michael Zapf /**************************************************************************** Geneve main board components. See genboard.c for documentation. Michael Zapf February 2012: Rewritten as class *****************************************************************************/ #ifndef __GENBOARD__ #define __GENBOARD__ #include "emu.h" #include "ti99defs.h" #include "machine/mm58274c.h" #include "video/v9938.h" #include "cpu/tms9900/tms9995.h" extern const device_type GENEVE_MOUSE; extern const device_type GENEVE_KEYBOARD; extern const device_type GENEVE_MAPPER; /*****************************************************************************/ class geneve_mouse_device : public device_t { public: geneve_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); void poll(); line_state left_button(); // left button is not connected to the V9938 but to a TMS9901 pin protected: virtual void device_start(); virtual void device_reset(); virtual ioport_constructor device_input_ports() const; private: v9938_device* m_v9938; int m_last_mx; int m_last_my; }; #define MCFG_GENEVE_MOUSE_ADD(_tag ) \ MCFG_DEVICE_ADD(_tag, GENEVE_MOUSE, 0) /*****************************************************************************/ #define KEYQUEUESIZE 256 #define MAXKEYMSGLENGTH 10 #define KEYAUTOREPEATDELAY 30 #define KEYAUTOREPEATRATE 6 class geneve_keyboard_device : public device_t { public: geneve_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); DECLARE_WRITE_LINE_MEMBER( reset_line ); DECLARE_WRITE_LINE_MEMBER( send_scancodes ); DECLARE_WRITE_LINE_MEMBER( clock_control ); UINT8 get_recent_key(); template static devcb2_base &static_set_int_callback(device_t &device, _Object object) { return downcast(device).m_interrupt.set_callback(object); } protected: void device_start(); void device_reset(); ioport_constructor device_input_ports() const; devcb2_write_line m_interrupt; // Keyboard interrupt to console void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); private: void post_in_key_queue(int keycode); void signal_when_key_available(); void poll(); bool m_key_reset; int m_key_queue_length; UINT8 m_key_queue[KEYQUEUESIZE]; int m_key_queue_head; bool m_key_in_buffer; UINT32 m_key_state_save[4]; bool m_key_numlock_state; int m_key_ctrl_state; int m_key_alt_state; int m_key_real_shift_state; bool m_key_fake_shift_state; bool m_key_fake_unshift_state; int m_key_autorepeat_key; int m_key_autorepeat_timer; bool m_keep_keybuf; bool m_keyboard_clock; emu_timer* m_timer; }; #define MCFG_GENEVE_KBINT_HANDLER( _intcallb ) \ devcb = &geneve_keyboard_device::static_set_int_callback( *device, DEVCB2_##_intcallb ); /*****************************************************************************/ class geneve_mapper_device : public device_t { public: geneve_mapper_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); inline void set_geneve_mode(bool geneve) { m_geneve_mode = geneve; } inline void set_direct_mode(bool direct) { m_direct_mode = direct; } inline void set_cartridge_size(int size) { m_cartridge_size = size; } inline void set_cartridge_writable(int base, bool write) { if (base==0x6000) m_cartridge6_writable = write; else m_cartridge7_writable = write; } inline void set_video_waitstates(bool wait) { m_video_waitstates = wait; } inline void set_extra_waitstates(bool wait) { m_extra_waitstates = wait; } DECLARE_READ8_MEMBER( readm ); DECLARE_WRITE8_MEMBER( writem ); DECLARE_SETOFFSET_MEMBER( setoffset ); DECLARE_INPUT_CHANGED_MEMBER( gm_changed ); DECLARE_WRITE_LINE_MEMBER( clock_in ); DECLARE_WRITE_LINE_MEMBER( dbin_in ); template static devcb2_base &static_set_ready_callback(device_t &device, _Object object) { return downcast(device).m_ready.set_callback(object); } protected: void device_start(); void device_reset(); private: // GROM simulation bool m_gromwaddr_LSB; bool m_gromraddr_LSB; int m_grom_address; DECLARE_READ8_MEMBER( read_grom ); DECLARE_WRITE8_MEMBER( write_grom ); // wait states void set_wait(int min); void set_ext_wait(int min); bool m_video_waitstates; bool m_extra_waitstates; bool m_ready_asserted; bool m_read_mode; bool m_debug_no_ws; // Mapper function typedef struct { int function; offs_t offset; offs_t physaddr; } decdata; bool m_geneve_mode; bool m_direct_mode; int m_cartridge_size; bool m_cartridge_secondpage; bool m_cartridge6_writable; bool m_cartridge7_writable; int m_map[8]; void decode(address_space& space, offs_t offset, bool read_mode, decdata* dec); decdata m_decoded; // Genmod modifications bool m_turbo; bool m_genmod; bool m_timode; int m_sram_mask; int m_sram_val; // Ready line to the CPU devcb2_write_line m_ready; // Counter for the wait states. int m_waitcount; int m_ext_waitcount; // Devices mm58274c_device* m_clock; tms9995_device* m_cpu; geneve_keyboard_device* m_keyboard; bus8z_device* m_video; bus8z_device* m_peribox; bus8z_device* m_sound; UINT8* m_eprom; UINT8* m_sram; UINT8* m_dram; }; #define MCFG_GENEVE_READY_HANDLER( _intcallb ) \ devcb = &geneve_mapper_device::static_set_ready_callback( *device, DEVCB2_##_intcallb ); #endif