summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/includes/mac.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/includes/mac.h')
-rw-r--r--src/mess/includes/mac.h483
1 files changed, 483 insertions, 0 deletions
diff --git a/src/mess/includes/mac.h b/src/mess/includes/mac.h
new file mode 100644
index 00000000000..e6f906059dc
--- /dev/null
+++ b/src/mess/includes/mac.h
@@ -0,0 +1,483 @@
+/*****************************************************************************
+ *
+ * includes/mac.h
+ *
+ * Macintosh driver declarations
+ *
+ ****************************************************************************/
+
+#ifndef MAC_H_
+#define MAC_H_
+
+#include "machine/8530scc.h"
+#include "machine/6522via.h"
+#include "machine/ram.h"
+#include "machine/egret.h"
+#include "machine/cuda.h"
+#include "machine/nubus.h"
+#include "machine/ncr539x.h"
+#include "machine/mackbd.h"
+#include "sound/asc.h"
+#include "sound/awacs.h"
+
+#define MAC_SCREEN_NAME "screen"
+#define MAC_539X_1_TAG "539x_1"
+#define MAC_539X_2_TAG "539x_2"
+
+// model helpers
+#define ADB_IS_BITBANG ((mac->m_model == MODEL_MAC_SE || mac->m_model == MODEL_MAC_CLASSIC) || (mac->m_model >= MODEL_MAC_II && mac->m_model <= MODEL_MAC_IICI) || (mac->m_model == MODEL_MAC_SE30) || (mac->m_model == MODEL_MAC_QUADRA_700))
+#define ADB_IS_BITBANG_CLASS ((m_model == MODEL_MAC_SE || m_model == MODEL_MAC_CLASSIC) || (m_model >= MODEL_MAC_II && m_model <= MODEL_MAC_IICI) || (m_model == MODEL_MAC_SE30) || (m_model == MODEL_MAC_QUADRA_700))
+#define ADB_IS_EGRET (mac->m_model >= MODEL_MAC_LC && mac->m_model <= MODEL_MAC_CLASSIC_II) || ((mac->m_model >= MODEL_MAC_IISI) && (mac->m_model <= MODEL_MAC_IIVI))
+#define ADB_IS_CUDA ((mac->m_model >= MODEL_MAC_COLOR_CLASSIC && mac->m_model <= MODEL_MAC_LC_580) || ((mac->m_model >= MODEL_MAC_QUADRA_660AV) && (mac->m_model <= MODEL_MAC_QUADRA_630)) || (mac->m_model >= MODEL_MAC_POWERMAC_6100))
+#define ADB_IS_PM_VIA1 (mac->m_model >= MODEL_MAC_PORTABLE && mac->m_model <= MODEL_MAC_PB100)
+#define ADB_IS_PM_VIA2 (mac->m_model >= MODEL_MAC_PB140 && mac->m_model <= MODEL_MAC_PBDUO_270c)
+#define ADB_IS_PM_VIA1_CLASS (m_model >= MODEL_MAC_PORTABLE && m_model <= MODEL_MAC_PB100)
+#define ADB_IS_PM_VIA2_CLASS (m_model >= MODEL_MAC_PB140 && m_model <= MODEL_MAC_PBDUO_270c)
+#define ADB_IS_PM_CLASS ((m_model >= MODEL_MAC_PORTABLE && m_model <= MODEL_MAC_PB100) || (m_model >= MODEL_MAC_PB140 && m_model <= MODEL_MAC_PBDUO_270c))
+
+/* for Egret and CUDA streaming MCU commands, command types */
+typedef enum
+{
+ MCU_STREAMING_NONE = 0,
+ MCU_STREAMING_PRAMRD,
+ MCU_STREAMING_PRAMWR,
+ MCU_STREAMING_WRAMRD,
+ MCU_STREAMING_WRAMWR
+} mac_streaming_t;
+
+enum
+{
+ RBV_TYPE_RBV = 0,
+ RBV_TYPE_V8,
+ RBV_TYPE_SONORA,
+ RBV_TYPE_DAFB
+};
+
+/* tells which model is being emulated (set by macxxx_init) */
+typedef enum
+{
+ MODEL_MAC_128K512K, // 68000 machines
+ MODEL_MAC_512KE,
+ MODEL_MAC_PLUS,
+ MODEL_MAC_SE,
+ MODEL_MAC_CLASSIC,
+
+ MODEL_MAC_PORTABLE, // Portable/PB100 are sort of hybrid classic and Mac IIs
+ MODEL_MAC_PB100,
+
+ MODEL_MAC_II, // Mac II class 68020/030 machines
+ MODEL_MAC_II_FDHD,
+ MODEL_MAC_IIX,
+ MODEL_MAC_IICX,
+ MODEL_MAC_IICI,
+ MODEL_MAC_IISI,
+ MODEL_MAC_IIVX,
+ MODEL_MAC_IIVI,
+ MODEL_MAC_IIFX,
+ MODEL_MAC_SE30,
+
+ MODEL_MAC_LC, // LC class 68030 machines, generally using a V8 or compatible gate array
+ MODEL_MAC_LC_II,
+ MODEL_MAC_LC_III,
+ MODEL_MAC_LC_III_PLUS,
+ MODEL_MAC_CLASSIC_II,
+ MODEL_MAC_COLOR_CLASSIC,
+
+ MODEL_MAC_LC_475, // LC III clones with Cuda instead of Egret and 68LC040 on most models
+ MODEL_MAC_LC_520,
+ MODEL_MAC_LC_550,
+ MODEL_MAC_TV,
+ MODEL_MAC_LC_575,
+ MODEL_MAC_LC_580,
+
+ MODEL_MAC_PB140, // 68030 PowerBooks. 140/145/145B/170 all have the same machine ID
+ MODEL_MAC_PB160, // 160/180/165 all have the same machine ID too
+ MODEL_MAC_PB165c,
+ MODEL_MAC_PB180c,
+ MODEL_MAC_PB150, // 150 is fairly radically different from the other 1x0s
+
+ MODEL_MAC_PBDUO_210, // 68030 PowerBook Duos
+ MODEL_MAC_PBDUO_230,
+ MODEL_MAC_PBDUO_250,
+ MODEL_MAC_PBDUO_270c,
+
+ MODEL_MAC_QUADRA_700, // 68(LC)040 desktops
+ MODEL_MAC_QUADRA_610,
+ MODEL_MAC_QUADRA_650,
+ MODEL_MAC_QUADRA_800,
+ MODEL_MAC_QUADRA_900,
+ MODEL_MAC_QUADRA_950,
+ MODEL_MAC_QUADRA_660AV,
+ MODEL_MAC_QUADRA_840AV,
+ MODEL_MAC_QUADRA_605,
+ MODEL_MAC_QUADRA_630,
+
+ MODEL_MAC_PB550c, // 68(LC)040 PowerBooks
+ MODEL_MAC_PB520,
+ MODEL_MAC_PB520c,
+ MODEL_MAC_PB540,
+ MODEL_MAC_PB540c,
+ MODEL_MAC_PB190,
+ MODEL_MAC_PB190cs,
+
+ MODEL_MAC_POWERMAC_6100, // NuBus PowerMacs
+ MODEL_MAC_POWERMAC_7100,
+ MODEL_MAC_POWERMAC_8100
+} model_t;
+
+// video parameters for classic Macs
+#define MAC_H_VIS (512)
+#define MAC_V_VIS (342)
+#define MAC_H_TOTAL (704) // (512+192)
+#define MAC_V_TOTAL (370) // (342+28)
+
+/*----------- defined in machine/mac.c -----------*/
+
+extern const via6522_interface mac_via6522_intf;
+extern const via6522_interface mac_via6522_2_intf;
+extern const via6522_interface mac_via6522_adb_intf;
+
+void mac_scsi_irq(running_machine &machine, int state);
+void mac_asc_irq(device_t *device, int state);
+void mac_fdc_set_enable_lines(device_t *device, int enable_mask);
+
+MACHINE_START( macscsi );
+MACHINE_START( mac );
+MACHINE_RESET( mac );
+
+
+NVRAM_HANDLER( mac );
+
+/*----------- defined in video/mac.c -----------*/
+
+VIDEO_START( mac );
+VIDEO_START( macrbv );
+VIDEO_START( macv8 );
+VIDEO_START( macsonora );
+VIDEO_START( macdafb );
+
+VIDEO_RESET(macrbv);
+VIDEO_RESET(macdafb);
+VIDEO_RESET(maceagle);
+VIDEO_RESET(macsonora);
+
+SCREEN_UPDATE_IND16( mac );
+SCREEN_UPDATE_IND16( macse30 );
+SCREEN_UPDATE_IND16( macprtb );
+SCREEN_UPDATE_IND16( macpb140 );
+SCREEN_UPDATE_IND16( macpb160 );
+SCREEN_UPDATE_RGB32( macrbv );
+SCREEN_UPDATE_RGB32( macrbvvram );
+SCREEN_UPDATE_RGB32( macdafb );
+SCREEN_UPDATE_RGB32( macpbwd );
+
+PALETTE_INIT( mac );
+PALETTE_INIT( macgsc );
+
+/*----------- defined in audio/mac.c -----------*/
+
+DECLARE_LEGACY_SOUND_DEVICE(MAC_SOUND, mac_sound);
+
+void mac_enable_sound( device_t *device, int on );
+void mac_set_sound_buffer( device_t *device, int buffer );
+void mac_set_volume( device_t *device, int volume );
+
+void mac_sh_updatebuffer(device_t *device);
+
+/* Mac driver data */
+
+class mac_state : public driver_device
+{
+public:
+ mac_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_via1(*this, "via6522_0"),
+ m_via2(*this, "via6522_1"),
+ m_asc(*this, "asc"),
+ m_awacs(*this, "awacs"),
+ m_egret(*this, EGRET_TAG),
+ m_cuda(*this, CUDA_TAG),
+ m_ram(*this, RAM_TAG),
+ m_screen(*this, MAC_SCREEN_NAME),
+ m_539x_1(*this, MAC_539X_1_TAG),
+ m_539x_2(*this, MAC_539X_2_TAG),
+ m_mackbd(*this, MACKBD_TAG),
+ m_vram(*this,"vram"),
+ m_vram16(*this,"vram16")
+ { }
+
+ required_device<cpu_device> m_maincpu;
+ required_device<via6522_device> m_via1;
+ optional_device<via6522_device> m_via2;
+ optional_device<asc_device> m_asc;
+ optional_device<awacs_device> m_awacs;
+ optional_device<egret_device> m_egret;
+ optional_device<cuda_device> m_cuda;
+ required_device<ram_device> m_ram;
+ optional_device<screen_device> m_screen;
+ optional_device<ncr539x_device> m_539x_1;
+ optional_device<ncr539x_device> m_539x_2;
+ optional_device<mackbd_device> m_mackbd;
+
+ virtual void machine_start();
+ virtual void machine_reset();
+
+ model_t m_model;
+
+ UINT32 m_overlay;
+ int m_drive_select;
+ int m_scsiirq_enable;
+
+ UINT32 m_via2_vbl;
+ UINT32 m_se30_vbl_enable;
+ UINT8 m_nubus_irq_state;
+
+ /* used to store the reply to most keyboard commands */
+ int m_keyboard_reply;
+
+ /* Keyboard communication in progress? */
+ int m_kbd_comm;
+ int m_kbd_receive;
+ /* timer which is used to time out inquiry */
+ emu_timer *m_inquiry_timeout;
+
+ int m_kbd_shift_reg;
+ int m_kbd_shift_count;
+
+ /* keyboard matrix to detect transition */
+ int m_key_matrix[7];
+
+ /* keycode buffer (used for keypad/arrow key transition) */
+ int m_keycode_buf[2];
+ int m_keycode_buf_index;
+
+ int m_mouse_bit_x;
+ int m_mouse_bit_y;
+ int last_mx, last_my;
+ int count_x, count_y;
+ int m_last_was_x;
+ int m_screen_buffer;
+
+ int irq_count, ca1_data, ca2_data;
+
+ /* state of rTCEnb and rTCClk lines */
+ UINT8 m_rtc_rTCEnb;
+ UINT8 m_rtc_rTCClk;
+
+ /* serial transmit/receive register : bits are shifted in/out of this byte */
+ UINT8 m_rtc_data_byte;
+ /* serial transmitted/received bit count */
+ UINT8 m_rtc_bit_count;
+ /* direction of the current transfer (0 : VIA->RTC, 1 : RTC->VIA) */
+ UINT8 m_rtc_data_dir;
+ /* when rtc_data_dir == 1, state of rTCData as set by RTC (-> data bit seen by VIA) */
+ UINT8 m_rtc_data_out;
+
+ /* set to 1 when command in progress */
+ UINT8 m_rtc_cmd;
+
+ /* write protect flag */
+ UINT8 m_rtc_write_protect;
+
+ /* internal seconds register */
+ UINT8 m_rtc_seconds[/*8*/4];
+ /* 20-byte long PRAM, or 256-byte long XPRAM */
+ UINT8 m_rtc_ram[256];
+ /* current extended address and RTC state */
+ UINT8 m_rtc_xpaddr;
+ UINT8 m_rtc_state;
+
+ // Mac ADB state
+ INT32 m_adb_irq_pending, m_adb_waiting_cmd, m_adb_datasize, m_adb_buffer[257];
+ INT32 m_adb_state, m_adb_command, m_adb_send, m_adb_timer_ticks, m_adb_extclock, m_adb_direction;
+ INT32 m_adb_listenreg, m_adb_listenaddr, m_adb_last_talk, m_adb_srq_switch;
+ INT32 m_adb_streaming, m_adb_stream_ptr;
+
+ // Portable/PB100 Power Manager IC comms (chapter 4, "Guide to the Macintosh Family Hardware", second edition)
+ UINT8 m_pm_data_send, m_pm_data_recv, m_pm_ack, m_pm_req, m_pm_cmd[32], m_pm_out[32], m_pm_dptr, m_pm_sptr, m_pm_slen, m_pm_state;
+ UINT8 m_pmu_int_status, m_pmu_last_adb_command, m_pmu_poll;
+ emu_timer *m_pmu_send_timer;
+
+ // 60.15 Hz timer for RBV/V8/Sonora/Eagle/VASP/etc.
+ emu_timer *m_6015_timer;
+
+ // RBV and friends (V8, etc)
+ UINT8 m_rbv_regs[256], m_rbv_ier, m_rbv_ifr, m_rbv_type, m_rbv_montype, m_rbv_vbltime;
+ UINT32 m_rbv_colors[3], m_rbv_count, m_rbv_clutoffs, m_rbv_immed10wr;
+ UINT32 m_rbv_palette[256];
+ UINT8 m_sonora_vctl[8];
+ emu_timer *m_vbl_timer, *m_cursor_timer;
+ UINT16 m_cursor_line;
+ UINT16 m_dafb_int_status;
+ int m_dafb_scsi1_drq, m_dafb_scsi2_drq;
+ UINT8 m_dafb_mode;
+ UINT32 m_dafb_base, m_dafb_stride;
+
+ // this is shared among all video setups with vram
+ optional_shared_ptr<UINT32> m_vram;
+ optional_shared_ptr<UINT16> m_vram16;
+
+ // interrupts
+ int m_scc_interrupt, m_via_interrupt, m_via2_interrupt, m_scsi_interrupt, m_asc_interrupt, m_last_taken_interrupt;
+
+ // defined in machine/mac.c
+ void v8_resize();
+ void set_memory_overlay(int overlay);
+ void scc_mouse_irq( int x, int y );
+ void nubus_slot_interrupt(UINT8 slot, UINT32 state);
+ void set_scc_interrupt(bool value);
+ void set_via_interrupt(int value);
+ void set_via2_interrupt(int value);
+ void field_interrupts();
+ void rtc_write_rTCEnb(int data);
+ void rtc_shift_data(int data);
+ void vblank_irq();
+ void rtc_incticks();
+ void adb_talk();
+ void mouse_callback();
+ void rbv_recalc_irqs();
+ void pmu_exec();
+ void mac_adb_newaction(int state);
+
+ DECLARE_READ16_MEMBER ( mac_via_r );
+ DECLARE_WRITE16_MEMBER ( mac_via_w );
+ DECLARE_READ16_MEMBER ( mac_via2_r );
+ DECLARE_WRITE16_MEMBER ( mac_via2_w );
+ DECLARE_READ16_MEMBER ( mac_autovector_r );
+ DECLARE_WRITE16_MEMBER ( mac_autovector_w );
+ DECLARE_READ16_MEMBER ( mac_iwm_r );
+ DECLARE_WRITE16_MEMBER ( mac_iwm_w );
+ DECLARE_READ16_MEMBER ( mac_scc_r );
+ DECLARE_WRITE16_MEMBER ( mac_scc_w );
+ DECLARE_WRITE16_MEMBER ( mac_scc_2_w );
+ DECLARE_READ16_MEMBER ( macplus_scsi_r );
+ DECLARE_WRITE16_MEMBER ( macplus_scsi_w );
+ DECLARE_WRITE16_MEMBER ( macii_scsi_w );
+ DECLARE_READ32_MEMBER (macii_scsi_drq_r);
+ DECLARE_WRITE32_MEMBER (macii_scsi_drq_w);
+
+ DECLARE_READ32_MEMBER( rbv_ramdac_r );
+ DECLARE_WRITE32_MEMBER( rbv_ramdac_w );
+ DECLARE_WRITE32_MEMBER( ariel_ramdac_w );
+ DECLARE_READ8_MEMBER( mac_sonora_vctl_r );
+ DECLARE_WRITE8_MEMBER( mac_sonora_vctl_w );
+ DECLARE_READ8_MEMBER ( mac_rbv_r );
+ DECLARE_WRITE8_MEMBER ( mac_rbv_w );
+
+ DECLARE_READ32_MEMBER(mac_read_id);
+
+ DECLARE_READ16_MEMBER(mac_config_r);
+
+ DECLARE_READ32_MEMBER(biu_r);
+ DECLARE_WRITE32_MEMBER(biu_w);
+ DECLARE_READ8_MEMBER(oss_r);
+ DECLARE_WRITE8_MEMBER(oss_w);
+ DECLARE_READ32_MEMBER(buserror_r);
+ DECLARE_READ8_MEMBER(swimiop_r);
+ DECLARE_WRITE8_MEMBER(swimiop_w);
+ DECLARE_READ8_MEMBER(scciop_r);
+ DECLARE_WRITE8_MEMBER(scciop_w);
+
+ DECLARE_READ8_MEMBER(hmc_r);
+ DECLARE_WRITE8_MEMBER(hmc_w);
+ DECLARE_READ8_MEMBER(amic_dma_r);
+ DECLARE_WRITE8_MEMBER(amic_dma_w);
+ DECLARE_READ8_MEMBER(pmac_diag_r);
+
+ DECLARE_READ8_MEMBER(mac_gsc_r);
+ DECLARE_WRITE8_MEMBER(mac_gsc_w);
+
+ DECLARE_READ8_MEMBER(mac_5396_r);
+ DECLARE_WRITE8_MEMBER(mac_5396_w);
+
+ DECLARE_READ32_MEMBER(dafb_r);
+ DECLARE_WRITE32_MEMBER(dafb_w);
+ DECLARE_READ32_MEMBER(dafb_dac_r);
+ DECLARE_WRITE32_MEMBER(dafb_dac_w);
+
+ DECLARE_READ32_MEMBER(macwd_r);
+ DECLARE_WRITE32_MEMBER(macwd_w);
+
+ DECLARE_WRITE_LINE_MEMBER(nubus_irq_9_w);
+ DECLARE_WRITE_LINE_MEMBER(nubus_irq_a_w);
+ DECLARE_WRITE_LINE_MEMBER(nubus_irq_b_w);
+ DECLARE_WRITE_LINE_MEMBER(nubus_irq_c_w);
+ DECLARE_WRITE_LINE_MEMBER(nubus_irq_d_w);
+ DECLARE_WRITE_LINE_MEMBER(nubus_irq_e_w);
+
+ DECLARE_WRITE_LINE_MEMBER(irq_539x_1_w);
+ DECLARE_WRITE_LINE_MEMBER(drq_539x_1_w);
+
+ DECLARE_WRITE_LINE_MEMBER(cuda_reset_w);
+
+ DECLARE_DIRECT_UPDATE_MEMBER(overlay_opbaseoverride);
+private:
+ int has_adb();
+ void rtc_init();
+ void rtc_execute_cmd(int data);
+ void adb_reset();
+ void adb_vblank();
+ int adb_pollkbd(int update);
+ int adb_pollmouse();
+ void adb_accummouse( UINT8 *MouseX, UINT8 *MouseY );
+ void pmu_one_byte_reply(UINT8 result);
+ void pmu_three_byte_reply(UINT8 result1, UINT8 result2, UINT8 result3);
+
+ // wait states for accessing the VIA
+ int m_via_cycles;
+
+ // ADB mouse state
+ int m_adb_mouseaddr;
+ int m_adb_lastmousex, m_adb_lastmousey, m_adb_lastbutton, m_adb_mouse_initialized;
+
+ // ADB keyboard state
+ int m_adb_keybaddr;
+ int m_adb_keybinitialized, m_adb_currentkeys[2], m_adb_modifiers;
+
+ UINT8 m_oss_regs[0x400];
+
+ // AMIC for x100 PowerMacs
+ UINT8 m_amic_regs[0x200];
+
+ // HMC for x100 PowerMacs
+ UINT64 m_hmc_reg, m_hmc_shiftout;
+
+public:
+ emu_timer *m_scanline_timer;
+ emu_timer *m_adb_timer;
+ DECLARE_DRIVER_INIT(maclc2);
+ DECLARE_DRIVER_INIT(maciifdhd);
+ DECLARE_DRIVER_INIT(macse30);
+ DECLARE_DRIVER_INIT(macprtb);
+ DECLARE_DRIVER_INIT(maciivx);
+ DECLARE_DRIVER_INIT(macpd210);
+ DECLARE_DRIVER_INIT(macii);
+ DECLARE_DRIVER_INIT(macclassic);
+ DECLARE_DRIVER_INIT(macquadra700);
+ DECLARE_DRIVER_INIT(macclassic2);
+ DECLARE_DRIVER_INIT(maciifx);
+ DECLARE_DRIVER_INIT(maclc);
+ DECLARE_DRIVER_INIT(macpb160);
+ DECLARE_DRIVER_INIT(macplus);
+ DECLARE_DRIVER_INIT(macse);
+ DECLARE_DRIVER_INIT(macpb140);
+ DECLARE_DRIVER_INIT(mac128k512k);
+ DECLARE_DRIVER_INIT(macpm6100);
+ DECLARE_DRIVER_INIT(mac512ke);
+ DECLARE_DRIVER_INIT(maclc520);
+ DECLARE_DRIVER_INIT(maciici);
+ DECLARE_DRIVER_INIT(maciix);
+ DECLARE_DRIVER_INIT(maclrcclassic);
+ DECLARE_DRIVER_INIT(maciisi);
+ DECLARE_DRIVER_INIT(maciicx);
+ DECLARE_DRIVER_INIT(maclc3);
+ DECLARE_DRIVER_INIT(maclc3plus);
+ DECLARE_DRIVER_INIT(macpm7100);
+ DECLARE_DRIVER_INIT(macpm8100);
+ DECLARE_DRIVER_INIT(macpb100);
+};
+
+#endif /* MAC_H_ */
+
+