diff options
author | Miodrag Milanovic <mmicko@gmail.com> | 2012-08-21 10:41:19 +0000 |
---|---|---|
committer | Miodrag Milanovic <mmicko@gmail.com> | 2012-08-21 10:41:19 +0000 |
commit | 7285b359d259b2ae0fdf85096571c386ec8c991a (patch) | |
tree | a027aff57f1a255f9ec6cfd3b68cabe4b6683998 /src/mess/includes/coco.h | |
parent | 67c425e90757876a6716b7867df30c0149912e74 (diff) |
Merge of MESS sources (no whatsnew)
Diffstat (limited to 'src/mess/includes/coco.h')
-rw-r--r-- | src/mess/includes/coco.h | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/src/mess/includes/coco.h b/src/mess/includes/coco.h new file mode 100644 index 00000000000..3b44f435314 --- /dev/null +++ b/src/mess/includes/coco.h @@ -0,0 +1,262 @@ +/*************************************************************************** + + coco.h + + TRS-80 Radio Shack Color Computer Family + +***************************************************************************/ + +#pragma once + +#ifndef __COCO__ +#define __COCO__ + + +#include "emu.h" +#include "imagedev/cassette.h" +#include "imagedev/bitbngr.h" +#include "machine/6821pia.h" +#include "machine/cococart.h" +#include "machine/coco_vhd.h" +#include "machine/ram.h" +#include "sound/dac.h" +#include "sound/wave.h" + + + +//************************************************************************** +// MACROS / CONSTANTS +//************************************************************************** + +INPUT_PORTS_EXTERN( coco_analog_control ); +INPUT_PORTS_EXTERN( coco_cart_autostart ); + +SLOT_INTERFACE_EXTERN( coco_cart ); + +/* constants */ +#define JOYSTICK_DELTA 10 +#define JOYSTICK_SENSITIVITY 100 + +/* devices */ +#define MAINCPU_TAG "maincpu" +#define PIA0_TAG "pia0" +#define PIA1_TAG "pia1" +#define SAM_TAG "sam" +#define VDG_TAG "vdg" +#define SCREEN_TAG "screen" +#define DAC_TAG "dac" +#define CARTRIDGE_TAG "ext" +#define BITBANGER_TAG "bitbanger" +#define VHD0_TAG "vhd0" +#define VHD1_TAG "vhd1" + +/* inputs */ +#define CTRL_SEL_TAG "ctrl_sel" +#define HIRES_INTF_TAG "hires_intf" +#define CART_AUTOSTART_TAG "cart_autostart" +#define JOYSTICK_RX_TAG "joystick_rx" +#define JOYSTICK_RY_TAG "joystick_ry" +#define JOYSTICK_LX_TAG "joystick_lx" +#define JOYSTICK_LY_TAG "joystick_ly" +#define JOYSTICK_BUTTONS_TAG "joystick_buttons" +#define RAT_MOUSE_RX_TAG "rat_mouse_rx" +#define RAT_MOUSE_RY_TAG "rat_mouse_ry" +#define RAT_MOUSE_LX_TAG "rat_mouse_lx" +#define RAT_MOUSE_LY_TAG "rat_mouse_ly" +#define RAT_MOUSE_BUTTONS_TAG "rat_mouse_buttons" +#define DIECOM_LIGHTGUN_RX_TAG "dclg_rx" +#define DIECOM_LIGHTGUN_RY_TAG "dclg_ry" +#define DIECOM_LIGHTGUN_LX_TAG "dclg_lx" +#define DIECOM_LIGHTGUN_LY_TAG "dclg_ly" +#define DIECOM_LIGHTGUN_BUTTONS_TAG "dclg_triggers" + +MACHINE_CONFIG_EXTERN( coco_sound ); + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class coco_state : public driver_device +{ +public: + coco_state(const machine_config &mconfig, device_type type, const char *tag); + + required_device<cpu_device> m_maincpu; + required_device<pia6821_device> m_pia_0; + required_device<pia6821_device> m_pia_1; + required_device<dac_device> m_dac; + required_device<device_t> m_wave; + required_device<cococart_slot_device> m_cococart; + required_device<ram_device> m_ram; + required_device<cassette_image_device> m_cassette; + optional_device<bitbanger_device> m_bitbanger; + optional_device<coco_vhd_image_device> m_vhd_0; + optional_device<coco_vhd_image_device> m_vhd_1; + + static const pia6821_interface pia0_config; + static const pia6821_interface pia1_config; + static const cococart_interface cartridge_config; + static const bitbanger_config coco_bitbanger_config; + static const cassette_interface coco_cassette_interface; + + /* driver update handlers */ + static INPUT_CHANGED(keyboard_changed); + static INPUT_CHANGED(joystick_mode_changed); + static void bitbanger_callback(running_machine &machine, UINT8 bit); + + /* IO */ + virtual DECLARE_READ8_MEMBER( ff00_read ); + virtual DECLARE_WRITE8_MEMBER( ff00_write ); + virtual DECLARE_READ8_MEMBER( ff20_read ); + virtual DECLARE_WRITE8_MEMBER( ff20_write ); + virtual DECLARE_READ8_MEMBER( ff40_read ); + virtual DECLARE_WRITE8_MEMBER( ff40_write ); + DECLARE_READ8_MEMBER( ff60_read ); + DECLARE_WRITE8_MEMBER( ff60_write ); + + /* floating bus */ + DECLARE_READ8_MEMBER( floating_bus_read ) { return floating_bus_read(); } + +protected: + /* device-level overrides */ + virtual void device_start(); + virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + + /* interrupts */ + virtual bool firq_get_line(void); + virtual bool irq_get_line(void); + void recalculate_irq(void); + void recalculate_firq(void); + + /* changed handlers */ + virtual void pia1_pa_changed(void); + virtual void pia1_pb_changed(void); + virtual void bitbanger_changed(bool newvalue); + + /* miscellaneous */ + virtual void update_keyboard_input(UINT8 value, UINT8 z); + virtual void cart_w(bool state); + DECLARE_WRITE_LINE_MEMBER( cart_w ) { cart_w((bool) state); } + virtual void update_cart_base(UINT8 *cart_base) = 0; + + /* PIA0 */ + DECLARE_WRITE8_MEMBER( pia0_pb_w ); + DECLARE_WRITE_LINE_MEMBER( pia0_ca2_w ); + DECLARE_WRITE_LINE_MEMBER( pia0_cb2_w ); + DECLARE_WRITE_LINE_MEMBER( pia0_irq_a ); + DECLARE_WRITE_LINE_MEMBER( pia0_irq_b ); + + /* PIA1 */ + DECLARE_READ8_MEMBER( pia1_pa_r ); + DECLARE_READ8_MEMBER( pia1_pb_r ); + DECLARE_WRITE8_MEMBER( pia1_pa_w ); + DECLARE_WRITE8_MEMBER( pia1_pb_w ); + DECLARE_WRITE_LINE_MEMBER( pia1_ca2_w ); + DECLARE_WRITE_LINE_MEMBER( pia1_cb2_w ); + DECLARE_WRITE_LINE_MEMBER( pia1_firq_a ); + DECLARE_WRITE_LINE_MEMBER( pia1_firq_b ); + +private: + // timer constants + static const device_timer_id TIMER_HIRES_JOYSTICK_X = 0; + static const device_timer_id TIMER_HIRES_JOYSTICK_Y = 1; + static const device_timer_id TIMER_DIECOM_LIGHTGUN = 2; + + typedef enum + { + SOUNDMUX_SEL1 = 1, + SOUNDMUX_SEL2 = 2, + SOUNDMUX_ENABLE = 4 + } soundmux_status_t; + + typedef enum + { + JOYSTICK_NONE = 0x00, + JOYSTICK_NORMAL = 0x01, + JOYSTICK_RAT_MOUSE = 0x02, + JOYSTICK_DIECOM_LIGHT_GUN = 0x03 + } joystick_type_t; + + typedef enum + { + HIRES_NONE = 0x00, + HIRES_RIGHT = 0x01, + HIRES_RIGHT_COCOMAX3 = 0x02, + HIRES_LEFT = 0x03, + HIRES_LEFT_COCOMAX3 = 0x04, + } hires_type_t; + + typedef struct + { + ioport_port *m_input[2][2]; + ioport_port *m_buttons; + + UINT8 input(int joystick, int axis) const { return m_input[joystick][axis] ? m_input[joystick][axis]->read() : 0x00; } + UINT8 buttons(void) const { return m_buttons ? m_buttons->read() : 0x00; } + } analog_input_t; + + void analog_port_start(analog_input_t *analog, const char *rx_tag, const char *ry_tag, const char *lx_tag, const char *ly_tag, const char *buttons_tag); + + /* wrappers for configuration */ + joystick_type_t joystick_type(int index); + hires_type_t hires_interface_type(void); + bool is_joystick_hires(int joystick_index); + + soundmux_status_t soundmux_status(void); + UINT8 sound_value(void); + void update_sound(void); + bool joyin(void); + void poll_joystick(bool *joyin, UINT8 *buttons); + void poll_keyboard(void); + void poll_hires_joystick(void); + void update_cassout(int cassout); + void update_prinout(bool prinout); + DECLARE_WRITE_LINE_MEMBER( bitbanger_callback ); + void diecom_lightgun_clock(void); + + /* thin wrappers for PIA output */ + UINT8 dac_output(void) { return m_dac_output; } /* PA drives the DAC */ + bool sel1(void) { return m_pia_0->ca2_output() ? true : false; } + bool sel2(void) { return m_pia_0->cb2_output() ? true : false; } + bool snden(void) { return m_pia_1->cb2_output() ? true : false; } + + /* VHD selection */ + coco_vhd_image_device *current_vhd(void); + + /* floating bus */ + UINT8 floating_bus_read(void); + + /* disassembly override */ + static offs_t dasm_override(device_t &device, char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, int options); + + /* input ports */ + ioport_port *m_keyboard[7]; + ioport_port *m_joystick_type_control; + ioport_port *m_joystick_hires_control; + analog_input_t m_joystick; + analog_input_t m_rat_mouse; + analog_input_t m_diecom_lightgun; + + /* DAC output */ + UINT8 m_dac_output; + + /* hires interface */ + emu_timer *m_hiresjoy_transition_timer[2]; + bool m_hiresjoy_ca; + + /* diecom lightgun */ + emu_timer *m_diecom_lightgun_timer; + bool m_dclg_previous_bit; + UINT8 m_dclg_output_h; + UINT8 m_dclg_output_v; + UINT8 m_dclg_state; + UINT16 m_dclg_timer; + + /* VHD selection */ + UINT8 m_vhd_select; +}; + +#endif /* __COCO__ */ |