summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/includes/coco.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/includes/coco.h')
-rw-r--r--src/mess/includes/coco.h262
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__ */