summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/x68k.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/x68k.cpp')
-rw-r--r--src/mame/drivers/x68k.cpp1890
1 files changed, 0 insertions, 1890 deletions
diff --git a/src/mame/drivers/x68k.cpp b/src/mame/drivers/x68k.cpp
deleted file mode 100644
index 3d190dc1d5a..00000000000
--- a/src/mame/drivers/x68k.cpp
+++ /dev/null
@@ -1,1890 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Barry Rodewald,Carl
-
-// Preliminary X68000 driver for MESS
-// Started 18/11/2006
-// Written by Barry Rodewald
-
-/*
- *** Basic memory map
-
- 0x000000 - 0xbfffff RAM (Max 12MB), vector table from ROM at 0xff0000 maps to 0x000000 at reset only
- 0xc00000 - 0xdfffff Graphic VRAM
- 0xe00000 - 0xe1ffff Text VRAM Plane 1
- 0xe20000 - 0xe3ffff Text VRAM Plane 2
- 0xe40000 - 0xe5ffff Text VRAM Plane 3
- 0xe60000 - 0xe7ffff Text VRAM Plane 4
- 0xe80000 CRTC
- 0xe82000 Video Controller
- 0xe84000 DMA Controller
- 0xe86000 Supervisor Area set
- 0xe88000 MFP
- 0xe8a000 RTC
- 0xe8c000 Printer
- 0xe8e000 System Port (?)
- 0xe90000 FM Sound source
- 0xe92000 ADPCM
- 0xe94000 FDC
- 0xe96000 HDC
- 0xe96021 SCSI (internal model)
- 0xe98000 SCC
- 0xe9a000 Serial I/O (PPI)
- 0xe9c000 I/O controller
-
- [Expansions]
- 0xe9c000 / 0xe9e000 FPU (Optional, X68000 only)
- 0xea0000 SCSI
- 0xeaf900 FAX
- 0xeafa00 / 0xeafa10 MIDI (1st/2nd)
- 0xeafb00 Serial
- 0xeafc00/10/20/30 EIA232E
- 0xeafd00 EIA232E
- 0xeafe00 GPIB (?)
- 0xec0000 - 0xecffff User I/O Expansion
-
- 0xeb0000 - 0xeb7fff Sprite registers
- 0xeb8000 - 0xebffff Sprite VRAM
- 0xed0000 - 0xed3fff SRAM
- 0xf00000 - 0xfb0000 ROM (CGROM.DAT)
- 0xfe0000 - 0xffffff ROM (IPLROM.DAT)
-
-
- *** System hardware
-
- CPU : X68000: 68000 at 10MHz
- X68000 XVI: 68000 at 16MHz
- X68030: 68EC030 at 25MHz
-
- RAM : between 1MB and 4MB stock, expandable to 12MB
-
- FDD : 2x 5.25", Compact models use 2x 3.5" drives.
- FDC : NEC uPD72065
-
- HDD : HD models have up to an 81MB HDD.
- HDC : Fujitsu MB89352A (SCSI)
-
- SCC : Serial controller - Zilog z85C30 (Dual channel, 1 for RS232, 1 for mouse)
- PPI : Parallel controller - NEC 8255 (Printer, Joystick)
-
- Sound : FM - YM2151, with YM3012 DAC
- ADPCM - Okidata MSM6258
-
- DMA : Hitachi HD63450, DMA I/O for FDD, HDD, Expansion slots, and ADPCM
-
- MFP : Motorola MC68901 - monitor sync, serial port, RTC, soft power, FM synth, IRQs, keyboard
-
- RTC : Ricoh RP5C15
-
- ...plus a number of custom chips for video and other stuff...
-
-
- *** Current status (28/12/08)
- MFP : Largely works, as far as the X68000 goes.
-
- PPI : Joystick controls work okay.
-
- HDC/HDD : SCSI is not implemented, not a requirement at this point.
-
- RTC : Seems to work. (Tested using SX-Window's Timer application)
-
- DMA : Works fine.
-
- Sound : FM works, ADPCM mostly works (timing(?) issues in a few games).
-
- SCC : Works enough to get the mouse running, although only with the IPL v1.0 BIOS
-
- Video : Text mode works, but is rather slow, especially scrolling up (uses multple "raster copy" commands).
- Graphic layers work.
- BG tiles and sprites work, but many games have the sprites offset by a small amount (some by a lot :))
- Still a few minor priority issues around.
-
- Other issues:
- Bus error exceptions are a bit late at times. Currently using a fake bus error for MIDI expansion checks. These
- are used determine if a piece of expansion hardware is present.
- Keyboard doesn't work properly (MFP USART).
- Supervisor area set isn't implemented.
-
- Some minor game-specific issues:
- Salamander: System error when using keys in-game. No error if a joystick is used.
- Some text is drawn incorrectly.
- Dragon Buster: Text is black and unreadable. (Text layer actually covers it)
- Tetris: Black dots over screen (text layer).
- Parodius Da!: Black squares in areas.
-
- More detailed documentation at http://x68kdev.emuvibes.com/iomap.html - if you can stand broken english :)
-
-*/
-
-#include "emu.h"
-#include "includes/x68k.h"
-#include "machine/x68k_hdc.h"
-#include "machine/x68k_kbd.h"
-
-#include "machine/nvram.h"
-
-#include "bus/x68k/x68k_neptunex.h"
-#include "bus/x68k/x68k_scsiext.h"
-#include "bus/x68k/x68k_midi.h"
-#include "bus/scsi/scsi.h"
-#include "bus/scsi/scsihd.h"
-#include "bus/scsi/scsicd.h"
-
-#include "softlist.h"
-#include "speaker.h"
-
-#include "formats/dim_dsk.h"
-#include "formats/xdf_dsk.h"
-
-#include "x68000.lh"
-
-#define LOG_FDC (1 << 1)
-#define LOG_SYS (1 << 2)
-#define LOG_IRQ (1 << 3)
-//#define VERBOSE (LOG_FDC | LOG_SYS | LOG_IRQ)
-#include "logmacro.h"
-
-
-static constexpr uint32_t adpcm_clock[2] = { 8000000, 4000000 };
-static constexpr uint32_t adpcm_div[4] = { 1024, 768, 512, /* Reserved */512 };
-
-void x68k_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
-{
- switch (id)
- {
- case TIMER_X68K_LED:
- led_callback(ptr, param);
- break;
- case TIMER_X68K_SCC_ACK:
- scc_ack(ptr, param);
- break;
- case TIMER_MD_6BUTTON_PORT1_TIMEOUT:
- md_6button_port1_timeout(ptr, param);
- break;
- case TIMER_MD_6BUTTON_PORT2_TIMEOUT:
- md_6button_port2_timeout(ptr, param);
- break;
- case TIMER_X68K_BUS_ERROR:
- bus_error(ptr, param);
- break;
- case TIMER_X68K_FDC_TC:
- m_upd72065->tc_w(ASSERT_LINE);
- m_upd72065->tc_w(CLEAR_LINE);
- break;
- case TIMER_X68K_ADPCM:
- m_hd63450->drq3_w(1);
- m_hd63450->drq3_w(0);
- break;
- default:
- throw emu_fatalerror("Unknown id in x68k_state::device_timer");
- }
-}
-
-// LED timer callback
-TIMER_CALLBACK_MEMBER(x68k_state::led_callback)
-{
- m_led_state = !m_led_state ? 1 : 0;
- if(m_led_state)
- {
- for(int drive=0; drive<4; drive++)
- m_ctrl_drv_out[drive] = m_fdc.led_ctrl[drive] ? 0 : 1;
- }
- else
- {
- std::fill(std::begin(m_ctrl_drv_out), std::end(m_ctrl_drv_out), 1);
- }
-
-}
-
-
-// mouse input
-// port B of the Z8530 SCC
-// typically read from the SCC data port on receive buffer full interrupt per byte
-int x68k_state::read_mouse()
-{
- char val = 0;
- char ipt = 0;
-
- if(!(m_scc->get_reg_b(5) & 0x02))
- return 0xff;
-
- switch(m_mouse.inputtype)
- {
- case 0:
- ipt = m_mouse1->read();
- break;
- case 1:
- val = m_mouse2->read();
- ipt = val - m_mouse.last_mouse_x;
- m_mouse.last_mouse_x = val;
- break;
- case 2:
- val = m_mouse3->read();
- ipt = val - m_mouse.last_mouse_y;
- m_mouse.last_mouse_y = val;
- break;
- }
- m_mouse.inputtype++;
- if(m_mouse.inputtype > 2)
- {
- int i_val = m_scc->get_reg_b(0);
- m_mouse.inputtype = 0;
- m_mouse.bufferempty = 1;
- i_val &= ~0x01;
- m_scc->set_reg_b(0, i_val);
- LOGMASKED(LOG_SYS, "SCC: mouse buffer empty\n");
- }
-
- return ipt;
-}
-
-/*
- 0xe98001 - Z8530 command port B
- 0xe98003 - Z8530 data port B (mouse input)
- 0xe98005 - Z8530 command port A
- 0xe98007 - Z8530 data port A (RS232)
-*/
-READ16_MEMBER(x68k_state::scc_r )
-{
- offset %= 4;
- switch(offset)
- {
- case 0:
- return m_scc->reg_r(space, 0);
- case 1:
- return read_mouse();
- case 2:
- return m_scc->reg_r(space, 1);
- case 3:
- return m_scc->reg_r(space, 3);
- default:
- return 0xff;
- }
-}
-
-WRITE16_MEMBER(x68k_state::scc_w )
-{
- offset %= 4;
-
- switch(offset)
- {
- case 0:
- m_scc->reg_w(space, 0,(uint8_t)data);
- if((m_scc->get_reg_b(5) & 0x02) != m_scc_prev)
- {
- if(m_scc->get_reg_b(5) & 0x02) // Request to Send
- {
- int val = m_scc->get_reg_b(0);
- m_mouse.bufferempty = 0;
- val |= 0x01;
- m_scc->set_reg_b(0,val);
- }
- }
- break;
- case 1:
- m_scc->reg_w(space, 2,(uint8_t)data);
- break;
- case 2:
- m_scc->reg_w(space, 1,(uint8_t)data);
- break;
- case 3:
- m_scc->reg_w(space, 3,(uint8_t)data);
- break;
- }
- m_scc_prev = m_scc->get_reg_b(5) & 0x02;
-}
-
-TIMER_CALLBACK_MEMBER(x68k_state::scc_ack)
-{
- if(m_mouse.bufferempty != 0) // nothing to do if the mouse data buffer is empty
- return;
-
-// if((m_ioc.irqstatus & 0xc0) != 0)
-// return;
-
- // hard-code the IRQ vector for now, until the SCC code is more complete
- if((m_scc->get_reg_a(9) & 0x08) || (m_scc->get_reg_b(9) & 0x08)) // SCC reg WR9 is the same for both channels
- {
- if((m_scc->get_reg_b(1) & 0x18) != 0) // if bits 3 and 4 of WR1 are 0, then Rx IRQs are disabled on this channel
- {
- if(m_scc->get_reg_b(5) & 0x02) // RTS signal
- {
- m_mouse.irqactive = true;
- m_mouse.irqvector = 0x54;
- update_ipl();
- }
- }
- }
-}
-
-void x68k_state::set_adpcm()
-{
- uint32_t rate = adpcm_div[m_adpcm.rate];
- uint32_t res_clock = adpcm_clock[m_adpcm.clock]/2;
- m_adpcm_timer->adjust(attotime::from_ticks(rate, res_clock), 0, attotime::from_ticks(rate, res_clock));
-}
-
-// Megadrive 3 button gamepad
-// According to XM6, bits 4 and 7 are always 1 (is this correct?)
-// Bits 4 and 5 of PPI port C control each controller's multiplexer
-// Button inputs (Start, A, B and C) are read in bits 5 and 6 (rather than 4
-// and 5 like on a Megadrive)
-
-uint8_t x68k_state::md_3button_r(int port)
-{
- if(port == 1)
- {
- uint8_t porta = m_md3b->read() & 0xff;
- uint8_t portb = (m_md3b->read() >> 8) & 0xff;
- if(m_mdctrl.mux1 & 0x10)
- {
- return porta | 0x90;
- }
- else
- {
- return (portb & 0x60) | (porta & 0x03) | 0x90;
- }
- }
- if(port == 2)
- {
- uint8_t porta = (m_md3b->read() >> 16) & 0xff;
- uint8_t portb = (m_md3b->read() >> 24) & 0xff;
- if(m_mdctrl.mux2 & 0x20)
- {
- return porta | 0x90;
- }
- else
- {
- return (portb & 0x60) | (porta & 0x03) | 0x90;
- }
- }
- return 0xff;
-}
-
-// Megadrive 6 button gamepad
-TIMER_CALLBACK_MEMBER(x68k_state::md_6button_port1_timeout)
-{
- m_mdctrl.seq1 = 0;
-}
-
-TIMER_CALLBACK_MEMBER(x68k_state::md_6button_port2_timeout)
-{
- m_mdctrl.seq2 = 0;
-}
-
-void x68k_state::md_6button_init()
-{
- m_mdctrl.io_timeout1 = timer_alloc(TIMER_MD_6BUTTON_PORT1_TIMEOUT);
- m_mdctrl.io_timeout2 = timer_alloc(TIMER_MD_6BUTTON_PORT2_TIMEOUT);
-}
-
-uint8_t x68k_state::md_6button_r(int port)
-{
- if(port == 1)
- {
- uint8_t porta = m_md6b->read() & 0xff;
- uint8_t portb = (m_md6b->read() >> 8) & 0xff;
- uint8_t extra = m_md6b_extra->read() & 0x0f;
-
- switch(m_mdctrl.seq1)
- {
- case 1:
- default:
- if(m_mdctrl.mux1 & 0x10)
- {
- return porta | 0x90;
- }
- else
- {
- return (portb & 0x60) | (porta & 0x03) | 0x90;
- }
- case 2:
- if(m_mdctrl.mux1 & 0x10)
- {
- return porta | 0x90;
- }
- else
- {
- return (portb & 0x60) | 0x90;
- }
- case 3:
- if(m_mdctrl.mux1 & 0x10)
- {
- return (porta & 0x60) | (extra & 0x0f) | 0x90;
- }
- else
- {
- return (portb & 0x60) | 0x9f;
- }
- }
- }
- if(port == 2)
- {
- uint8_t porta = (m_md6b->read() >> 16) & 0xff;
- uint8_t portb = (m_md6b->read() >> 24) & 0xff;
- uint8_t extra = (m_md6b_extra->read() >> 4) & 0x0f;
-
- switch(m_mdctrl.seq2)
- {
- case 1:
- default:
- if(m_mdctrl.mux2 & 0x20)
- {
- return porta | 0x90;
- }
- else
- {
- return (portb & 0x60) | (porta & 0x03) | 0x90;
- }
- case 2:
- if(m_mdctrl.mux2 & 0x20)
- {
- return porta | 0x90;
- }
- else
- {
- return (portb & 0x60) | 0x90;
- }
- case 3:
- if(m_mdctrl.mux2 & 0x20)
- {
- return (porta & 0x60) | (extra & 0x0f) | 0x90;
- }
- else
- {
- return (portb & 0x60) | 0x9f;
- }
- }
- }
- return 0xff;
-}
-
-// XPD-1LR dual D-pad controller.
-// Sold with Video Game Anthology Vol 4: Libble Rabble.
-// Also compatible with Video Game Anthology Vol 5: Crazy Climber 1 & 2
-// Uses the same input multiplexer hardware as Megadrive controllers
-// Output is the same as for standard controllers, but when ctl is high,
-// the directions refer to the right D-pad, and when low, the left D-pad
-// The buttons are read the same as normal, regardless of ctl.
-uint8_t x68k_state::xpd1lr_r(int port)
-{
- if(port == 1)
- {
- uint8_t porta = m_xpd1lr->read() & 0xff;
- uint8_t portb = (m_xpd1lr->read() >> 8) & 0xff;
- if(m_mdctrl.mux1 & 0x10)
- {
- return porta;
- }
- else
- {
- return portb | (porta & 0x60);
- }
- }
- if(port == 2)
- {
- uint8_t porta = (m_xpd1lr->read() >> 16) & 0xff;
- uint8_t portb = (m_xpd1lr->read() >> 24) & 0xff;
- if(m_mdctrl.mux2 & 0x20)
- {
- return porta;
- }
- else
- {
- return portb | (porta & 0x60);
- }
- }
- return 0xff;
-}
-
-// Judging from the XM6 source code, PPI ports A and B are joystick inputs
-READ8_MEMBER(x68k_state::ppi_port_a_r)
-{
- int ctrl = m_ctrltype->read() & 0x0f;
-
- switch(ctrl)
- {
- case 0x00: // standard MSX/FM-Towns joystick
- if(m_joy.joy1_enable == 0)
- return m_joy1->read();
- else
- return 0xff;
- case 0x01: // 3-button Megadrive gamepad
- return md_3button_r(1);
- case 0x02: // 6-button Megadrive gamepad
- return md_6button_r(1);
- case 0x03: // XPD-1LR
- return xpd1lr_r(1);
- }
-
- return 0xff;
-}
-
-READ8_MEMBER(x68k_state::ppi_port_b_r)
-{
- int ctrl = m_ctrltype->read() & 0xf0;
-
- switch(ctrl)
- {
- case 0x00: // standard MSX/FM-Towns joystick
- if(m_joy.joy2_enable == 0)
- return m_joy2->read();
- else
- return 0xff;
- case 0x10: // 3-button Megadrive gamepad
- return md_3button_r(2);
- case 0x20: // 6-button Megadrive gamepad
- return md_6button_r(2);
- case 0x30: // XPD-1LR
- return xpd1lr_r(2);
- }
-
- return 0xff;
-}
-
-READ8_MEMBER(x68k_state::ppi_port_c_r)
-{
- return m_ppi_port[2];
-}
-
-/* PPI port C (Joystick control, R/W)
- bit 7 - IOC7 - Function B operation of joystick 1 (?)
- bit 6 - IOC6 - Function A operation of joystick 1 (?)
- bit 5 - IOC5 - Enable Joystick 2
- bit 4 - IOC4 - Enable Joystick 1
- bits 3,2 - ADPCM Sample rate
- bits 1,0 - ADPCM Pan (00 = Both, 01 = Right only, 10 = Left only, 11 = Off)
-*/
-WRITE8_MEMBER(x68k_state::ppi_port_c_w)
-{
- // ADPCM / Joystick control
- m_ppi_port[2] = data;
- if((data & 0x0f) != (m_ppi_prev & 0x0f))
- {
- m_adpcm.pan = data & 0x03;
- m_adpcm.rate = (data & 0x0c) >> 2;
- if (m_adpcm.rate == 3)
- LOGMASKED(LOG_SYS, "PPI: Invalid ADPCM sample rate set.\n");
-
- set_adpcm();
- m_okim6258->set_divider(m_adpcm.rate);
- m_adpcm_out[0]->flt_volume_set_volume((m_adpcm.pan & 1) ? 0.0f : 1.0f);
- m_adpcm_out[1]->flt_volume_set_volume((m_adpcm.pan & 2) ? 0.0f : 1.0f);
- }
-
- // The joystick enable bits also handle the multiplexer for various controllers
- m_joy.joy1_enable = data & 0x10;
- m_mdctrl.mux1 = data & 0x10;
- if((m_ppi_prev & 0x10) == 0x00 && (data & 0x10) == 0x10)
- {
- m_mdctrl.seq1++;
- m_mdctrl.io_timeout1->adjust(m_maincpu->cycles_to_attotime(8192));
- }
-
- m_joy.joy2_enable = data & 0x20;
- m_mdctrl.mux2 = data & 0x20;
- if((m_ppi_prev & 0x20) == 0x00 && (data & 0x20) == 0x20)
- {
- m_mdctrl.seq2++;
- m_mdctrl.io_timeout2->adjust(m_maincpu->cycles_to_attotime(8192));
- }
- m_ppi_prev = data;
-
- m_joy.ioc6 = data & 0x40;
- m_joy.ioc7 = data & 0x80;
-}
-
-
-// NEC uPD72065 at 0xe94000
-WRITE16_MEMBER(x68k_state::fdc_w)
-{
- unsigned int drive, x;
- switch(offset)
- {
- case 0x00: // drive option signal control
- x = data & 0x0f;
- for(drive=0;drive<4;drive++)
- {
- if(m_fdc.control_drives & (1 << drive))
- {
- if(!(x & (1 << drive))) // functions take place on 1->0 transitions of drive bits only
- {
- m_fdc.led_ctrl[drive] = data & 0x80; // blinking drive LED if no disk inserted
- m_fdc.led_eject[drive] = data & 0x40; // eject button LED (on when set to 0)
- m_eject_drv_out[drive] = BIT(data, 6);
- if((data & 0x60) == 0x20) // ejects disk
- m_fdc.floppy[drive]->unload();
- }
- }
- }
- m_fdc.control_drives = data & 0x0f;
- LOGMASKED(LOG_FDC, "FDC: signal control set to %02x\n",data);
- break;
- case 0x01: {
- x = data & 3;
- m_upd72065->set_floppy(m_fdc.floppy[x]);
- m_upd72065->set_rate((data & 0x10) ? 300000 : 500000);
- m_fdc.motor = data & 0x80;
-
- for(int i = 0; i < 4; i++)
- if(m_fdc.floppy[i]->exists())
- m_fdc.floppy[i]->mon_w(!BIT(data, 7));
-
- m_access_drv_out[x] = 0;
- if(x != m_fdc.select_drive)
- m_access_drv_out[m_fdc.select_drive] = 1;
- m_fdc.select_drive = x;
- LOGMASKED(LOG_FDC, "FDC: Drive #%i: Drive selection set to %02x\n",x,data);
- break;
- }
- }
-}
-
-READ16_MEMBER(x68k_state::fdc_r)
-{
- unsigned int ret;
- int x;
-
- switch(offset)
- {
- case 0x00:
- ret = 0x00;
- for(x=0;x<4;x++)
- {
- if(m_fdc.control_drives & (1 << x))
- {
- ret = 0x00;
- if(m_fdc.floppy[x]->exists())
- {
- ret |= 0x80;
- }
- // bit 7 = disk inserted
- // bit 6 = disk error (in insertion, presumably)
- LOGMASKED(LOG_FDC, "FDC: Drive #%i Disk check - returning %02x\n",x,ret);
- }
- }
- return ret;
- case 0x01:
- LOGMASKED(LOG_FDC, "FDC: IOC selection is write-only\n");
- return 0xff;
- }
- return 0xff;
-}
-
-WRITE_LINE_MEMBER( x68k_state::fdc_irq )
-{
- if((m_ioc.irqstatus & 0x04) && state)
- {
- m_ioc.irqstatus |= 0x80;
- LOGMASKED(LOG_FDC, "FDC: IRQ triggered\n");
- update_ipl();
- }
- else
- {
- m_ioc.irqstatus &= 0x7f;
- update_ipl();
- }
-}
-
-WRITE8_MEMBER(x68k_state::ct_w)
-{
- // CT1 and CT2 bits from YM2151 port 0x1b
- // CT1 - ADPCM clock - 0 = 8MHz, 1 = 4MHz
- // CT2 - 1 = Set ready state of FDC
- if(data & 1)
- {
- m_upd72065->set_ready_line_connected(0);
- m_upd72065->ready_w(0);
- }
- else
- m_upd72065->set_ready_line_connected(1);
-
- m_adpcm.clock = (data & 0x02) >> 1;
- set_adpcm();
- m_okim6258->set_unscaled_clock(adpcm_clock[m_adpcm.clock]);
-}
-
-/*
- Custom I/O controller at 0xe9c000
- 0xe9c001 (R) - Interrupt status
- 0xe9c001 (W) - Interrupt mask (low nibble only)
- - bit 7 = FDC interrupt
- - bit 6 = FDD interrupt
- - bit 5 = Printer Busy signal
- - bit 4 = HDD interrupt
- - bit 3 = HDD interrupts enabled
- - bit 2 = FDC interrupts enabled
- - bit 1 = FDD interrupts enabled
- - bit 0 = Printer interrupts enabled
- 0xe9c003 (W) - Interrupt vector
- - bits 7-2 = vector
- - bits 1,0 = device (00 = FDC, 01 = FDD, 10 = HDD, 11 = Printer)
-*/
-WRITE16_MEMBER(x68k_state::ioc_w)
-{
- switch(offset)
- {
- case 0x00:
- m_ioc.irqstatus = data & 0x0f;
- LOGMASKED(LOG_SYS, "I/O: Status register write %02x\n",data);
- break;
- case 0x01:
- switch(data & 0x03)
- {
- case 0x00:
- m_ioc.fdcvector = data & 0xfc;
- LOGMASKED(LOG_IRQ, "IOC: FDC IRQ vector = 0x%02x\n",data & 0xfc);
- break;
- case 0x01:
- m_ioc.fddvector = data & 0xfc;
- LOGMASKED(LOG_IRQ, "IOC: FDD IRQ vector = 0x%02x\n",data & 0xfc);
- break;
- case 0x02:
- m_ioc.hdcvector = data & 0xfc;
- LOGMASKED(LOG_IRQ, "IOC: HDD IRQ vector = 0x%02x\n",data & 0xfc);
- break;
- case 0x03:
- m_ioc.prnvector = data & 0xfc;
- LOGMASKED(LOG_IRQ, "IOC: Printer IRQ vector = 0x%02x\n",data & 0xfc);
- break;
- }
- break;
- }
-}
-
-READ16_MEMBER(x68k_state::ioc_r)
-{
- switch(offset)
- {
- case 0x00:
- LOGMASKED(LOG_SYS, "I/O: Status register read\n");
- return (m_ioc.irqstatus & 0xdf) | 0x20;
- default:
- return 0x00;
- }
-}
-
-/*
- System ports at 0xe8e000
- Port 1 (0xe8e001) - Monitor contrast (bits 3-0)
- Port 2 (0xe8e003) - Display / 3D scope control
- - bit 3 - Display control signal (0 = on)
- - bit 1 - 3D scope left shutter (0 = closed)
- - bit 0 - 3D scope right shutter
- Port 3 (0xe8e005) - Colour image unit control (bits 3-0)
- Port 4 (0xe8e007) - Keyboard/NMI/Dot clock
- - bit 3 - (R) 1 = Keyboard connected, (W) 1 = Key data can be transmitted
- - bit 1 - NMI Reset
- - bit 0 - HRL - high resolution dot clock - 1 = 1/2, 1/4, 1/8, 0 = 1/2, 1/3, 1/6 (normal)
- Port 5 (0xe8e009) - ROM (bits 7-4)/DRAM (bits 3-0) wait, X68030 only
- Port 6 (0xe8e00b) - CPU type and clock speed (XVI or later only, X68000 returns 0xFF)
- - bits 7-4 - CPU Type (1100 = 68040, 1101 = 68030, 1110 = 68020, 1111 = 68000)
- - bits 3-0 - clock speed (1001 = 50MHz, 40, 33, 25, 20, 16, 1111 = 10MHz)
- Port 7 (0xe8e00d) - SRAM write enable - if 0x31 is written to this port, writing to SRAM is allowed.
- Any other value, then SRAM is read only.
- Port 8 (0xe8e00f) - Power off control - write 0x00, 0x0f, 0x0f sequentially to switch power off.
-*/
-WRITE16_MEMBER(x68k_state::sysport_w)
-{
- switch(offset)
- {
- case 0x00:
- m_sysport.contrast = data & 0x0f; // often used for screen fades / blanking
- m_screen->set_brightness(m_sysport.contrast * 0x11);
- break;
- case 0x01:
- m_sysport.monitor = data & 0x08;
- break;
- case 0x03:
- m_sysport.keyctrl = data & 0x08; // bit 3 = enable keyboard data transmission
- break;
- case 0x06:
- COMBINE_DATA(&m_sysport.sram_writeprotect);
- break;
- default:
-// LOGMASKED(LOG_SYS, "SYS: [%08x] Wrote %04x to invalid or unimplemented system port %04x\n",m_maincpu->pc(),data,offset);
- break;
- }
-}
-
-READ16_MEMBER(x68k_state::sysport_r)
-{
- int ret = 0;
- switch(offset)
- {
- case 0x00: // monitor contrast setting (bits3-0)
- return m_sysport.contrast;
- case 0x01: // monitor control (bit3) / 3D Scope (bits1,0)
- ret |= m_sysport.monitor;
- return ret;
- case 0x03: // bit 3 = key control (is 1 if keyboard is connected)
- return 0x08;
- case 0x05: // CPU type and speed
- return m_sysport.cputype;
- default:
- LOGMASKED(LOG_SYS, "Read from invalid or unimplemented system port %04x\n",offset);
- return 0xff;
- }
-}
-
-WRITE16_MEMBER(x68k_state::ppi_w)
-{
- m_ppi->write(offset & 0x03,data);
-}
-
-READ16_MEMBER(x68k_state::ppi_r)
-{
- return m_ppi->read(offset & 0x03);
-}
-
-
-WRITE16_MEMBER(x68k_state::sram_w)
-{
- if(m_sysport.sram_writeprotect == 0x31)
- {
- COMBINE_DATA(&m_nvram[offset]);
- }
-}
-
-READ16_MEMBER(x68k_state::sram_r)
-{
- // HACKS!
-// if(offset == 0x5a/2) // 0x5a should be 0 if no SASI HDs are present.
-// return 0x0000;
- if(offset == 0x08/2)
- return m_ram->size() >> 16; // RAM size
- return m_nvram[offset];
-}
-
-WRITE16_MEMBER(x68k_state::vid_w)
-{
- switch(offset)
- {
- case 0x000:
- COMBINE_DATA(m_video.reg);
- break;
- case 0x080: // priority levels
- COMBINE_DATA(m_video.reg+1);
- if(ACCESSING_BITS_0_7)
- {
- m_video.gfxlayer_pri[0] = data & 0x0003;
- m_video.gfxlayer_pri[1] = (data & 0x000c) >> 2;
- m_video.gfxlayer_pri[2] = (data & 0x0030) >> 4;
- m_video.gfxlayer_pri[3] = (data & 0x00c0) >> 6;
- }
- if(ACCESSING_BITS_8_15)
- {
- m_video.gfx_pri = (data & 0x0300) >> 8;
- m_video.text_pri = (data & 0x0c00) >> 10;
- m_video.sprite_pri = (data & 0x3000) >> 12;
- if(m_video.gfx_pri == 3)
- m_video.gfx_pri--;
- if(m_video.text_pri == 3)
- m_video.text_pri--;
- if(m_video.sprite_pri == 3)
- m_video.sprite_pri--;
- }
- break;
- case 0x100:
- COMBINE_DATA(m_video.reg+2);
- break;
- default:
- LOGMASKED(LOG_SYS, "VC: Invalid video controller write (offset = 0x%04x, data = %04x)\n",offset,data);
- }
-}
-
-READ16_MEMBER(x68k_state::vid_r)
-{
- switch(offset)
- {
- case 0x000:
- return m_video.reg[0];
- case 0x080:
- return m_video.reg[1];
- case 0x100:
- return m_video.reg[2];
- default:
- LOGMASKED(LOG_SYS, "VC: Invalid video controller read (offset = 0x%04x)\n",offset);
- }
-
- return 0xff;
-}
-
-READ16_MEMBER(x68k_state::areaset_r)
-{
- // register is write-only
- return 0xffff;
-}
-
-WRITE16_MEMBER(x68k_state::areaset_w)
-{
- // TODO
- LOGMASKED(LOG_SYS, "SYS: Supervisor area set: 0x%02x\n",data & 0xff);
-}
-
-WRITE16_MEMBER(x68k_state::enh_areaset_w )
-{
- // TODO
- LOGMASKED(LOG_SYS, "SYS: Enhanced Supervisor area set (from %iMB): 0x%02x\n",(offset + 1) * 2,data & 0xff);
-}
-
-TIMER_CALLBACK_MEMBER(x68k_state::bus_error)
-{
- m_bus_error = false;
-}
-
-void x68k_state::set_bus_error(uint32_t address, bool rw, uint16_t mem_mask)
-{
- if(m_bus_error)
- return;
- if(!ACCESSING_BITS_8_15)
- address++;
- m_bus_error = true;
- m_maincpu->set_buserror_details(address, rw, m_maincpu->get_fc());
- m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
- m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE);
- m_bus_error_timer->adjust(m_maincpu->cycles_to_attotime(16)); // let rmw cycles complete
- LOGMASKED(LOG_SYS, "%s: Bus error: Unused RAM access [%08x]\n", machine().describe_context(), address);
-}
-
-READ16_MEMBER(x68k_state::rom0_r)
-{
- /* this location contains the address of some expansion device ROM, if no ROM exists,
- then access causes a bus error */
- if((m_options->read() & 0x02) && !machine().side_effects_disabled())
- set_bus_error((offset << 1) + 0xbffffc, true, mem_mask);
- return 0xff;
-}
-
-WRITE16_MEMBER(x68k_state::rom0_w)
-{
- /* this location contains the address of some expansion device ROM, if no ROM exists,
- then access causes a bus error */
- if((m_options->read() & 0x02) && !machine().side_effects_disabled())
- set_bus_error((offset << 1) + 0xbffffc, false, mem_mask);
-}
-
-READ16_MEMBER(x68k_state::emptyram_r)
-{
- /* this location is unused RAM, access here causes a bus error
- Often a method for detecting amount of installed RAM, is to read or write at 1MB intervals, until a bus error occurs */
- if((m_options->read() & 0x02) && !machine().side_effects_disabled())
- set_bus_error((offset << 1), 0, mem_mask);
- return 0xff;
-}
-
-WRITE16_MEMBER(x68k_state::emptyram_w)
-{
- /* this location is unused RAM, access here causes a bus error
- Often a method for detecting amount of installed RAM, is to read or write at 1MB intervals, until a bus error occurs */
- if((m_options->read() & 0x02) && !machine().side_effects_disabled())
- set_bus_error((offset << 1), 1, mem_mask);
-}
-
-READ16_MEMBER(x68k_state::exp_r)
-{
- /* These are expansion devices, if not present, they cause a bus error */
- if((m_options->read() & 0x02) && !machine().side_effects_disabled())
- set_bus_error((offset << 1) + 0xeafa00, 0, mem_mask);
- return 0xff;
-}
-
-WRITE16_MEMBER(x68k_state::exp_w)
-{
- /* These are expansion devices, if not present, they cause a bus error */
- if((m_options->read() & 0x02) && !machine().side_effects_disabled())
- set_bus_error((offset << 1) + 0xeafa00, 1, mem_mask);
-}
-
-WRITE_LINE_MEMBER(x68k_state::dma_irq)
-{
- m_dmac_int = state != CLEAR_LINE;
- update_ipl();
-}
-
-WRITE8_MEMBER(x68k_state::dma_end)
-{
- if(offset == 0)
- {
- m_fdc_tc->adjust(attotime::from_usec(1), 0, attotime::never);
- }
-}
-
-WRITE_LINE_MEMBER(x68k_state::fm_irq)
-{
- if(state == CLEAR_LINE)
- {
- m_mfpdev->i3_w(1);
- }
- else
- {
- m_mfpdev->i3_w(0);
- }
-}
-
-WRITE8_MEMBER(x68k_state::adpcm_w)
-{
- switch(offset)
- {
- case 0x00:
- m_okim6258->ctrl_w(data);
- break;
- case 0x01:
- m_okim6258->data_w(data);
- break;
- }
-}
-
-WRITE_LINE_MEMBER(x68k_state::mfp_irq_callback)
-{
- m_mfp_int = state;
- update_ipl();
-}
-
-void x68k_state::update_ipl()
-{
- uint8_t new_ipl = 0;
- if (m_exp_nmi[0] || m_exp_nmi[1])
- new_ipl = 7;
- else if (m_mfp_int)
- new_ipl = 6;
- else if (m_mouse.irqactive)
- new_ipl = 5;
- else if (m_exp_irq4[0] || m_exp_irq4[1])
- new_ipl = 4;
- else if (m_dmac_int)
- new_ipl = 3;
- else if (m_exp_irq2[0] || m_exp_irq2[1])
- new_ipl = 2;
- else if ((m_ioc.irqstatus & 0xf0) != 0)
- new_ipl = 1;
-
- if (m_current_ipl != new_ipl)
- {
- if (m_current_ipl != 0)
- m_maincpu->set_input_line(m_current_ipl, CLEAR_LINE);
- LOGMASKED(LOG_IRQ, "Changing interrupt level from %d to %d\n", m_current_ipl, new_ipl);
- m_current_ipl = new_ipl;
- if (m_current_ipl != 0)
- m_maincpu->set_input_line(m_current_ipl, ASSERT_LINE);
- }
-}
-
-uint8_t x68k_state::iack1()
-{
- uint8_t vector = 0x18;
- if (BIT(m_ioc.irqstatus, 7))
- {
- vector = m_ioc.fdcvector;
- if (!machine().side_effects_disabled())
- {
- m_ioc.irqstatus &= 0x7f;
- update_ipl();
- }
- }
- else if (BIT(m_ioc.irqstatus, 6))
- {
- vector = 0x61 /*m_ioc.fddvector*/;
- if (!machine().side_effects_disabled())
- {
- m_ioc.irqstatus &= 0xbf;
- update_ipl();
- }
- }
- else if (BIT(m_ioc.irqstatus, 5))
- {
- vector = m_ioc.prnvector;
- if (!machine().side_effects_disabled())
- {
- m_ioc.irqstatus &= 0xdf;
- update_ipl();
- }
- }
- else if (BIT(m_ioc.irqstatus, 4))
- {
- vector = 0x6c /*m_ioc.hdcvector*/;
- if (!machine().side_effects_disabled())
- {
- m_ioc.irqstatus &= 0xef;
- update_ipl();
- }
- }
-
- if (!machine().side_effects_disabled())
- LOGMASKED(LOG_IRQ, "IOC: IRQ1 acknowledged with vector = %02X\n", vector);
- return vector;
-}
-
-template <int N>
-WRITE_LINE_MEMBER(x68k_state::irq2_line)
-{
- m_exp_irq2[N] = (state != CLEAR_LINE);
- LOGMASKED(LOG_IRQ, "IRQ2-%d %s\n", N + 1, m_exp_irq2[N] ? "asserted" : "cleared");
- update_ipl();
-}
-
-template <int N>
-WRITE_LINE_MEMBER(x68k_state::irq4_line)
-{
- m_exp_irq4[N] = (state != CLEAR_LINE);
- LOGMASKED(LOG_IRQ, "IRQ4-%d %s\n", N + 1, m_exp_irq4[N] ? "asserted" : "cleared");
- update_ipl();
-}
-
-template <int N>
-WRITE_LINE_MEMBER(x68k_state::nmi_line)
-{
- m_exp_nmi[N] = (state != CLEAR_LINE);
- LOGMASKED(LOG_IRQ, "EXNMI %s on expansion %d\n", m_exp_nmi[N] ? "asserted" : "cleared", N + 1);
- update_ipl();
-}
-
-uint8_t x68k_state::iack2()
-{
- // Relative priority of IACK2-1 and IACK2-2 is unknown
- if (m_exp_irq2[0])
- return m_expansion[0]->iack2();
- else if (m_exp_irq2[1])
- return m_expansion[1]->iack2();
- else
- return 0x18; // spurious interrupt
-}
-
-uint8_t x68k_state::iack4()
-{
- // Relative priority of IACK4-1 and IACK4-2 is unknown
- if (m_exp_irq4[0])
- return m_expansion[0]->iack4();
- else if (m_exp_irq4[1])
- return m_expansion[1]->iack4();
- else
- return 0x18; // spurious interrupt
-}
-
-uint8_t x68k_state::iack5()
-{
- if (!machine().side_effects_disabled())
- {
- m_mouse.irqactive = false;
- update_ipl();
- }
-
- // TODO: use vector from SCC
- return m_mouse.irqvector;
-}
-
-void x68k_state::cpu_space_map(address_map &map)
-{
- map.global_mask(0xffffff);
- map(0xfffff3, 0xfffff3).r(FUNC(x68k_state::iack1));
- map(0xfffff5, 0xfffff5).r(FUNC(x68k_state::iack2));
- map(0xfffff7, 0xfffff7).r(m_hd63450, FUNC(hd63450_device::iack));
- map(0xfffff9, 0xfffff9).r(FUNC(x68k_state::iack4));
- map(0xfffffb, 0xfffffb).r(FUNC(x68k_state::iack5));
- map(0xfffffd, 0xfffffd).r(m_mfpdev, FUNC(mc68901_device::get_vector));
- map(0xffffff, 0xffffff).lr8(NAME([] () { return m68000_base_device::autovector(7); }));
-}
-
-WRITE_LINE_MEMBER(x68ksupr_state::scsi_irq)
-{
- LOGMASKED(LOG_IRQ, "SCSI IRQ %s\n", state ? "asserted" : "cleared");
-
- // TODO : Internal SCSI IRQ vector 0x6c, External SCSI IRQ vector 0xf6, IRQs go through the IOSC (IRQ line 1)
- if(state != 0)
- {
- m_ioc.irqstatus |= 0x10;
- update_ipl();
- }
-}
-
-WRITE_LINE_MEMBER(x68ksupr_state::scsi_drq)
-{
- // TODO
-}
-
-void x68k_state::x68k_base_map(address_map &map)
-{
- map(0x000000, 0xbffffb).rw(FUNC(x68k_state::emptyram_r), FUNC(x68k_state::emptyram_w));
- map(0xbffffc, 0xbfffff).rw(FUNC(x68k_state::rom0_r), FUNC(x68k_state::rom0_w));
- map(0xc00000, 0xdfffff).rw(m_crtc, FUNC(x68k_crtc_device::gvram_r), FUNC(x68k_crtc_device::gvram_w));
- map(0xe00000, 0xe7ffff).rw(m_crtc, FUNC(x68k_crtc_device::tvram_r), FUNC(x68k_crtc_device::tvram_w));
- map(0xe80000, 0xe81fff).rw(m_crtc, FUNC(x68k_crtc_device::crtc_r), FUNC(x68k_crtc_device::crtc_w));
- map(0xe82400, 0xe83fff).rw(FUNC(x68k_state::vid_r), FUNC(x68k_state::vid_w));
- map(0xe84000, 0xe85fff).rw(m_hd63450, FUNC(hd63450_device::read), FUNC(hd63450_device::write));
- map(0xe86000, 0xe87fff).rw(FUNC(x68k_state::areaset_r), FUNC(x68k_state::areaset_w));
- map(0xe88000, 0xe89fff).rw(m_mfpdev, FUNC(mc68901_device::read), FUNC(mc68901_device::write)).umask16(0x00ff);
- map(0xe8a000, 0xe8bfff).rw(m_rtc, FUNC(rp5c15_device::read), FUNC(rp5c15_device::write)).umask16(0x00ff);
-// map(0xe8c000, 0xe8dfff).rw(FUNC(x68k_state::x68k_printer_r), FUNC(x68k_state::x68k_printer_w));
- map(0xe8e000, 0xe8ffff).rw(FUNC(x68k_state::sysport_r), FUNC(x68k_state::sysport_w));
- map(0xe90000, 0xe91fff).rw(m_ym2151, FUNC(ym2151_device::read), FUNC(ym2151_device::write)).umask16(0x00ff);
- map(0xe94000, 0xe94003).m(m_upd72065, FUNC(upd72065_device::map)).umask16(0x00ff);
- map(0xe94004, 0xe94007).rw(FUNC(x68k_state::fdc_r), FUNC(x68k_state::fdc_w));
- map(0xe98000, 0xe99fff).rw(FUNC(x68k_state::scc_r), FUNC(x68k_state::scc_w));
- map(0xe9a000, 0xe9bfff).rw(FUNC(x68k_state::ppi_r), FUNC(x68k_state::ppi_w));
- map(0xe9c000, 0xe9dfff).rw(FUNC(x68k_state::ioc_r), FUNC(x68k_state::ioc_w));
- map(0xe9e000, 0xe9e3ff).rw(FUNC(x68k_state::exp_r), FUNC(x68k_state::exp_w)); // FPU (Optional)
- map(0xeafa00, 0xeafa1f).rw(FUNC(x68k_state::exp_r), FUNC(x68k_state::exp_w));
- map(0xeb0000, 0xeb7fff).rw(FUNC(x68k_state::spritereg_r), FUNC(x68k_state::spritereg_w));
- map(0xeb8000, 0xebffff).rw(FUNC(x68k_state::spriteram_r), FUNC(x68k_state::spriteram_w));
- map(0xece000, 0xece3ff).rw(FUNC(x68k_state::exp_r), FUNC(x68k_state::exp_w)); // User I/O
- map(0xed0000, 0xed3fff).rw(FUNC(x68k_state::sram_r), FUNC(x68k_state::sram_w));
- map(0xed4000, 0xefffff).noprw();
- map(0xf00000, 0xfbffff).rom();
- map(0xfe0000, 0xffffff).rom();
-}
-
-void x68k_state::x68k_map(address_map &map)
-{
- x68k_base_map(map);
- map(0xe82000, 0xe821ff).rw(m_gfxpalette, FUNC(palette_device::read16), FUNC(palette_device::write16)).share("gfxpalette");
- map(0xe82200, 0xe823ff).rw(m_pcgpalette, FUNC(palette_device::read16), FUNC(palette_device::write16)).share("pcgpalette");
- map(0xe92001, 0xe92001).rw(m_okim6258, FUNC(okim6258_device::status_r), FUNC(okim6258_device::ctrl_w));
- map(0xe92003, 0xe92003).rw(m_okim6258, FUNC(okim6258_device::status_r), FUNC(okim6258_device::data_w));
- map(0xe96000, 0xe9601f).rw("x68k_hdc", FUNC(x68k_hdc_image_device::hdc_r), FUNC(x68k_hdc_image_device::hdc_w));
- map(0xea0000, 0xea1fff).rw(FUNC(x68k_state::exp_r), FUNC(x68k_state::exp_w)); // external SCSI ROM and controller
- map(0xeafa80, 0xeafa89).rw(FUNC(x68k_state::areaset_r), FUNC(x68k_state::enh_areaset_w));
- map(0xfc0000, 0xfdffff).rw(FUNC(x68k_state::exp_r), FUNC(x68k_state::exp_w)); // internal SCSI ROM
-}
-
-void x68ksupr_state::x68kxvi_map(address_map &map)
-{
- x68k_base_map(map);
- map(0xe82000, 0xe821ff).rw(m_gfxpalette, FUNC(palette_device::read16), FUNC(palette_device::write16)).share("gfxpalette");
- map(0xe82200, 0xe823ff).rw(m_pcgpalette, FUNC(palette_device::read16), FUNC(palette_device::write16)).share("pcgpalette");
- map(0xe92001, 0xe92001).rw(m_okim6258, FUNC(okim6258_device::status_r), FUNC(okim6258_device::ctrl_w));
- map(0xe92003, 0xe92003).rw(m_okim6258, FUNC(okim6258_device::status_r), FUNC(okim6258_device::data_w));
- map(0xe96020, 0xe9603f).rw(m_scsictrl, FUNC(mb89352_device::mb89352_r), FUNC(mb89352_device::mb89352_w)).umask16(0x00ff);
- map(0xea0000, 0xea1fff).rw(FUNC(x68ksupr_state::exp_r), FUNC(x68ksupr_state::exp_w)); // external SCSI ROM and controller
- map(0xeafa80, 0xeafa89).rw(FUNC(x68ksupr_state::areaset_r), FUNC(x68ksupr_state::enh_areaset_w));
- map(0xfc0000, 0xfdffff).rom(); // internal SCSI ROM
-}
-
-void x68030_state::x68030_map(address_map &map)
-{
- map.global_mask(0x00ffffff); // Still only has 24-bit address space
- x68k_base_map(map);
- map(0xe82000, 0xe821ff).rw(m_gfxpalette, FUNC(palette_device::read32), FUNC(palette_device::write32)).share("gfxpalette");
- map(0xe82200, 0xe823ff).rw(m_pcgpalette, FUNC(palette_device::read32), FUNC(palette_device::write32)).share("pcgpalette");
-// map(0xe8c000, 0xe8dfff).rw(FUNC(x68k_state::x68k_printer_r), FUNC(x68k_state::x68k_printer_w));
- map(0xe92000, 0xe92003).r(m_okim6258, FUNC(okim6258_device::status_r)).umask32(0x00ff00ff).w(FUNC(x68030_state::adpcm_w)).umask32(0x00ff00ff);
-
- map(0xe96020, 0xe9603f).rw(m_scsictrl, FUNC(mb89352_device::mb89352_r), FUNC(mb89352_device::mb89352_w)).umask32(0x00ff00ff);
- map(0xea0000, 0xea1fff).noprw();//.rw(FUNC(x68030_state::exp_r), FUNC(x68030_state::exp_w)); // external SCSI ROM and controller
- map(0xeafa80, 0xeafa8b).rw(FUNC(x68030_state::areaset_r), FUNC(x68030_state::enh_areaset_w));
- map(0xfc0000, 0xfdffff).rom(); // internal SCSI ROM
-}
-
-static INPUT_PORTS_START( x68000 )
- PORT_START("ctrltype")
- PORT_CONFNAME(0x0f, 0x00, "Joystick Port 1")
- PORT_CONFSETTING(0x00, "Standard 2-button MSX/FM-Towns joystick")
- PORT_CONFSETTING(0x01, "3-button Megadrive gamepad")
- PORT_CONFSETTING(0x02, "6-button Megadrive gamepad")
- PORT_CONFSETTING(0x03, "XPD-1LR dual D-pad gamepad")
- PORT_CONFNAME(0xf0, 0x00, "Joystick Port 2")
- PORT_CONFSETTING(0x00, "Standard 2-button MSX/FM-Towns joystick")
- PORT_CONFSETTING(0x10, "3-button Megadrive gamepad")
- PORT_CONFSETTING(0x20, "6-button Megadrive gamepad")
- PORT_CONFSETTING(0x30, "XPD-1LR dual D-pad gamepad")
-// TODO: Sharp Cyber Stick (CZ-8NJ2) support
-
- PORT_START( "joy1" )
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_CODE(JOYCODE_Y_UP_SWITCH) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x00)
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_CODE(JOYCODE_Y_DOWN_SWITCH) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x00)
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CODE(JOYCODE_X_LEFT_SWITCH) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x00)
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CODE(JOYCODE_X_RIGHT_SWITCH) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x00)
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x00)
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(JOYCODE_BUTTON1) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x00)
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(JOYCODE_BUTTON2) PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x00)
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x00)
-
- PORT_START( "joy2" )
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_CODE(JOYCODE_Y_UP_SWITCH) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x00)
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_CODE(JOYCODE_Y_DOWN_SWITCH) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x00)
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CODE(JOYCODE_X_LEFT_SWITCH) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x00)
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CODE(JOYCODE_X_RIGHT_SWITCH) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x00)
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x00)
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(JOYCODE_BUTTON1) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x00)
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(JOYCODE_BUTTON2) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x00)
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x00)
-
- PORT_START("options")
- PORT_CONFNAME( 0x02, 0x02, "Enable fake bus errors")
- PORT_CONFSETTING( 0x00, DEF_STR( Off ))
- PORT_CONFSETTING( 0x02, DEF_STR( On ))
-
- PORT_START("mouse1") // mouse buttons
- PORT_BIT( 0x00000001, IP_ACTIVE_HIGH, IPT_BUTTON9) PORT_NAME("Left mouse button") PORT_CODE(MOUSECODE_BUTTON1)
- PORT_BIT( 0x00000002, IP_ACTIVE_HIGH, IPT_BUTTON10) PORT_NAME("Right mouse button") PORT_CODE(MOUSECODE_BUTTON2)
-
- PORT_START("mouse2") // X-axis
- PORT_BIT( 0xff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_PLAYER(1)
-
- PORT_START("mouse3") // Y-axis
- PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_PLAYER(1)
-
- // 3-button Megadrive gamepad
- PORT_START("md3b")
- PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_NAME("MD Pad 1 Up") PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
- PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_NAME("MD Pad 1 Down") PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
- PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_NAME("MD Pad 1 Left") PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
- PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_NAME("MD Pad 1 Right") PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
- PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
- PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("MD Pad 1 B Button") PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
- PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("MD Pad 1 C Button") PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
- PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
-
- PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
- PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
- PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
- PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
- PORT_BIT( 0x00001000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
- PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("MD Pad 1 A Button") PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
- PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_START ) PORT_PLAYER(1) PORT_NAME("MD Pad 1 Start Button") PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
- PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x01)
-
- PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_NAME("MD Pad 2 Up") PORT_8WAY PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
- PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_NAME("MD Pad 2 Down") PORT_8WAY PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
- PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_NAME("MD Pad 2 Left") PORT_8WAY PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
- PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_NAME("MD Pad 2 Right") PORT_8WAY PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
- PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
- PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("MD Pad 2 B Button") PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
- PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("MD Pad 2 C Button") PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
- PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
-
- PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
- PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
- PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
- PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
- PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
- PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("MD Pad 2 A Button") PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
- PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_START ) PORT_PLAYER(2) PORT_NAME("MD Pad 2 Start Button") PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
- PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x10)
-
- // 6-button Megadrive gamepad
- PORT_START("md6b")
- PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_NAME("MD Pad 1 Up") PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_NAME("MD Pad 1 Down") PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_NAME("MD Pad 1 Left") PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_NAME("MD Pad 1 Right") PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("MD Pad 1 B Button") PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("MD Pad 1 C Button") PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
-
- PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x00001000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("MD Pad 1 A Button") PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_START ) PORT_PLAYER(1) PORT_NAME("MD Pad 1 Start Button") PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
-
- PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_NAME("MD Pad 2 Up") PORT_8WAY PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_NAME("MD Pad 2 Down") PORT_8WAY PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_NAME("MD Pad 2 Left") PORT_8WAY PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_NAME("MD Pad 2 Right") PORT_8WAY PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("MD Pad 2 B Button") PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("MD Pad 2 C Button") PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
-
- PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("MD Pad 2 A Button") PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_START ) PORT_PLAYER(2) PORT_NAME("MD Pad 2 Start Button") PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
-
- // extra inputs
- PORT_START("md6b_extra")
- PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1) PORT_NAME("MD Pad 1 Z Button") PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("MD Pad 1 Y Button") PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("MD Pad 1 X Button") PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_PLAYER(1) PORT_NAME("MD Pad 1 Mode Button") PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x02)
-
- PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_NAME("MD Pad 2 Z Button") PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("MD Pad 2 Y Button") PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("MD Pad 2 X Button") PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
- PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_PLAYER(2) PORT_NAME("MD Pad 2 Mode Button") PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x20)
-
- // Dempa/Micomsoft XPD-1LR (dual D-pad gamepad sold with Libble Rabble)
- PORT_START("xpd1lr")
- PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_UP ) PORT_NAME("XPD Pad 1 Left/Up") PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x03)
- PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_DOWN ) PORT_NAME("XPD Pad 1 Left/Down") PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x03)
- PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_LEFT ) PORT_NAME("XPD Pad 1 Left/Left") PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x03)
- PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_RIGHT ) PORT_NAME("XPD Pad 1 Left/Right") PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x03)
- PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x03)
- PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("XPD Pad 1 B Button") PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x03)
- PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("XPD Pad 1 A Button") PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x03)
- PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x03)
-
- PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP ) PORT_NAME("XPD Pad 1 Right/Up") PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x03)
- PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN ) PORT_NAME("XPD Pad 1 Right/Down") PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x03)
- PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT ) PORT_NAME("XPD Pad 1 Right/Left") PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x03)
- PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT ) PORT_NAME("XPD Pad 1 Right/Right") PORT_8WAY PORT_PLAYER(1) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x03)
- PORT_BIT( 0x00001000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x03)
- PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x03)
- PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x03)
- PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0x0f, EQUALS, 0x03)
-
- PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_UP ) PORT_NAME("XPD Pad 2 Left/Up") PORT_8WAY PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x30)
- PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_DOWN ) PORT_NAME("XPD Pad 2 Left/Down") PORT_8WAY PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x30)
- PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_LEFT ) PORT_NAME("XPD Pad 2 Left/Left") PORT_8WAY PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x30)
- PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_RIGHT ) PORT_NAME("XPD Pad 2 Left/Right") PORT_8WAY PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x30)
- PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x30)
- PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("XPD Pad 2 B Button") PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x30)
- PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("XPD Pad 2 A Button") PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x30)
- PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x30)
-
- PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP ) PORT_NAME("XPD Pad 2 Right/Up") PORT_8WAY PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x30)
- PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN ) PORT_NAME("XPD Pad 2 Right/Down") PORT_8WAY PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x30)
- PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT ) PORT_NAME("XPD Pad 2 Right/Left") PORT_8WAY PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x30)
- PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT ) PORT_NAME("XPD Pad 2 Right/Right") PORT_8WAY PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x30)
- PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x30)
- PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x30)
- PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x30)
- PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x30)
-
-INPUT_PORTS_END
-
-void x68k_state::floppy_load_unload(bool load, floppy_image_device *dev)
-{
- dev->mon_w(!(m_fdc.motor && load));
- if(m_ioc.irqstatus & 0x02)
- {
- m_ioc.irqstatus |= 0x40; // Disk insert/eject interrupt
- LOGMASKED(LOG_FDC, "IOC: Disk image inserted\n");
- update_ipl();
- }
-}
-
-image_init_result x68k_state::floppy_load(floppy_image_device *dev)
-{
- floppy_load_unload(true, dev);
- return image_init_result::PASS;
-}
-
-void x68k_state::floppy_unload(floppy_image_device *dev)
-{
- floppy_load_unload(false, dev);
-}
-
-static void x68000_exp_cards(device_slot_interface &device)
-{
- device.option_add("neptunex", X68K_NEPTUNEX); // Neptune-X ethernet adapter (ISA NE2000 bridge)
- device.option_add("cz6bs1", X68K_SCSIEXT); // Sharp CZ-6BS1 SCSI-1 controller
- device.option_add("x68k_midi", X68K_MIDI); // X68000 MIDI interface
-}
-
-void x68k_state::machine_reset()
-{
- /* The last half of the IPLROM is mapped to 0x000000 on reset only
- Just copying the initial stack pointer and program counter should
- more or less do the same job */
-
- uint8_t *const romdata = memregion("user2")->base();
-
- memset(m_ram->pointer(),0,m_ram->size());
- memcpy(m_ram->pointer(),romdata,8);
-
- /// TODO: get callbacks to trigger these
- m_mfpdev->i0_w(1); // alarm
- m_mfpdev->i1_w(1); // expon
- m_mfpdev->i2_w(0); // pow sw
- m_mfpdev->i3_w(1); // fmirq
- //m_mfpdev->i4_w(1); // v-disp
- m_mfpdev->i5_w(1); // unused (always set)
- //m_mfpdev->i6_w(1); // cirq
- //m_mfpdev->i7_w(1); // h-sync
-
- // reset output values
- output().set_value("key_led_kana",1);
- output().set_value("key_led_romaji",1);
- output().set_value("key_led_code",1);
- output().set_value("key_led_caps",1);
- output().set_value("key_led_insert",1);
- output().set_value("key_led_hiragana",1);
- output().set_value("key_led_fullsize",1);
- std::fill(std::begin(m_eject_drv_out), std::end(m_eject_drv_out), 1);
- std::fill(std::begin(m_ctrl_drv_out), std::end(m_ctrl_drv_out), 1);
- std::fill(std::begin(m_access_drv_out), std::end(m_access_drv_out), 1);
- m_fdc.select_drive = 0;
-
- m_ioc.irqstatus &= 0x0f;
- update_ipl();
-}
-
-void x68k_state::machine_start()
-{
- // resolve outputs
- m_eject_drv_out.resolve();
- m_ctrl_drv_out.resolve();
- m_access_drv_out.resolve();
-
- address_space &space = m_maincpu->space(AS_PROGRAM);
- // install RAM handlers
- m_spriteram = (uint16_t*)(memregion("user1")->base());
- space.install_readwrite_bank(0x000000,m_ram->size()-1,"bank1");
- membank("bank1")->set_base(m_ram->pointer());
-
- // start mouse timer
- m_mouse_timer->adjust(attotime::zero, 0, attotime::from_msec(1)); // a guess for now
- m_mouse.inputtype = 0;
-
- // start LED timer
- m_led_timer->adjust(attotime::zero, 0, attotime::from_msec(400));
-
- for(int drive=0;drive<4;drive++)
- {
- char devname[16];
- sprintf(devname, "%d", drive);
- floppy_image_device *floppy = m_upd72065->subdevice<floppy_connector>(devname)->get_device();
- m_fdc.floppy[drive] = floppy;
- if(floppy) {
- floppy->setup_load_cb(floppy_image_device::load_cb(&x68k_state::floppy_load, this));
- floppy->setup_unload_cb(floppy_image_device::unload_cb(&x68k_state::floppy_unload, this));
- }
- }
- m_fdc.motor = 0;
-
- m_dmac_int = false;
- m_mfp_int = false;
- m_exp_irq2[0] = m_exp_irq2[1] = false;
- m_exp_irq4[0] = m_exp_irq4[1] = false;
- m_exp_nmi[0] = m_exp_nmi[1] = false;
- m_ioc.irqstatus = 0;
- m_mouse.irqactive = false;
- m_current_ipl = 0;
-}
-
-void x68k_state::driver_init()
-{
- unsigned char* rom = memregion("maincpu")->base();
- unsigned char* user2 = memregion("user2")->base();
-
- subdevice<nvram_device>("nvram")->set_base(&m_nvram[0], m_nvram.size()*sizeof(m_nvram[0]));
-
-#ifdef USE_PREDEFINED_SRAM
- {
- unsigned char* ramptr = memregion("user3")->base();
- memcpy(m_sram,ramptr,0x4000);
- }
-#endif
-
- // copy last half of BIOS to a user region, to use for initial startup
- memcpy(user2,(rom+0xff0000),0x10000);
-
- m_mouse_timer = timer_alloc(TIMER_X68K_SCC_ACK);
- m_led_timer = timer_alloc(TIMER_X68K_LED);
- m_fdc_tc = timer_alloc(TIMER_X68K_FDC_TC);
- m_adpcm_timer = timer_alloc(TIMER_X68K_ADPCM);
- m_bus_error_timer = timer_alloc(TIMER_X68K_BUS_ERROR);
-
- // Initialise timers for 6-button MD controllers
- md_6button_init();
-
- m_sysport.cputype = 0xff; // 68000, 10MHz
- m_is_32bit = false;
-
- save_item(NAME(m_tvram));
- save_item(NAME(m_gvram));
- save_item(NAME(m_spritereg));
-}
-
-void x68ksupr_state::driver_init()
-{
- x68k_state::driver_init();
- m_sysport.cputype = 0xfe; // 68000, 16MHz
- m_is_32bit = false;
-}
-
-void x68030_state::driver_init()
-{
- x68k_state::driver_init();
- m_sysport.cputype = 0xdc; // 68030, 25MHz
- m_is_32bit = true;
-}
-
-FLOPPY_FORMATS_MEMBER( x68k_state::floppy_formats )
- FLOPPY_XDF_FORMAT,
- FLOPPY_DIM_FORMAT
-FLOPPY_FORMATS_END
-
-static void x68k_floppies(device_slot_interface &device)
-{
- device.option_add("525hd", FLOPPY_525_HD);
-}
-
-static void keyboard_devices(device_slot_interface &device)
-{
- device.option_add("x68k", X68K_KEYBOARD);
-}
-
-void x68k_state::x68000_base(machine_config &config)
-{
- config.set_maximum_quantum(attotime::from_hz(60));
-
- /* device hardware */
- MC68901(config, m_mfpdev, 16_MHz_XTAL / 4);
- m_mfpdev->set_timer_clock(16_MHz_XTAL / 4);
- m_mfpdev->set_rx_clock(0);
- m_mfpdev->set_tx_clock(0);
- m_mfpdev->out_irq_cb().set(FUNC(x68k_state::mfp_irq_callback));
- m_mfpdev->out_tbo_cb().set(m_mfpdev, FUNC(mc68901_device::clock_w));
- m_mfpdev->out_so_cb().set("keyboard", FUNC(rs232_port_device::write_txd));
-
- rs232_port_device &keyboard(RS232_PORT(config, "keyboard", keyboard_devices, "x68k"));
- keyboard.rxd_handler().set(m_mfpdev, FUNC(mc68901_device::write_rx));
-
- I8255A(config, m_ppi, 0);
- m_ppi->in_pa_callback().set(FUNC(x68k_state::ppi_port_a_r));
- m_ppi->in_pb_callback().set(FUNC(x68k_state::ppi_port_b_r));
- m_ppi->in_pc_callback().set(FUNC(x68k_state::ppi_port_c_r));
- m_ppi->out_pc_callback().set(FUNC(x68k_state::ppi_port_c_w));
-
- HD63450(config, m_hd63450, 40_MHz_XTAL / 4, "maincpu");
- m_hd63450->set_clocks(attotime::from_usec(2), attotime::from_nsec(450), attotime::from_usec(4), attotime::from_hz(15625/2));
- m_hd63450->set_burst_clocks(attotime::from_usec(2), attotime::from_nsec(450), attotime::from_nsec(50), attotime::from_nsec(50));
- m_hd63450->irq_callback().set(FUNC(x68k_state::dma_irq));
- m_hd63450->dma_end().set(FUNC(x68k_state::dma_end));
- m_hd63450->dma_read<0>().set("upd72065", FUNC(upd72065_device::dma_r));
- m_hd63450->dma_write<0>().set("upd72065", FUNC(upd72065_device::dma_w));
-
- SCC8530(config, m_scc, 40_MHz_XTAL / 8);
-
- RP5C15(config, m_rtc, 32.768_kHz_XTAL);
- m_rtc->alarm().set(m_mfpdev, FUNC(mc68901_device::i0_w));
-
- /* video hardware */
- SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
- m_screen->set_raw(69.55199_MHz_XTAL / 2, 1096, 0, 768, 568, 0, 512); // initial setting
- m_screen->set_screen_update(FUNC(x68k_state::screen_update));
-
- GFXDECODE(config, m_gfxdecode, "pcgpalette", gfxdecode_device::empty);
-
- PALETTE(config, m_gfxpalette).set_format(2, &x68k_state::GGGGGRRRRRBBBBBI, 256);
- PALETTE(config, m_pcgpalette).set_format(2, &x68k_state::GGGGGRRRRRBBBBBI, 256);
-
- config.set_default_layout(layout_x68000);
-
- /* sound hardware */
- SPEAKER(config, "lspeaker").front_left();
- SPEAKER(config, "rspeaker").front_right();
- YM2151(config, m_ym2151, 16_MHz_XTAL / 4);
- m_ym2151->irq_handler().set(FUNC(x68k_state::fm_irq));
- m_ym2151->port_write_handler().set(FUNC(x68k_state::ct_w)); // CT1, CT2 from YM2151 port 0x1b
- m_ym2151->add_route(0, "lspeaker", 0.50);
- m_ym2151->add_route(1, "rspeaker", 0.50);
-
- OKIM6258(config, m_okim6258, 16_MHz_XTAL / 4);
- m_okim6258->set_start_div(okim6258_device::FOSC_DIV_BY_512);
- m_okim6258->set_type(okim6258_device::TYPE_4BITS);
- m_okim6258->set_outbits(okim6258_device::OUTPUT_10BITS);
- m_okim6258->add_route(ALL_OUTPUTS, "adpcm_outl", 0.50);
- m_okim6258->add_route(ALL_OUTPUTS, "adpcm_outr", 0.50);
-
- FILTER_VOLUME(config, m_adpcm_out[0]).add_route(ALL_OUTPUTS, "lspeaker", 1.0);
- FILTER_VOLUME(config, m_adpcm_out[1]).add_route(ALL_OUTPUTS, "rspeaker", 1.0);
-
- UPD72065(config, m_upd72065, 16_MHz_XTAL / 2, true, false); // clocked through SED9420CAC
- m_upd72065->intrq_wr_callback().set(FUNC(x68k_state::fdc_irq));
- m_upd72065->drq_wr_callback().set(m_hd63450, FUNC(hd63450_device::drq0_w));
- FLOPPY_CONNECTOR(config, "upd72065:0", x68k_floppies, "525hd", x68k_state::floppy_formats);
- FLOPPY_CONNECTOR(config, "upd72065:1", x68k_floppies, "525hd", x68k_state::floppy_formats);
- FLOPPY_CONNECTOR(config, "upd72065:2", x68k_floppies, "525hd", x68k_state::floppy_formats);
- FLOPPY_CONNECTOR(config, "upd72065:3", x68k_floppies, "525hd", x68k_state::floppy_formats);
-
- SOFTWARE_LIST(config, "flop_list").set_original("x68k_flop");
-
- X68K_EXPANSION_SLOT(config, m_expansion[0], x68000_exp_cards, nullptr);
- m_expansion[0]->set_space(m_maincpu, AS_PROGRAM);
- m_expansion[0]->out_irq2_callback().set(FUNC(x68k_state::irq2_line<0>));
- m_expansion[0]->out_irq4_callback().set(FUNC(x68k_state::irq4_line<0>));
- m_expansion[0]->out_nmi_callback().set(FUNC(x68k_state::nmi_line<0>));
-
- X68K_EXPANSION_SLOT(config, m_expansion[1], x68000_exp_cards, nullptr);
- m_expansion[1]->set_space(m_maincpu, AS_PROGRAM);
- m_expansion[1]->out_irq2_callback().set(FUNC(x68k_state::irq2_line<1>));
- m_expansion[1]->out_irq4_callback().set(FUNC(x68k_state::irq4_line<1>));
- m_expansion[1]->out_nmi_callback().set(FUNC(x68k_state::nmi_line<1>));
-
- /* internal ram */
- RAM(config, m_ram).set_default_size("4M").set_extra_options("1M,2M,3M,5M,6M,7M,8M,9M,10M,11M,12M");
-
- NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-}
-
-void x68k_state::x68000(machine_config &config)
-{
- add_cpu(config, M68000, &x68k_state::x68k_map, 40_MHz_XTAL / 4);
- x68000_base(config);
-
- VINAS(config, m_crtc, 38.86363_MHz_XTAL);
- m_crtc->set_clock_69m(69.55199_MHz_XTAL);
- m_crtc->set_screen("screen");
- m_crtc->vdisp_cb().set(m_mfpdev, FUNC(mc68901_device::i4_w));
- m_crtc->vdisp_cb().append(m_mfpdev, FUNC(mc68901_device::tai_w));
- m_crtc->rint_cb().set(m_mfpdev, FUNC(mc68901_device::i6_w));
- m_crtc->hsync_cb().set(m_mfpdev, FUNC(mc68901_device::i7_w));
- m_crtc->tvram_read_cb().set(FUNC(x68k_state::tvram_read));
- m_crtc->tvram_write_cb().set(FUNC(x68k_state::tvram_write));
- m_crtc->gvram_read_cb().set(FUNC(x68k_state::gvram_read));
- m_crtc->gvram_write_cb().set(FUNC(x68k_state::gvram_write));
-
- X68KHDC(config, "x68k_hdc", 0);
-}
-
-void x68ksupr_state::x68ksupr_base(machine_config &config)
-{
- x68000_base(config);
-
- scsi_port_device &scsi(SCSI_PORT(config, "scsi"));
- scsi.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0));
- scsi.set_slot_device(2, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_1));
- scsi.set_slot_device(3, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_2));
- scsi.set_slot_device(4, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_3));
- scsi.set_slot_device(5, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_4));
- scsi.set_slot_device(6, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_5));
- scsi.set_slot_device(7, "cdrom", SCSICD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_6));
-
- MB89352A(config, m_scsictrl, 40_MHz_XTAL / 8);
- m_scsictrl->set_scsi_port("scsi");
- m_scsictrl->irq_cb().set(FUNC(x68ksupr_state::scsi_irq));
- m_scsictrl->drq_cb().set(FUNC(x68ksupr_state::scsi_drq));
-
- VICON(config, m_crtc, 38.86363_MHz_XTAL);
- m_crtc->set_clock_69m(69.55199_MHz_XTAL);
- m_crtc->set_screen("screen");
- m_crtc->vdisp_cb().set(m_mfpdev, FUNC(mc68901_device::i4_w));
- m_crtc->vdisp_cb().append(m_mfpdev, FUNC(mc68901_device::tai_w));
- m_crtc->rint_cb().set(m_mfpdev, FUNC(mc68901_device::i6_w));
- m_crtc->hsync_cb().set(m_mfpdev, FUNC(mc68901_device::i7_w));
- m_crtc->tvram_read_cb().set(FUNC(x68ksupr_state::tvram_read));
- m_crtc->tvram_write_cb().set(FUNC(x68ksupr_state::tvram_write));
- m_crtc->gvram_read_cb().set(FUNC(x68ksupr_state::gvram_read));
- m_crtc->gvram_write_cb().set(FUNC(x68ksupr_state::gvram_write));
-}
-
-void x68ksupr_state::x68ksupr(machine_config &config)
-{
- add_cpu(config, M68000, &x68ksupr_state::x68kxvi_map, 40_MHz_XTAL / 4);
- x68ksupr_base(config);
-}
-
-void x68ksupr_state::x68kxvi(machine_config &config)
-{
- add_cpu(config, M68000, &x68ksupr_state::x68kxvi_map, 33.33_MHz_XTAL / 2); /* 16 MHz (nominally) */
- x68ksupr_base(config);
-}
-
-void x68030_state::x68030(machine_config &config)
-{
- add_cpu(config, M68030, &x68030_state::x68030_map, 50_MHz_XTAL / 2); /* 25 MHz 68EC030 */
- x68ksupr_base(config);
-
- m_hd63450->set_clock(50_MHz_XTAL / 4);
- m_scc->set_clock(20_MHz_XTAL / 4);
- m_scsictrl->set_clock(20_MHz_XTAL / 4);
-
- m_crtc->set_clock_50m(50.35_MHz_XTAL);
-}
-
-ROM_START( x68000 )
- ROM_REGION16_BE(0x1000000, "maincpu", 0) // 16MB address space
- ROM_DEFAULT_BIOS("cz600ce")
- ROM_LOAD( "cgrom.dat", 0xf00000, 0xc0000, CRC(9f3195f1) SHA1(8d72c5b4d63bb14c5dbdac495244d659aa1498b6) )
- ROM_SYSTEM_BIOS(0, "ipl10", "IPL-ROM V1.0 (87/05/07)")
- ROMX_LOAD( "iplrom.dat", 0xfe0000, 0x20000, CRC(72bdf532) SHA1(0ed038ed2133b9f78c6e37256807424e0d927560), ROM_BIOS(0) )
- ROM_SYSTEM_BIOS(1, "ipl11", "IPL-ROM V1.1 (91/01/11)")
- ROMX_LOAD( "iplromxv.dat", 0xfe0000, 0x020000, CRC(00eeb408) SHA1(e33cdcdb69cd257b0b211ef46e7a8b144637db57), ROM_BIOS(1) )
- ROM_SYSTEM_BIOS(2, "ipl12", "IPL-ROM V1.2 (91/10/24)")
- ROMX_LOAD( "iplromco.dat", 0xfe0000, 0x020000, CRC(6c7ef608) SHA1(77511fc58798404701f66b6bbc9cbde06596eba7), ROM_BIOS(2) )
- ROM_SYSTEM_BIOS(3, "ipl13", "IPL-ROM V1.3 (92/11/27)")
- ROMX_LOAD( "iplrom30.dat", 0xfe0000, 0x020000, CRC(e8f8fdad) SHA1(239e9124568c862c31d9ec0605e32373ea74b86a), ROM_BIOS(3) )
- ROM_SYSTEM_BIOS(4, "cz600ce", "CZ-600CE IPL-ROM V1.0 (87/03/18)")
- ROMX_LOAD( "rh-ix0897cezz.ic12", 0xfe0000, 0x010000, CRC(cdc95995) SHA1(810cae207ffd29926e604cf1eb964ae8ea1fadb5), ROM_BIOS(4) | ROM_SKIP(1) )
- ROMX_LOAD( "rh-ix0898cezz.ic11", 0xfe0001, 0x010000, CRC(e60e09a8) SHA1(f3d4a6506493ea3ac7b9c8e441d781fbdd61abd5), ROM_BIOS(4) | ROM_SKIP(1) )
- ROM_REGION(0x8000, "user1",0) // For Background/Sprite decoding
- ROM_FILL(0x0000,0x8000,0x00)
- ROM_REGION(0x20000, "user2", 0)
- ROM_FILL(0x000,0x20000,0x00)
-ROM_END
-
-ROM_START( x68ksupr )
- ROM_REGION16_BE(0x1000000, "maincpu", 0) // 16MB address space
- ROM_DEFAULT_BIOS("ipl11")
- ROM_LOAD( "cgrom.dat", 0xf00000, 0xc0000, CRC(9f3195f1) SHA1(8d72c5b4d63bb14c5dbdac495244d659aa1498b6) )
- ROM_SYSTEM_BIOS(0, "ipl10", "IPL-ROM V1.0 (87/05/07)")
- ROMX_LOAD( "iplrom.dat", 0xfe0000, 0x20000, CRC(72bdf532) SHA1(0ed038ed2133b9f78c6e37256807424e0d927560), ROM_BIOS(0) )
- ROM_SYSTEM_BIOS(1, "ipl11", "IPL-ROM V1.1 (91/01/11)")
- ROMX_LOAD( "iplromxv.dat", 0xfe0000, 0x020000, CRC(00eeb408) SHA1(e33cdcdb69cd257b0b211ef46e7a8b144637db57), ROM_BIOS(1) )
- ROM_SYSTEM_BIOS(2, "ipl12", "IPL-ROM V1.2 (91/10/24)")
- ROMX_LOAD( "iplromco.dat", 0xfe0000, 0x020000, CRC(6c7ef608) SHA1(77511fc58798404701f66b6bbc9cbde06596eba7), ROM_BIOS(2) )
- ROM_SYSTEM_BIOS(3, "ipl13", "IPL-ROM V1.3 (92/11/27)")
- ROMX_LOAD( "iplrom30.dat", 0xfe0000, 0x020000, CRC(e8f8fdad) SHA1(239e9124568c862c31d9ec0605e32373ea74b86a), ROM_BIOS(3) )
- ROM_SYSTEM_BIOS(4, "cz600ce", "CZ-600CE IPL-ROM V1.0 (87/03/18)")
- ROMX_LOAD( "rh-ix0897cezz.ic12", 0xfe0000, 0x010000, CRC(cdc95995) SHA1(810cae207ffd29926e604cf1eb964ae8ea1fadb5), ROM_BIOS(4) | ROM_SKIP(1) )
- ROMX_LOAD( "rh-ix0898cezz.ic11", 0xfe0001, 0x010000, CRC(e60e09a8) SHA1(f3d4a6506493ea3ac7b9c8e441d781fbdd61abd5), ROM_BIOS(4) | ROM_SKIP(1) )
- ROM_LOAD("scsiinsu.bin",0xfc0000, 0x002000, CRC(f65a3e24) SHA1(15a17798839a3f7f361119205aebc301c2df5967) ) // Dumped from an X68000 Super HD
-// ROM_LOAD("scsiexrom.dat",0xea0000, 0x002000, NO_DUMP )
- ROM_REGION(0x8000, "user1",0) // For Background/Sprite decoding
- ROM_FILL(0x0000,0x8000,0x00)
- ROM_REGION(0x20000, "user2", 0)
- ROM_FILL(0x000,0x20000,0x00)
-ROM_END
-
-ROM_START( x68kxvi )
- ROM_REGION16_BE(0x1000000, "maincpu", 0) // 16MB address space
- ROM_DEFAULT_BIOS("ipl11")
- ROM_LOAD( "cgrom.dat", 0xf00000, 0xc0000, CRC(9f3195f1) SHA1(8d72c5b4d63bb14c5dbdac495244d659aa1498b6) )
- ROM_SYSTEM_BIOS(0, "ipl10", "IPL-ROM V1.0 (87/05/07)")
- ROMX_LOAD( "iplrom.dat", 0xfe0000, 0x20000, CRC(72bdf532) SHA1(0ed038ed2133b9f78c6e37256807424e0d927560), ROM_BIOS(0) )
- ROM_SYSTEM_BIOS(1, "ipl11", "IPL-ROM V1.1 (91/01/11)")
- ROMX_LOAD( "iplromxv.dat", 0xfe0000, 0x020000, CRC(00eeb408) SHA1(e33cdcdb69cd257b0b211ef46e7a8b144637db57), ROM_BIOS(1) )
- ROM_SYSTEM_BIOS(2, "ipl12", "IPL-ROM V1.2 (91/10/24)")
- ROMX_LOAD( "iplromco.dat", 0xfe0000, 0x020000, CRC(6c7ef608) SHA1(77511fc58798404701f66b6bbc9cbde06596eba7), ROM_BIOS(2) )
- ROM_SYSTEM_BIOS(3, "ipl13", "IPL-ROM V1.3 (92/11/27)")
- ROMX_LOAD( "iplrom30.dat", 0xfe0000, 0x020000, CRC(e8f8fdad) SHA1(239e9124568c862c31d9ec0605e32373ea74b86a), ROM_BIOS(3) )
- ROM_SYSTEM_BIOS(4, "cz600ce", "CZ-600CE IPL-ROM V1.0 (87/03/18)")
- ROMX_LOAD( "rh-ix0897cezz.ic12", 0xfe0000, 0x010000, CRC(cdc95995) SHA1(810cae207ffd29926e604cf1eb964ae8ea1fadb5), ROM_BIOS(4) | ROM_SKIP(1) )
- ROMX_LOAD( "rh-ix0898cezz.ic11", 0xfe0001, 0x010000, CRC(e60e09a8) SHA1(f3d4a6506493ea3ac7b9c8e441d781fbdd61abd5), ROM_BIOS(4) | ROM_SKIP(1) )
- ROM_LOAD("scsiinco.bin",0xfc0000, 0x002000, CRC(2485e14d) SHA1(101a9bba8ea4bb90965c144bcfd7182f889ab958) ) // Dumped from an X68000 XVI Compact
-// ROM_LOAD("scsiexrom.dat",0xea0000, 0x002000, NO_DUMP )
- ROM_REGION(0x8000, "user1",0) // For Background/Sprite decoding
- ROM_FILL(0x0000,0x8000,0x00)
- ROM_REGION(0x20000, "user2", 0)
- ROM_FILL(0x000,0x20000,0x00)
-ROM_END
-
-ROM_START( x68030 )
- ROM_REGION16_BE(0x1000000, "maincpu", 0) // 16MB address space
- ROM_DEFAULT_BIOS("ipl13")
- ROM_LOAD( "cgrom.dat", 0xf00000, 0xc0000, CRC(9f3195f1) SHA1(8d72c5b4d63bb14c5dbdac495244d659aa1498b6) )
- ROM_SYSTEM_BIOS(0, "ipl10", "IPL-ROM V1.0 (87/05/07)")
- ROMX_LOAD( "iplrom.dat", 0xfe0000, 0x20000, CRC(72bdf532) SHA1(0ed038ed2133b9f78c6e37256807424e0d927560), ROM_BIOS(0) )
- ROM_SYSTEM_BIOS(1, "ipl11", "IPL-ROM V1.1 (91/01/11)")
- ROMX_LOAD( "iplromxv.dat", 0xfe0000, 0x020000, CRC(00eeb408) SHA1(e33cdcdb69cd257b0b211ef46e7a8b144637db57), ROM_BIOS(1) )
- ROM_SYSTEM_BIOS(2, "ipl12", "IPL-ROM V1.2 (91/10/24)")
- ROMX_LOAD( "iplromco.dat", 0xfe0000, 0x020000, CRC(6c7ef608) SHA1(77511fc58798404701f66b6bbc9cbde06596eba7), ROM_BIOS(2) )
- ROM_SYSTEM_BIOS(3, "ipl13", "IPL-ROM V1.3 (92/11/27)")
- ROMX_LOAD( "iplrom30.dat", 0xfe0000, 0x020000, CRC(e8f8fdad) SHA1(239e9124568c862c31d9ec0605e32373ea74b86a), ROM_BIOS(3) )
- ROM_SYSTEM_BIOS(4, "cz600ce", "CZ-600CE IPL-ROM V1.0 (87/03/18)")
- ROMX_LOAD( "rh-ix0897cezz.ic12", 0xfe0000, 0x010000, CRC(cdc95995) SHA1(810cae207ffd29926e604cf1eb964ae8ea1fadb5), ROM_BIOS(4) | ROM_SKIP(1) )
- ROMX_LOAD( "rh-ix0898cezz.ic11", 0xfe0001, 0x010000, CRC(e60e09a8) SHA1(f3d4a6506493ea3ac7b9c8e441d781fbdd61abd5), ROM_BIOS(4) | ROM_SKIP(1) )
- ROM_LOAD("scsiinrom.dat",0xfc0000, 0x002000, CRC(1c6c889e) SHA1(3f063d4231cdf53da6adc4db96533725e260076a) BAD_DUMP )
-// ROM_LOAD("scsiexrom.dat",0xea0000, 0x002000, NO_DUMP )
- ROM_REGION(0x8000, "user1",0) // For Background/Sprite decoding
- ROM_FILL(0x0000,0x8000,0x00)
- ROM_REGION(0x20000, "user2", 0)
- ROM_FILL(0x000,0x20000,0x00)
-ROM_END
-
-
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1987, x68000, 0, 0, x68000, x68000, x68k_state, empty_init, "Sharp", "X68000", MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1990, x68ksupr, x68000, 0, x68ksupr, x68000, x68ksupr_state, empty_init, "Sharp", "X68000 Super", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
-COMP( 1991, x68kxvi, x68000, 0, x68kxvi, x68000, x68ksupr_state, empty_init, "Sharp", "X68000 XVI", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
-COMP( 1993, x68030, x68000, 0, x68030, x68000, x68030_state, empty_init, "Sharp", "X68030", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )