diff --git a/hash/nascom_socket.xml b/hash/nascom_socket.xml new file mode 100644 index 00000000000..a2df3fb11e1 --- /dev/null +++ b/hash/nascom_socket.xml @@ -0,0 +1,45 @@ + + + + + + + + + NAS-DOS + 1982 + Lucas Control Systems + + + + + + + + + + + Super-Debug 3.1 & Nas-Dis + 198? + <unknown> + + + + + + + + + + ZEAP Z80 Editor-Assembler 2.1 + 1980? + Sigma Accouting & Management Services + + + + + + + + + diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index fb325a6376b..de56170ab95 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -2414,3 +2414,19 @@ if (BUSES["PSX_CONTROLLER"]~=null) then MAME_DIR .. "src/emu/bus/psx/memcard.h", } end + +--------------------------------------------------- +-- +--@src/emu/bus/nasbus/nasbus.h,BUSES += NASBUS +--------------------------------------------------- + +if (BUSES["NASBUS"]~=null) then + files { + MAME_DIR .. "src/emu/bus/nasbus/nasbus.c", + MAME_DIR .. "src/emu/bus/nasbus/nasbus.h", + MAME_DIR .. "src/emu/bus/nasbus/cards.c", + MAME_DIR .. "src/emu/bus/nasbus/cards.h", + MAME_DIR .. "src/emu/bus/nasbus/floppy.c", + MAME_DIR .. "src/emu/bus/nasbus/floppy.h", + } +end diff --git a/scripts/src/lib.lua b/scripts/src/lib.lua index ba72f3cc140..2b896997f29 100644 --- a/scripts/src/lib.lua +++ b/scripts/src/lib.lua @@ -279,6 +279,8 @@ project "formats" MAME_DIR .. "src/lib/formats/mz_cas.h", MAME_DIR .. "src/lib/formats/nanos_dsk.c", MAME_DIR .. "src/lib/formats/nanos_dsk.h", + MAME_DIR .. "src/lib/formats/nascom_dsk.c", + MAME_DIR .. "src/lib/formats/nascom_dsk.h", MAME_DIR .. "src/lib/formats/naslite_dsk.c", MAME_DIR .. "src/lib/formats/naslite_dsk.h", MAME_DIR .. "src/lib/formats/nes_dsk.c", diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index cd7291135dc..4ec54505db4 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -606,6 +606,7 @@ BUSES["MACPDS"] = true BUSES["MIDI"] = true BUSES["MEGADRIVE"] = true BUSES["MSX_SLOT"] = true +BUSES["NASBUS"] = true BUSES["NEOGEO"] = true BUSES["NES"] = true BUSES["NES_CTRL"] = true @@ -1790,8 +1791,6 @@ files { createMESSProjects(_target, _subtarget, "nascom") files { MAME_DIR .. "src/mess/drivers/nascom1.c", - MAME_DIR .. "src/mess/machine/nascom1.c", - MAME_DIR .. "src/mess/video/nascom1.c", } createMESSProjects(_target, _subtarget, "ne") diff --git a/src/emu/bus/nasbus/cards.c b/src/emu/bus/nasbus/cards.c new file mode 100644 index 00000000000..cd13f19171a --- /dev/null +++ b/src/emu/bus/nasbus/cards.c @@ -0,0 +1,13 @@ +// license:GPL-2.0+ +// copyright-holders:Dirk Best +/*************************************************************************** + + Nascom NASBUS Slot Devices + +***************************************************************************/ + +#include "cards.h" + +SLOT_INTERFACE_START( nasbus_slot_cards ) + SLOT_INTERFACE("floppy", NASCOM_FDC) +SLOT_INTERFACE_END diff --git a/src/emu/bus/nasbus/cards.h b/src/emu/bus/nasbus/cards.h new file mode 100644 index 00000000000..e9115e240a7 --- /dev/null +++ b/src/emu/bus/nasbus/cards.h @@ -0,0 +1,20 @@ +// license:GPL-2.0+ +// copyright-holders:Dirk Best +/*************************************************************************** + + Nascom NASBUS Slot Devices + +***************************************************************************/ + +#pragma once + +#ifndef __NASBUS_CARDS_H__ +#define __NASBUS_CARDS_H__ + +#include "emu.h" + +#include "floppy.h" + +SLOT_INTERFACE_EXTERN( nasbus_slot_cards ); + +#endif // __NASBUS_CARDS_H__ diff --git a/src/emu/bus/nasbus/floppy.c b/src/emu/bus/nasbus/floppy.c new file mode 100644 index 00000000000..7b0951f2e0f --- /dev/null +++ b/src/emu/bus/nasbus/floppy.c @@ -0,0 +1,129 @@ +// license:GPL-2.0+ +// copyright-holders:Dirk Best +/*************************************************************************** + + Nascom NASBUS Floppy Disc Controller + +***************************************************************************/ + +#include "floppy.h" +#include "formats/nascom_dsk.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type NASCOM_FDC = &device_creator; + +FLOPPY_FORMATS_MEMBER( nascom_fdc_device::floppy_formats ) + FLOPPY_NASCOM_FORMAT +FLOPPY_FORMATS_END + +static SLOT_INTERFACE_START( nascom_floppies ) + SLOT_INTERFACE("525qd", FLOPPY_525_QD) +SLOT_INTERFACE_END + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +static MACHINE_CONFIG_FRAGMENT( nascom_fdc ) + MCFG_FD1793x_ADD("fd1793", XTAL_16MHz / 4 / 4) + + MCFG_FLOPPY_DRIVE_ADD("fd1793:0", nascom_floppies, "525qd", nascom_fdc_device::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("fd1793:1", nascom_floppies, NULL, nascom_fdc_device::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("fd1793:2", nascom_floppies, NULL, nascom_fdc_device::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("fd1793:3", nascom_floppies, NULL, nascom_fdc_device::floppy_formats) +MACHINE_CONFIG_END + +machine_config_constructor nascom_fdc_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( nascom_fdc ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// wordpro_device - constructor +//------------------------------------------------- + +nascom_fdc_device::nascom_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, NASCOM_FDC, "Nascom Floppy Disc Controller", tag, owner, clock, "nascom_fdc", __FILE__), + device_nasbus_card_interface(mconfig, *this), + m_fdc(*this, "fd1793"), + m_floppy0(*this, "fd1793:0"), + m_floppy1(*this, "fd1793:1"), + m_floppy2(*this, "fd1793:2"), + m_floppy3(*this, "fd1793:3"), + m_floppy(NULL), + m_select(0) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void nascom_fdc_device::device_start() +{ +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void nascom_fdc_device::device_reset() +{ + m_nasbus->m_io->install_readwrite_handler(0xe0, 0xe3, read8_delegate(FUNC(fd1793_t::read), m_fdc.target()), write8_delegate(FUNC(fd1793_t::write), m_fdc.target())); + m_nasbus->m_io->install_readwrite_handler(0xe4, 0xe4, read8_delegate(FUNC(nascom_fdc_device::select_r), this), write8_delegate(FUNC(nascom_fdc_device::select_w), this)); + m_nasbus->m_io->install_read_handler(0xe5, 0xe5, read8_delegate(FUNC(nascom_fdc_device::status_r), this)); +} + + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +READ8_MEMBER( nascom_fdc_device::select_r ) +{ + return m_select | 0xa0; +} + +WRITE8_MEMBER( nascom_fdc_device::select_w ) +{ + logerror("nascom_fdc_device::select_w: 0x%02x\n", data); + + m_floppy = NULL; + + if (BIT(data, 0)) m_floppy = m_floppy0->get_device(); + if (BIT(data, 1)) m_floppy = m_floppy1->get_device(); + if (BIT(data, 2)) m_floppy = m_floppy2->get_device(); + if (BIT(data, 3)) m_floppy = m_floppy3->get_device(); + + m_fdc->set_floppy(m_floppy); + + if (m_floppy) + { + m_floppy->ss_w(BIT(data, 4)); + m_floppy->mon_w(!BIT(data, 5)); + } + + m_fdc->dden_w(BIT(data, 6)); + + m_select = data; +} + +READ8_MEMBER( nascom_fdc_device::status_r ) +{ + UINT8 data = 0; + + data |= m_fdc->intrq_r() << 0; + data |= m_fdc->drq_r() << 7; + + return data; +} diff --git a/src/emu/bus/nasbus/floppy.h b/src/emu/bus/nasbus/floppy.h new file mode 100644 index 00000000000..5bedb37a7e4 --- /dev/null +++ b/src/emu/bus/nasbus/floppy.h @@ -0,0 +1,57 @@ +// license:GPL-2.0+ +// copyright-holders:Dirk Best +/*************************************************************************** + + Nascom NASBUS Floppy Disc Controller + +***************************************************************************/ + +#pragma once + +#ifndef __NASBUS_FLOPPY_H__ +#define __NASBUS_FLOPPY_H__ + +#include "emu.h" +#include "nasbus.h" +#include "machine/wd_fdc.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> nascom_fdc_device + +class nascom_fdc_device : public device_t, public device_nasbus_card_interface +{ +public: + // construction/destruction + nascom_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + DECLARE_READ8_MEMBER( select_r ); + DECLARE_WRITE8_MEMBER( select_w ); + DECLARE_READ8_MEMBER( status_r ); + + DECLARE_FLOPPY_FORMATS(floppy_formats); + +protected: + virtual machine_config_constructor device_mconfig_additions() const; + virtual void device_start(); + virtual void device_reset(); + +private: + required_device m_fdc; + required_device m_floppy0; + required_device m_floppy1; + required_device m_floppy2; + required_device m_floppy3; + + floppy_image_device *m_floppy; + + UINT8 m_select; +}; + +// device type definition +extern const device_type NASCOM_FDC; + +#endif // __NASBUS_FLOPPY_H__ diff --git a/src/emu/bus/nasbus/nasbus.c b/src/emu/bus/nasbus/nasbus.c new file mode 100644 index 00000000000..3f37020833b --- /dev/null +++ b/src/emu/bus/nasbus/nasbus.c @@ -0,0 +1,159 @@ +// license:GPL-2.0+ +// copyright-holders:Dirk Best +/*************************************************************************** + + Nascom NASBUS + + 77-pin slot + +***************************************************************************/ + +#include "nasbus.h" + + +//************************************************************************** +// NASBUS SLOT DEVICE +//************************************************************************** + +const device_type NASBUS_SLOT = &device_creator; + +//------------------------------------------------- +// nasbus_slot_device - constructor +//------------------------------------------------- + +nasbus_slot_device::nasbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, NASBUS_SLOT, "NASBUS Slot", tag, owner, clock, "nasbus_slot", __FILE__), + device_slot_interface(mconfig, *this), + m_nasbus_tag(NULL) +{ +} + +nasbus_slot_device::nasbus_slot_device(const machine_config &mconfig, device_type type, const char *name, + const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) : + device_t(mconfig, type, name, tag, owner, clock, shortname, source), + device_slot_interface(mconfig, *this), + m_nasbus_tag(NULL) +{ +} + +void nasbus_slot_device::set_nasbus_slot(device_t &device, device_t *owner, const char *nasbus_tag) +{ + nasbus_slot_device &nasbus_card = dynamic_cast(device); + nasbus_card.m_owner = owner; + nasbus_card.m_nasbus_tag = nasbus_tag; +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void nasbus_slot_device::device_start() +{ + device_nasbus_card_interface *dev = dynamic_cast(get_card_device()); + + if (dev) + { + nasbus_device *m_nasbus = downcast(m_owner->subdevice(m_nasbus_tag)); + m_nasbus->add_card(dev); + } +} + + +//************************************************************************** +// NASBUS DEVICE +//************************************************************************** + +const device_type NASBUS = &device_creator; + +//------------------------------------------------- +// nasbus_device - constructor +//------------------------------------------------- + +nasbus_device::nasbus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, NASBUS_SLOT, "NASBUS Backplane", tag, owner, clock, "nasbus", __FILE__), + m_program(NULL), + m_io(NULL) +{ +} + +//------------------------------------------------- +// nasbus_device - destructor +//------------------------------------------------- + +nasbus_device::~nasbus_device() +{ + m_dev.detach_all(); +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void nasbus_device::device_start() +{ +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void nasbus_device::device_reset() +{ +} + +//------------------------------------------------- +// add_card - add new card to our bus +//------------------------------------------------- + +void nasbus_device::add_card(device_nasbus_card_interface *card) +{ + card->set_nasbus_device(this); + m_dev.append(*card); +} + +//------------------------------------------------- +// set_program_space - set address space we are attached to +//------------------------------------------------- + +void nasbus_device::set_program_space(address_space *program) +{ + m_program = program; +} + +//------------------------------------------------- +// set_io_space - set address space we are attached to +//------------------------------------------------- + +void nasbus_device::set_io_space(address_space *io) +{ + m_io = io; +} + + +//************************************************************************** +// CARTRIDGE INTERFACE +//************************************************************************** + +//------------------------------------------------- +// device_nasbus_card_interface - constructor +//------------------------------------------------- + +device_nasbus_card_interface::device_nasbus_card_interface(const machine_config &mconfig, device_t &device) : + device_slot_card_interface(mconfig, device), + m_next(NULL), + m_nasbus(NULL) +{ +} + +//------------------------------------------------- +// ~device_nasbus_card_interface - destructor +//------------------------------------------------- + +device_nasbus_card_interface::~device_nasbus_card_interface() +{ +} + +void device_nasbus_card_interface::set_nasbus_device(nasbus_device *nasbus) +{ + m_nasbus = nasbus; +} diff --git a/src/emu/bus/nasbus/nasbus.h b/src/emu/bus/nasbus/nasbus.h new file mode 100644 index 00000000000..9fd57e84bd5 --- /dev/null +++ b/src/emu/bus/nasbus/nasbus.h @@ -0,0 +1,199 @@ +// license:GPL-2.0+ +// copyright-holders:Dirk Best +/*************************************************************************** + + Nascom NASBUS + + 77-pin slot + + 1 0V + 2 0V + 3 0V + 4 0V + 5 Clock + 6 (spare) + 7 (spare) + 8 (spare) + 9 /RAM DISABLE + 10 /RESET SWITCH + 11 /NASCOM MEM + 12 /NASCOM IO + 13 /DBDR + 14 /RESET + 15 /HALT + 16 /BAI + 17 /BAO + 18 /BUSRQ + 19 IEI + 20 IEO + 21 (reserved for /NMI) + 22 /INT + 23 /WAIT + 24 /RFSH + 25 /MI + 26 /IORQ + 27 /MREQ + 28 /WR + 29 /RD + 30 A0 + 31 A1 + 32 A2 + 33 A3 + 34 A4 + 35 A5 + 36 A6 + 37 A7 + 38 A8 + 39 A9 + 40 A10 + 41 A11 + 42 A12 + 43 A13 + 44 A14 + 45 A15 + 46 (reserved) + 47 (reserved) + 48 (reserved) + 49 (reserved) + 50 D0 + 51 D1 + 52 D2 + 53 D3 + 54 D4 + 55 D5 + 56 D6 + 57 D7 + 58 (reserved) + 59 (reserved) + 60 (reserved) + 61 (reserved) + 62 (reserved) + 63 (reserved) + 64 (reserved) + 65 (reserved) + 66 (unused) + 67 (unused) + 68 -5V + 69 -5V + 70 -12V + 71 -12V + 72 Keyway + 73 +12V + 74 +12V + 75 +5V + 76 +5V + 77 +5V + 78 +5V + +***************************************************************************/ + +#pragma once + +#ifndef __NASBUS_H__ +#define __NASBUS_H__ + +#include "emu.h" + + +//************************************************************************** +// CONSTANTS / MACROS +//************************************************************************** + +#define NASBUS_TAG "nasbus" + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_NASBUS_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, NASBUS, 0) + +#define MCFG_NASBUS_SLOT_ADD(_tag, _slot_intf, _def_slot) \ + MCFG_DEVICE_ADD(_tag, NASBUS_SLOT, 0) \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ + nasbus_slot_device::set_nasbus_slot(*device, owner, NASBUS_TAG); + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// forward declaration +class device_nasbus_card_interface; + +// ======================> nasbus_slot_device + +class nasbus_slot_device : public device_t, public device_slot_interface +{ +public: + // construction/destruction + nasbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + nasbus_slot_device(const machine_config &mconfig, device_type type, const char *name, + const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); + + // device-level overrides + virtual void device_start(); + + // inline configuration + static void set_nasbus_slot(device_t &device, device_t *owner, const char *nasbus_tag); + +protected: + // configuration + const char *m_nasbus_tag; +}; + +// device type definition +extern const device_type NASBUS_SLOT; + +// ======================> nasbus_device + +class nasbus_device : public device_t +{ +public: + // construction/destruction + nasbus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual ~nasbus_device(); + + void add_card(device_nasbus_card_interface *card); + + void set_program_space(address_space *program); + void set_io_space(address_space *io); + + address_space *m_program; + address_space *m_io; + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + +private: + simple_list m_dev; +}; + +// device type definition +extern const device_type NASBUS; + +// ======================> device_nasbus_interface + +class device_nasbus_card_interface : public device_slot_card_interface +{ +public: + // construction/destruction + device_nasbus_card_interface(const machine_config &mconfig, device_t &device); + virtual ~device_nasbus_card_interface(); + + void set_nasbus_device(nasbus_device *nasbus); + + device_nasbus_card_interface *next() const { return m_next; } + device_nasbus_card_interface *m_next; + +protected: + nasbus_device *m_nasbus; +}; + +// include here so drivers don't need to +#include "cards.h" + +#endif // __NASBUS_H__ diff --git a/src/lib/formats/nascom_dsk.c b/src/lib/formats/nascom_dsk.c new file mode 100644 index 00000000000..9d1de0dac57 --- /dev/null +++ b/src/lib/formats/nascom_dsk.c @@ -0,0 +1,45 @@ +// license:GPL-2.0+ +// copyright-holders:Dirk Best +/*************************************************************************** + + Nascom 1/2/3 + + Disk image format + +***************************************************************************/ + +#include "nascom_dsk.h" + +nascom_format::nascom_format() : wd177x_format(formats) +{ +} + +const char *nascom_format::name() const +{ + return "nascom"; +} + +const char *nascom_format::description() const +{ + return "Nascom disk image"; +} + +const char *nascom_format::extensions() const +{ + return "dsk"; +} + +const nascom_format::format nascom_format::formats[] = +{ + { // 360k 5 1/4 inch double density single sided + floppy_image::FF_525, floppy_image::SSQD, floppy_image::MFM, + 2000, 16, 80, 1, 256, {}, 1, {}, 32, 22, 54 + }, + { // 720k 5 1/4 inch double density double sided + floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM, + 2000, 16, 80, 2, 256, {}, 1, {}, 32, 22, 54 + }, + {} +}; + +const floppy_format_type FLOPPY_NASCOM_FORMAT = &floppy_image_format_creator; diff --git a/src/lib/formats/nascom_dsk.h b/src/lib/formats/nascom_dsk.h new file mode 100644 index 00000000000..95b1e80e49e --- /dev/null +++ b/src/lib/formats/nascom_dsk.h @@ -0,0 +1,33 @@ +// license:GPL-2.0+ +// copyright-holders:Dirk Best +/*************************************************************************** + + Nascom 1/2/3 + + Disk image format + +***************************************************************************/ + +#pragma once + +#ifndef __NASCOM_DSK_H__ +#define __NASCOM_DSK_H__ + +#include "wd177x_dsk.h" + +class nascom_format : public wd177x_format +{ +public: + nascom_format(); + + virtual const char *name() const; + virtual const char *description() const; + virtual const char *extensions() const; + +private: + static const format formats[]; +}; + +extern const floppy_format_type FLOPPY_NASCOM_FORMAT; + +#endif // __NASCOM_DSK_H__ diff --git a/src/mess/drivers/nascom1.c b/src/mess/drivers/nascom1.c index a0301e1d4e1..3eeb88c2564 100644 --- a/src/mess/drivers/nascom1.c +++ b/src/mess/drivers/nascom1.c @@ -1,119 +1,351 @@ // license:GPL-2.0+ -// copyright-holders:(Original Author?), Dirk Best -/************************************************************************ +// copyright-holders:Dirk Best +/*************************************************************************** - Nascom 1 and Nascom 2 + Nascom 1/2/3 - Memory map + Single board computer - CPU: z80 - 0000-03ff ROM (Nascom1 Monitor) - 0400-07ff ROM (Nascom2 Monitor extension) - 0800-0bff RAM (Screen) - 0c00-0c7f RAM (OS workspace) - 0c80-0cff RAM (extended OS workspace) - 0d00-0f7f RAM (Firmware workspace) - 0f80-0fff RAM (Stack space) - 1000-8fff RAM (User space) - 9000-97ff RAM (Programmable graphics RAM/User space) - 9800-afff RAM (Colour graphics RAM/User space) - b000-b7ff ROM (OS extensions) - b800-bfff ROM (WP/Naspen software) - c000-cfff ROM (Disassembler/colour graphics software) - d000-dfff ROM (Assembler/Basic extensions) - e000-ffff ROM (Nascom2 Basic) +***************************************************************************/ - Interrupts: - - Ports: - OUT (00) 0: Increment keyboard scan - 1: Reset keyboard scan - 2: - 3: Read from cassette - 4: - 5: - 6: - 7: - IN (00) Read keyboard - OUT (01) Write to cassette/serial - IN (01) Read from cassette/serial - OUT (02) Unused - IN (02) ? - - Monitors: - Nasbug1 1K Original Nascom1 - Nasbug2 1K - Nasbug3 Probably non existing - Nasbug4 2K - Nassys1 2K Original Nascom2 - Nassys2 Probably non existing - Nassys3 2K - Nassys4 2K - T4 2K - -************************************************************************/ - -/* Core includes */ #include "emu.h" -#include "includes/nascom1.h" - -/* Components */ #include "cpu/z80/z80.h" -#include "machine/wd17xx.h" -#include "machine/z80pio.h" - -/* Devices */ -#include "imagedev/flopdrv.h" -#include "formats/basicdsk.h" -#include "imagedev/cassette.h" #include "machine/ram.h" +#include "machine/z80pio.h" +#include "machine/ay31015.h" +#include "imagedev/cassette.h" +#include "imagedev/snapquik.h" +#include "bus/generic/slot.h" +#include "bus/generic/carts.h" +#include "bus/nasbus/nasbus.h" -/************************************* - * - * Memory maps - * - *************************************/ +//************************************************************************** +// CONSTANTS/MACROS +//************************************************************************** -static ADDRESS_MAP_START( nascom1_mem, AS_PROGRAM, 8, nascom1_state ) - AM_RANGE(0x0000, 0x07ff) AM_ROM - AM_RANGE(0x0800, 0x0bff) AM_RAM AM_SHARE("videoram") - AM_RANGE(0x0c00, 0x0fff) AM_RAM - AM_RANGE(0x1000, 0x13ff) AM_RAM /* 1Kb */ - AM_RANGE(0x1400, 0x4fff) AM_RAM /* 16Kb */ - AM_RANGE(0x5000, 0x8fff) AM_RAM /* 32Kb */ - AM_RANGE(0x9000, 0xafff) AM_RAM /* 40Kb */ - AM_RANGE(0xb000, 0xffff) AM_ROM -ADDRESS_MAP_END +#define NASCOM1_KEY_RESET 0x02 +#define NASCOM1_KEY_INCR 0x01 -static ADDRESS_MAP_START( nascom1_io, AS_IO, 8, nascom1_state ) - ADDRESS_MAP_GLOBAL_MASK(0x0F) - AM_RANGE(0x00, 0x00) AM_READWRITE(nascom1_port_00_r, nascom1_port_00_w) - AM_RANGE(0x01, 0x01) AM_READWRITE(nascom1_port_01_r, nascom1_port_01_w) - AM_RANGE(0x02, 0x02) AM_READ(nascom1_port_02_r) - AM_RANGE(0x04, 0x07) AM_DEVREADWRITE("z80pio", z80pio_device, read, write ) -ADDRESS_MAP_END +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +struct nascom1_portstat_t +{ + UINT8 stat_flags; + UINT8 stat_count; +}; + +class nascom_state : public driver_device +{ +public: + nascom_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_hd6402(*this, "hd6402"), + m_cassette(*this, "cassette"), + m_ram(*this, RAM_TAG), + m_gfxdecode(*this, "gfxdecode"), + m_palette(*this, "palette"), + m_videoram(*this, "videoram"), + m_keyboard(*this, "KEY") + { } + + required_device m_maincpu; + required_device m_hd6402; + required_device m_cassette; + required_device m_ram; + required_device m_gfxdecode; + required_device m_palette; + required_shared_ptr m_videoram; + required_ioport_array<9> m_keyboard; + + int m_tape_size; + UINT8 *m_tape_image; + int m_tape_index; + nascom1_portstat_t m_portstat; + + DECLARE_READ8_MEMBER(nascom1_port_00_r); + DECLARE_WRITE8_MEMBER(nascom1_port_00_w); + DECLARE_READ8_MEMBER(nascom1_port_01_r); + DECLARE_WRITE8_MEMBER(nascom1_port_01_w); + DECLARE_READ8_MEMBER(nascom1_port_02_r); + virtual DECLARE_DRIVER_INIT(nascom); + void screen_update(bitmap_ind16 &bitmap, const rectangle &cliprect, int char_height); + DECLARE_READ8_MEMBER(nascom1_hd6402_si); + DECLARE_WRITE8_MEMBER(nascom1_hd6402_so); + DECLARE_DEVICE_IMAGE_LOAD_MEMBER( nascom1_cassette ); + DECLARE_DEVICE_IMAGE_UNLOAD_MEMBER( nascom1_cassette ); + DECLARE_SNAPSHOT_LOAD_MEMBER( nascom1 ); + +protected: + virtual void machine_reset(); + +private: + +}; + +class nascom1_state : public nascom_state +{ +public: + nascom1_state(const machine_config &mconfig, device_type type, const char *tag) : + nascom_state(mconfig, type, tag) + {} + + UINT32 screen_update_nascom(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +private: +}; + +class nascom2_state : public nascom_state +{ +public: + nascom2_state(const machine_config &mconfig, device_type type, const char *tag) : + nascom_state(mconfig, type, tag), + m_nasbus(*this, "nasbus"), + m_socket1(*this, "socket1"), + m_socket2(*this, "socket2") + {} + + virtual DECLARE_DRIVER_INIT(nascom); + UINT32 screen_update_nascom(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + int load_cart(device_image_interface &image, generic_slot_device *slot, int slot_id); + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(socket1_load) { return load_cart(image, m_socket1, 1); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(socket2_load) { return load_cart(image, m_socket2, 2); } + +private: + required_device m_nasbus; + required_device m_socket1; + required_device m_socket2; +}; -static ADDRESS_MAP_START( nascom2_io, AS_IO, 8, nascom1_state ) - ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x00, 0x00) AM_READWRITE(nascom1_port_00_r, nascom1_port_00_w) - AM_RANGE(0x01, 0x01) AM_READWRITE(nascom1_port_01_r, nascom1_port_01_w) - AM_RANGE(0x02, 0x02) AM_READ(nascom1_port_02_r) - AM_RANGE(0x04, 0x07) AM_DEVREADWRITE("z80pio", z80pio_device, read, write ) - AM_RANGE(0xe0, 0xe3) AM_DEVREADWRITE("wd1793", fd1793_device, read, write) - AM_RANGE(0xe4, 0xe4) AM_READWRITE(nascom2_fdc_select_r, nascom2_fdc_select_w) - AM_RANGE(0xe5, 0xe5) AM_READ(nascom2_fdc_status_r) -ADDRESS_MAP_END +//************************************************************************** +// KEYBOARD +//************************************************************************** + +READ8_MEMBER( nascom_state::nascom1_port_00_r ) +{ + if (m_portstat.stat_count < 9) + return ((m_keyboard[m_portstat.stat_count])->read() | ~0x7f); + + return 0xff; +} + +WRITE8_MEMBER( nascom_state::nascom1_port_00_w ) +{ + m_cassette->change_state( + (data & 0x10) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR); + + if (!(data & NASCOM1_KEY_RESET)) + { + if (m_portstat.stat_flags & NASCOM1_KEY_RESET) + m_portstat.stat_count = 0; + } + else + m_portstat.stat_flags = NASCOM1_KEY_RESET; + + if (!(data & NASCOM1_KEY_INCR)) + { + if (m_portstat.stat_flags & NASCOM1_KEY_INCR) + m_portstat.stat_count++; + } + else + m_portstat.stat_flags = NASCOM1_KEY_INCR; +} +//************************************************************************** +// CASSETTE +//************************************************************************** -/************************************* - * - * GFX layouts - * - *************************************/ +READ8_MEMBER( nascom_state::nascom1_port_01_r ) +{ + return m_hd6402->get_received_data(); +} + + +WRITE8_MEMBER( nascom_state::nascom1_port_01_w ) +{ + m_hd6402->set_transmit_data(data); +} + +READ8_MEMBER( nascom_state::nascom1_port_02_r ) +{ + UINT8 data = 0x31; + + m_hd6402->set_input_pin(AY31015_SWE, 0); + data |= m_hd6402->get_output_pin(AY31015_OR ) ? 0x02 : 0; + data |= m_hd6402->get_output_pin(AY31015_PE ) ? 0x04 : 0; + data |= m_hd6402->get_output_pin(AY31015_FE ) ? 0x08 : 0; + data |= m_hd6402->get_output_pin(AY31015_TBMT) ? 0x40 : 0; + data |= m_hd6402->get_output_pin(AY31015_DAV ) ? 0x80 : 0; + m_hd6402->set_input_pin(AY31015_SWE, 1); + + return data; +} + +READ8_MEMBER( nascom_state::nascom1_hd6402_si ) +{ + return 1; +} + +WRITE8_MEMBER( nascom_state::nascom1_hd6402_so ) +{ +} + +DEVICE_IMAGE_LOAD_MEMBER( nascom_state, nascom1_cassette ) +{ + m_tape_size = image.length(); + m_tape_image = (UINT8*)image.ptr(); + + if (!m_tape_image) + return IMAGE_INIT_FAIL; + + m_tape_index = 0; + return IMAGE_INIT_PASS; +} + +DEVICE_IMAGE_UNLOAD_MEMBER( nascom_state, nascom1_cassette ) +{ + m_tape_image = NULL; + m_tape_size = m_tape_index = 0; +} + + +//************************************************************************** +// SNAPSHOTS +//************************************************************************** + +SNAPSHOT_LOAD_MEMBER( nascom_state, nascom1 ) +{ + UINT8 line[35]; + + while (image.fread( &line, sizeof(line)) == sizeof(line)) + { + int addr, b0, b1, b2, b3, b4, b5, b6, b7, dummy; + + if (sscanf((char *)line, "%x %x %x %x %x %x %x %x %x %x\010\010\n", + &addr, &b0, &b1, &b2, &b3, &b4, &b5, &b6, &b7, &dummy) == 10) + { + m_maincpu->space(AS_PROGRAM).write_byte(addr++, b0); + m_maincpu->space(AS_PROGRAM).write_byte(addr++, b1); + m_maincpu->space(AS_PROGRAM).write_byte(addr++, b2); + m_maincpu->space(AS_PROGRAM).write_byte(addr++, b3); + m_maincpu->space(AS_PROGRAM).write_byte(addr++, b4); + m_maincpu->space(AS_PROGRAM).write_byte(addr++, b5); + m_maincpu->space(AS_PROGRAM).write_byte(addr++, b6); + m_maincpu->space(AS_PROGRAM).write_byte(addr++, b7); + } + } + + return IMAGE_INIT_PASS; +} + + +//************************************************************************** +// SOCKETS +//************************************************************************** + +int nascom2_state::load_cart(device_image_interface &image, generic_slot_device *slot, int slot_id) +{ + // loading directly from file + if (image.software_entry() == NULL) + { + if (slot->length() > 0x1000) + { + image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported file size"); + return IMAGE_INIT_FAIL; + } + + slot->rom_alloc(slot->length(), GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); + slot->fread(slot->get_rom_base(), slot->length()); + + // we just assume that socket1 should be loaded to 0xc000 and socket2 to 0xd000 + switch (slot_id) + { + case 1: + m_maincpu->space(AS_PROGRAM).install_rom(0xc000, 0xc000 + slot->length() - 1, slot->get_rom_base()); + break; + case 2: + m_maincpu->space(AS_PROGRAM).install_rom(0xd000, 0xd000 + slot->length() - 1, slot->get_rom_base()); + break; + } + } + + // loading from software list. this supports multiple regions to load to + else + { + UINT8 *region_b000 = image.get_software_region("b000"); + UINT8 *region_c000 = image.get_software_region("c000"); + UINT8 *region_d000 = image.get_software_region("d000"); + + if (region_b000 != NULL) + { + UINT32 size = image.get_software_region_length("b000"); + m_maincpu->space(AS_PROGRAM).install_rom(0xb000, 0xb000 + size - 1, region_b000); + } + + if (region_c000 != NULL) + { + UINT32 size = image.get_software_region_length("c000"); + m_maincpu->space(AS_PROGRAM).install_rom(0xc000, 0xc000 + size - 1, region_c000); + } + + if (region_d000 != NULL) + { + UINT32 size = image.get_software_region_length("d000"); + m_maincpu->space(AS_PROGRAM).install_rom(0xd000, 0xd000 + size - 1, region_d000); + } + } + + return IMAGE_INIT_PASS; +} + + +//************************************************************************** +// DRIVER INIT +//************************************************************************** + +void nascom_state::machine_reset() +{ + // Set up hd6402 pins + m_hd6402->set_input_pin(AY31015_SWE, 1); + + m_hd6402->set_input_pin(AY31015_CS, 0); + m_hd6402->set_input_pin(AY31015_NP, 1); + m_hd6402->set_input_pin(AY31015_NB1, 1); + m_hd6402->set_input_pin(AY31015_NB2, 1); + m_hd6402->set_input_pin(AY31015_EPS, 1); + m_hd6402->set_input_pin(AY31015_TSB, 1); + m_hd6402->set_input_pin(AY31015_CS, 1); +} + +DRIVER_INIT_MEMBER( nascom_state, nascom ) +{ + // install extra memory + if (m_ram->size() > 0) + { + m_maincpu->space(AS_PROGRAM).install_ram(0x1000, 0x1000 + m_ram->size() - 1, m_ram->pointer()); + } +} + +DRIVER_INIT_MEMBER( nascom2_state, nascom ) +{ + nascom_state::init_nascom(); + + // setup nasbus + m_nasbus->set_program_space(&m_maincpu->space(AS_PROGRAM)); + m_nasbus->set_io_space(&m_maincpu->space(AS_IO)); +} + + +//************************************************************************** +// VIDEO +//************************************************************************** static const gfx_layout nascom1_charlayout = { @@ -127,11 +359,15 @@ static const gfx_layout nascom1_charlayout = 8 * 16 }; - static GFXDECODE_START( nascom1 ) GFXDECODE_ENTRY("gfx1", 0x0000, nascom1_charlayout, 0, 1) GFXDECODE_END +UINT32 nascom1_state::screen_update_nascom(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + screen_update(bitmap, cliprect, 16); + return 0; +} static const gfx_layout nascom2_charlayout = { @@ -145,18 +381,70 @@ static const gfx_layout nascom2_charlayout = 8 * 16 }; - static GFXDECODE_START( nascom2 ) GFXDECODE_ENTRY("gfx1", 0x0000, nascom2_charlayout, 0, 1) GFXDECODE_END +UINT32 nascom2_state::screen_update_nascom(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + screen_update(bitmap, cliprect, 14); + return 0; +} + +void nascom_state::screen_update(bitmap_ind16 &bitmap, const rectangle &cliprect, int char_height) +{ + for (int sx = 0; sx < 48; sx++) + { + m_gfxdecode->gfx(0)->opaque(bitmap,cliprect, m_videoram[0x03ca + sx], 1, 0, 0, sx * 8, 0); + } + + for (int sy = 0; sy < 15; sy++) + { + for (int sx = 0; sx < 48; sx++) + { + m_gfxdecode->gfx(0)->opaque(bitmap,cliprect, m_videoram[0x000a + (sy * 64) + sx], 1, 0, 0, sx * 8, (sy + 1) * char_height); + } + } +} -/************************************* - * - * Input ports - * - *************************************/ +//************************************************************************** +// ADDRESS MAPS +//************************************************************************** + +static ADDRESS_MAP_START( nascom1_mem, AS_PROGRAM, 8, nascom1_state ) + AM_RANGE(0x0000, 0x07ff) AM_ROM // MONITOR + AM_RANGE(0x0800, 0x0bff) AM_RAM AM_SHARE("videoram") + AM_RANGE(0x0c00, 0x0fff) AM_RAM // WRAM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( nascom1_io, AS_IO, 8, nascom1_state ) + ADDRESS_MAP_GLOBAL_MASK(0x0f) + AM_RANGE(0x00, 0x00) AM_READWRITE(nascom1_port_00_r, nascom1_port_00_w) + AM_RANGE(0x01, 0x01) AM_READWRITE(nascom1_port_01_r, nascom1_port_01_w) + AM_RANGE(0x02, 0x02) AM_READ(nascom1_port_02_r) + AM_RANGE(0x04, 0x07) AM_DEVREADWRITE("z80pio", z80pio_device, read, write ) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( nascom2_mem, AS_PROGRAM, 8, nascom2_state ) + AM_RANGE(0x0000, 0x07ff) AM_ROM // MONITOR + AM_RANGE(0x0800, 0x0bff) AM_RAM AM_SHARE("videoram") + AM_RANGE(0x0c00, 0x0fff) AM_RAM // WRAM + AM_RANGE(0xe000, 0xffff) AM_ROM AM_REGION("basic", 0) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( nascom2_io, AS_IO, 8, nascom2_state ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x00, 0x00) AM_READWRITE(nascom1_port_00_r, nascom1_port_00_w) + AM_RANGE(0x01, 0x01) AM_READWRITE(nascom1_port_01_r, nascom1_port_01_w) + AM_RANGE(0x02, 0x02) AM_READ(nascom1_port_02_r) + AM_RANGE(0x04, 0x07) AM_DEVREADWRITE("z80pio", z80pio_device, read, write ) +ADDRESS_MAP_END + + +//************************************************************************** +// INPUT PORTS +//************************************************************************** static INPUT_PORTS_START( nascom1 ) PORT_START("KEY.0") @@ -249,133 +537,119 @@ static INPUT_PORTS_START( nascom2 ) INPUT_PORTS_END -/************************************* - * - * Machine drivers - * - *************************************/ +//************************************************************************** +// MACHINE DRIVERS +//************************************************************************** static MACHINE_CONFIG_START( nascom1, nascom1_state ) - /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80, XTAL_16MHz/8) + // main cpu + MCFG_CPU_ADD("maincpu", Z80, XTAL_16MHz / 8) MCFG_CPU_PROGRAM_MAP(nascom1_mem) MCFG_CPU_IO_MAP(nascom1_io) - /* video hardware */ + // video hardware MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ MCFG_SCREEN_SIZE(48 * 8, 16 * 16) MCFG_SCREEN_VISIBLE_AREA(0, 48 * 8 - 1, 0, 16 * 16 - 1) - MCFG_SCREEN_UPDATE_DRIVER(nascom1_state, screen_update_nascom1) + MCFG_SCREEN_UPDATE_DRIVER(nascom1_state, screen_update_nascom) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", nascom1) MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette") + // uart MCFG_DEVICE_ADD( "hd6402", AY31015, 0 ) MCFG_AY31015_TX_CLOCK(( XTAL_16MHz / 16 ) / 256) MCFG_AY31015_RX_CLOCK(( XTAL_16MHz / 16 ) / 256) - MCFG_AY51013_READ_SI_CB(READ8(nascom1_state, nascom1_hd6402_si)) - MCFG_AY51013_WRITE_SO_CB(WRITE8(nascom1_state, nascom1_hd6402_so)) + MCFG_AY51013_READ_SI_CB(READ8(nascom_state, nascom1_hd6402_si)) + MCFG_AY51013_WRITE_SO_CB(WRITE8(nascom_state, nascom1_hd6402_so)) + // cassette is connected to the uart + MCFG_CASSETTE_ADD("cassette") + + // pio MCFG_DEVICE_ADD("z80pio", Z80PIO, XTAL_16MHz/8) - /* devices */ - MCFG_SNAPSHOT_ADD("snapshot", nascom1_state, nascom1, "nas", 0.5) - - MCFG_CASSETTE_ADD( "cassette" ) - - /* internal ram */ + // internal extra ram MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("40K") - MCFG_RAM_EXTRA_OPTIONS("1K,16K,32K") + MCFG_RAM_DEFAULT_SIZE("32K") + MCFG_RAM_EXTRA_OPTIONS("8K,16K") + + // devices + MCFG_SNAPSHOT_ADD("snapshot", nascom_state, nascom1, "nas", 0.5) MACHINE_CONFIG_END -static LEGACY_FLOPPY_OPTIONS_START(nascom2) - LEGACY_FLOPPY_OPTION(nascom2_ss, "dsk", "Nascom 2 SS disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, - HEADS([1]) - TRACKS([80]) - SECTORS([16]) - SECTOR_LENGTH([256]) - FIRST_SECTOR_ID([1])) - LEGACY_FLOPPY_OPTION(nascom2_ds, "dsk", "Nascom 2 DS disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, - HEADS([2]) - TRACKS([80]) - SECTORS([16]) - SECTOR_LENGTH([256]) - FIRST_SECTOR_ID([1])) -LEGACY_FLOPPY_OPTIONS_END - -static const floppy_interface nascom2_floppy_interface = -{ - FLOPPY_STANDARD_5_25_DSHD, - LEGACY_FLOPPY_OPTIONS_NAME(nascom2), - NULL -}; - -static MACHINE_CONFIG_DERIVED( nascom2, nascom1 ) - MCFG_CPU_MODIFY("maincpu") +static MACHINE_CONFIG_DERIVED_CLASS( nascom2, nascom1, nascom2_state ) + MCFG_CPU_REPLACE("maincpu", Z80, XTAL_16MHz / 4) + MCFG_CPU_PROGRAM_MAP(nascom2_mem) MCFG_CPU_IO_MAP(nascom2_io) - /* video hardware */ + // video hardware MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_SIZE(48 * 8, 16 * 14) MCFG_SCREEN_VISIBLE_AREA(0, 48 * 8 - 1, 0, 16 * 14 - 1) - MCFG_SCREEN_UPDATE_DRIVER(nascom1_state, screen_update_nascom2) + MCFG_SCREEN_UPDATE_DRIVER(nascom2_state, screen_update_nascom) MCFG_GFXDECODE_MODIFY("gfxdecode", nascom2) - MCFG_DEVICE_ADD("wd1793", FD1793, 0) - MCFG_WD17XX_DEFAULT_DRIVE4_TAGS - MCFG_WD17XX_INTRQ_CALLBACK(WRITELINE(nascom1_state, nascom2_fdc_intrq_w)) - MCFG_WD17XX_DRQ_CALLBACK(WRITELINE(nascom1_state, nascom2_fdc_drq_w)) - MCFG_WD17XX_DDEN_CALLBACK(VCC) + // generic sockets for ram/rom (todo: support ram here) + MCFG_GENERIC_SOCKET_ADD("socket1", generic_plain_slot, "nascom_socket") + MCFG_GENERIC_EXTENSIONS("bin,rom") + MCFG_GENERIC_LOAD(nascom2_state, socket1_load) + MCFG_GENERIC_SOCKET_ADD("socket2", generic_plain_slot, "nascom_socket") + MCFG_GENERIC_EXTENSIONS("bin,rom") + MCFG_GENERIC_LOAD(nascom2_state, socket2_load) - MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(nascom2_floppy_interface) + MCFG_SOFTWARE_LIST_ADD("socket_list", "nascom_socket") + + // nasbus expansion bus + MCFG_NASBUS_ADD(NASBUS_TAG) + MCFG_NASBUS_SLOT_ADD("nasbus1", nasbus_slot_cards, NULL) + MCFG_NASBUS_SLOT_ADD("nasbus2", nasbus_slot_cards, NULL) + MCFG_NASBUS_SLOT_ADD("nasbus3", nasbus_slot_cards, NULL) + MCFG_NASBUS_SLOT_ADD("nasbus4", nasbus_slot_cards, NULL) MACHINE_CONFIG_END +//************************************************************************** +// ROM DEFINITIONS +//************************************************************************** -/************************************* - * - * ROM definitions - * - *************************************/ - -ROM_START(nascom1) - ROM_REGION(0x10000, "maincpu",0) +ROM_START( nascom1 ) + ROM_REGION(0x0800, "maincpu", 0) ROM_SYSTEM_BIOS(0, "T4", "NasBug T4") ROMX_LOAD("nasbugt4.rom", 0x0000, 0x0800, CRC(f391df68) SHA1(00218652927afc6360c57e77d6a4fd32d4e34566), ROM_BIOS(1)) ROM_SYSTEM_BIOS(1, "T1", "NasBug T1") ROMX_LOAD("nasbugt1.rom", 0x0000, 0x0400, CRC(8ea07054) SHA1(3f9a8632826003d6ea59d2418674d0fb09b83a4c), ROM_BIOS(2)) ROM_SYSTEM_BIOS(2, "T2", "NasBug T2") ROMX_LOAD("nasbugt2.rom", 0x0000, 0x0400, CRC(e371b58a) SHA1(485b20a560b587cf9bb4208ba203b12b3841689b), ROM_BIOS(3)) + ROM_REGION(0x0800, "gfx1", 0) ROM_LOAD("nascom1.chr", 0x0000, 0x0800, CRC(33e92a04) SHA1(be6e1cc80e7f95a032759f7df19a43c27ff93a52)) ROM_END - -ROM_START(nascom2) - ROM_REGION(0x10000, "maincpu",0) - ROM_SYSTEM_BIOS( 0, "NS3", "NasSys 3") +ROM_START( nascom2 ) + ROM_REGION(0x0800, "maincpu", 0) + ROM_SYSTEM_BIOS(0, "NS3", "NasSys 3") ROMX_LOAD("nassys3.rom", 0x0000, 0x0800, CRC(3da17373) SHA1(5fbda15765f04e4cd08cf95c8d82ce217889f240), ROM_BIOS(1)) - ROM_SYSTEM_BIOS( 1, "NS1", "NasSys 1") + ROM_SYSTEM_BIOS(1, "NS1", "NasSys 1") ROMX_LOAD("nassys1.rom", 0x0000, 0x0800, CRC(b6300716) SHA1(29da7d462ba3f569f70ed3ecd93b981f81c7adfa), ROM_BIOS(2)) - ROM_LOAD("nasdos.rom", 0xd000, 0x1000, CRC(54a36f6d) SHA1(1d063d04be5024f128bd589e6edc066e9a63fc1b)) - ROM_LOAD("basic.rom", 0xe000, 0x2000, CRC(5cb5197b) SHA1(c41669c2b6d6dea808741a2738426d97bccc9b07)) + + ROM_REGION(0x2000, "basic", 0) + ROM_LOAD("basic.rom", 0x0000, 0x2000, CRC(5cb5197b) SHA1(c41669c2b6d6dea808741a2738426d97bccc9b07)) + ROM_REGION(0x1000, "gfx1", 0) - ROM_LOAD("nascom1.chr", 0x0000, 0x0800, CRC(33e92a04) SHA1(be6e1cc80e7f95a032759f7df19a43c27ff93a52)) - ROM_LOAD("nasgra.chr", 0x0800, 0x0800, CRC(2bc09d32) SHA1(d384297e9b02cbcb283c020da51b3032ff62b1ae)) + ROM_LOAD("nascom1.chr", 0x0000, 0x0800, CRC(33e92a04) SHA1(be6e1cc80e7f95a032759f7df19a43c27ff93a52)) + ROM_LOAD("nasgra.chr", 0x0800, 0x0800, CRC(2bc09d32) SHA1(d384297e9b02cbcb283c020da51b3032ff62b1ae)) ROM_END -/************************************* - * - * Driver definitions - * - *************************************/ +//************************************************************************** +// GAME DRIVERS +//************************************************************************** -/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ -COMP( 1978, nascom1, 0, 0, nascom1, nascom1, nascom1_state, nascom1, "Nascom Microcomputers", "Nascom 1", GAME_NO_SOUND ) -COMP( 1979, nascom2, nascom1, 0, nascom2, nascom2, nascom1_state, nascom1, "Nascom Microcomputers", "Nascom 2", GAME_NO_SOUND ) +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ +COMP( 1977, nascom1, 0, 0, nascom1, nascom1, nascom_state, nascom, "Nascom Microcomputers", "Nascom 1", GAME_NO_SOUND_HW ) +COMP( 1979, nascom2, 0, 0, nascom2, nascom2, nascom2_state, nascom, "Nascom Microcomputers", "Nascom 2", GAME_NO_SOUND_HW ) diff --git a/src/mess/includes/nascom1.h b/src/mess/includes/nascom1.h deleted file mode 100644 index 403c13b775b..00000000000 --- a/src/mess/includes/nascom1.h +++ /dev/null @@ -1,87 +0,0 @@ -// license:GPL-2.0+ -// copyright-holders:(Original Author?), Dirk Best -/*************************************************************************** - - Nascom 1 and Nascom 2 - - license: MAME - copyright-holders: (Original Author?), Dirk Best - -***************************************************************************/ - -#ifndef NASCOM1_H_ -#define NASCOM1_H_ - -#include "imagedev/snapquik.h" -#include "imagedev/cassette.h" -#include "machine/wd17xx.h" -#include "machine/ram.h" -#include "machine/ay31015.h" - -struct nascom1_portstat_t -{ - UINT8 stat_flags; - UINT8 stat_count; -}; - -struct nascom2_fdc_t -{ - UINT8 select; - UINT8 irq; - UINT8 drq; -}; - - -class nascom1_state : public driver_device -{ -public: - nascom1_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_hd6402(*this, "hd6402"), - m_cassette(*this, "cassette"), - m_fdc(*this, "wd1793"), - m_ram(*this, RAM_TAG), - m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette"), - m_videoram(*this, "videoram"), - m_keyboard(*this, "KEY") - { } - - required_device m_maincpu; - required_device m_hd6402; - required_device m_cassette; - optional_device m_fdc; - required_device m_ram; - required_device m_gfxdecode; - required_device m_palette; - required_shared_ptr m_videoram; - required_ioport_array<9> m_keyboard; - int m_tape_size; - UINT8 *m_tape_image; - int m_tape_index; - nascom1_portstat_t m_portstat; - nascom2_fdc_t m_nascom2_fdc; - DECLARE_READ8_MEMBER(nascom2_fdc_select_r); - DECLARE_WRITE8_MEMBER(nascom2_fdc_select_w); - DECLARE_READ8_MEMBER(nascom2_fdc_status_r); - DECLARE_READ8_MEMBER(nascom1_port_00_r); - DECLARE_WRITE8_MEMBER(nascom1_port_00_w); - DECLARE_READ8_MEMBER(nascom1_port_01_r); - DECLARE_WRITE8_MEMBER(nascom1_port_01_w); - DECLARE_READ8_MEMBER(nascom1_port_02_r); - DECLARE_DRIVER_INIT(nascom1); - virtual void machine_reset(); - UINT32 screen_update_nascom1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - UINT32 screen_update_nascom2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - DECLARE_WRITE_LINE_MEMBER(nascom2_fdc_intrq_w); - DECLARE_WRITE_LINE_MEMBER(nascom2_fdc_drq_w); - DECLARE_READ8_MEMBER(nascom1_hd6402_si); - DECLARE_WRITE8_MEMBER(nascom1_hd6402_so); - DECLARE_DEVICE_IMAGE_LOAD_MEMBER( nascom1_cassette ); - DECLARE_DEVICE_IMAGE_UNLOAD_MEMBER( nascom1_cassette ); - DECLARE_SNAPSHOT_LOAD_MEMBER( nascom1 ); -}; - - -#endif /* NASCOM1_H_ */ diff --git a/src/mess/machine/nascom1.c b/src/mess/machine/nascom1.c deleted file mode 100644 index 74183d6163d..00000000000 --- a/src/mess/machine/nascom1.c +++ /dev/null @@ -1,261 +0,0 @@ -// license:GPL-2.0+ -// copyright-holders:(Original Author?), Dirk Best -/********************************************************************** - - Nascom 1 and Nascom 2 - -**********************************************************************/ - -#include "emu.h" -#include "includes/nascom1.h" -#include "cpu/z80/z80.h" -#include "machine/ay31015.h" -#include "imagedev/snapquik.h" -#include "imagedev/cassette.h" -#include "imagedev/flopdrv.h" -#include "machine/ram.h" - -#define NASCOM1_KEY_RESET 0x02 -#define NASCOM1_KEY_INCR 0x01 - - -/************************************* - * - * Floppy - * - *************************************/ - -WRITE_LINE_MEMBER(nascom1_state::nascom2_fdc_intrq_w) -{ - m_nascom2_fdc.irq = state; -} - -WRITE_LINE_MEMBER(nascom1_state::nascom2_fdc_drq_w) -{ - m_nascom2_fdc.drq = state; -} - -READ8_MEMBER(nascom1_state::nascom2_fdc_select_r) -{ - return m_nascom2_fdc.select | 0xa0; -} - - -WRITE8_MEMBER(nascom1_state::nascom2_fdc_select_w) -{ - m_nascom2_fdc.select = data; - - logerror("nascom2_fdc_select_w: %02x\n", data); - - if (data & 0x01) m_fdc->set_drive(0); - if (data & 0x02) m_fdc->set_drive(1); - if (data & 0x04) m_fdc->set_drive(2); - if (data & 0x08) m_fdc->set_drive(3); - if (data & 0x10) m_fdc->set_side((data & 0x10) >> 4); -} - - -/* - * D0 -- WD1793 IRQ - * D1 -- NOT READY - * D2 to D6 -- 0 - * D7 -- WD1793 DRQ - * - */ -READ8_MEMBER(nascom1_state::nascom2_fdc_status_r) -{ - return (m_nascom2_fdc.drq << 7) | m_nascom2_fdc.irq; -} - -/************************************* - * - * Keyboard - * - *************************************/ - -READ8_MEMBER(nascom1_state::nascom1_port_00_r) -{ - if (m_portstat.stat_count < 9) - return ((m_keyboard[m_portstat.stat_count])->read() | ~0x7f); - - return (0xff); -} - - -WRITE8_MEMBER(nascom1_state::nascom1_port_00_w) -{ - m_cassette->change_state( - ( data & 0x10 ) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED,CASSETTE_MASK_MOTOR ); - - if (!(data & NASCOM1_KEY_RESET)) - { - if (m_portstat.stat_flags & NASCOM1_KEY_RESET) - m_portstat.stat_count = 0; - } - else - m_portstat.stat_flags = NASCOM1_KEY_RESET; - - if (!(data & NASCOM1_KEY_INCR)) - { - if (m_portstat.stat_flags & NASCOM1_KEY_INCR) - m_portstat.stat_count++; - } - else - m_portstat.stat_flags = NASCOM1_KEY_INCR; -} - - - - -/************************************* - * - * Cassette - * - *************************************/ - - -READ8_MEMBER(nascom1_state::nascom1_port_01_r) -{ - return m_hd6402->get_received_data(); -} - - -WRITE8_MEMBER(nascom1_state::nascom1_port_01_w) -{ - m_hd6402->set_transmit_data(data); -} - -READ8_MEMBER(nascom1_state::nascom1_port_02_r) -{ - UINT8 data = 0x31; - - m_hd6402->set_input_pin(AY31015_SWE, 0); - data |= m_hd6402->get_output_pin(AY31015_OR ) ? 0x02 : 0; - data |= m_hd6402->get_output_pin(AY31015_PE ) ? 0x04 : 0; - data |= m_hd6402->get_output_pin(AY31015_FE ) ? 0x08 : 0; - data |= m_hd6402->get_output_pin(AY31015_TBMT) ? 0x40 : 0; - data |= m_hd6402->get_output_pin(AY31015_DAV ) ? 0x80 : 0; - m_hd6402->set_input_pin(AY31015_SWE, 1); - - return data; -} - - -READ8_MEMBER(nascom1_state::nascom1_hd6402_si) -{ - return 1; -} - - -WRITE8_MEMBER(nascom1_state::nascom1_hd6402_so) -{ -} - - -DEVICE_IMAGE_LOAD_MEMBER( nascom1_state,nascom1_cassette ) -{ - m_tape_size = image.length(); - m_tape_image = (UINT8*)image.ptr(); - if (!m_tape_image) - return IMAGE_INIT_FAIL; - - m_tape_index = 0; - return IMAGE_INIT_PASS; -} - - -DEVICE_IMAGE_UNLOAD_MEMBER( nascom1_state,nascom1_cassette ) -{ - m_tape_image = NULL; - m_tape_size = m_tape_index = 0; -} - - - -/************************************* - * - * Snapshots - * - * ASCII .nas format - * - *************************************/ - -SNAPSHOT_LOAD_MEMBER( nascom1_state, nascom1 ) -{ - UINT8 line[35]; - - while (image.fread( &line, sizeof(line)) == sizeof(line)) - { - int addr, b0, b1, b2, b3, b4, b5, b6, b7, dummy; - - if (sscanf((char *)line, "%x %x %x %x %x %x %x %x %x %x\010\010\n", - &addr, &b0, &b1, &b2, &b3, &b4, &b5, &b6, &b7, &dummy) == 10) - { - m_maincpu->space(AS_PROGRAM).write_byte(addr++, b0); - m_maincpu->space(AS_PROGRAM).write_byte(addr++, b1); - m_maincpu->space(AS_PROGRAM).write_byte(addr++, b2); - m_maincpu->space(AS_PROGRAM).write_byte(addr++, b3); - m_maincpu->space(AS_PROGRAM).write_byte(addr++, b4); - m_maincpu->space(AS_PROGRAM).write_byte(addr++, b5); - m_maincpu->space(AS_PROGRAM).write_byte(addr++, b6); - m_maincpu->space(AS_PROGRAM).write_byte(addr++, b7); - } - } - - return IMAGE_INIT_PASS; -} - - - -/************************************* - * - * Initialization - * - *************************************/ - -void nascom1_state::machine_reset() -{ - /* Set up hd6402 pins */ - m_hd6402->set_input_pin(AY31015_SWE, 1); - - m_hd6402->set_input_pin(AY31015_CS, 0); - m_hd6402->set_input_pin(AY31015_NP, 1); - m_hd6402->set_input_pin(AY31015_NB1, 1); - m_hd6402->set_input_pin(AY31015_NB2, 1); - m_hd6402->set_input_pin(AY31015_EPS, 1); - m_hd6402->set_input_pin(AY31015_TSB, 1); - m_hd6402->set_input_pin(AY31015_CS, 1); -} - -DRIVER_INIT_MEMBER(nascom1_state,nascom1) -{ - switch (m_ram->size()) - { - case 1 * 1024: - m_maincpu->space(AS_PROGRAM).nop_readwrite( - 0x1400, 0x9000); - break; - - case 16 * 1024: - m_maincpu->space(AS_PROGRAM).install_readwrite_bank( - 0x1400, 0x4fff, "bank1"); - m_maincpu->space(AS_PROGRAM).nop_readwrite( - 0x5000, 0xafff); - membank("bank1")->set_base(m_ram->pointer()); - break; - - case 32 * 1024: - m_maincpu->space(AS_PROGRAM).install_readwrite_bank( - 0x1400, 0x8fff, "bank1"); - m_maincpu->space(AS_PROGRAM).nop_readwrite( - 0x9000, 0xafff); - membank("bank1")->set_base(m_ram->pointer()); - break; - - case 40 * 1024: - m_maincpu->space(AS_PROGRAM).install_readwrite_bank( - 0x1400, 0xafff, "bank1"); - membank("bank1")->set_base(m_ram->pointer()); - break; - } -} diff --git a/src/mess/video/nascom1.c b/src/mess/video/nascom1.c deleted file mode 100644 index 56bed3a9aa9..00000000000 --- a/src/mess/video/nascom1.c +++ /dev/null @@ -1,56 +0,0 @@ -// license:GPL-2.0+ -// copyright-holders:(Original Author?), Dirk Best -/*************************************************************************** - - nascom1.c - - Functions to emulate the video hardware of the nascom1. - -***************************************************************************/ - -#include "emu.h" -#include "includes/nascom1.h" - -UINT32 nascom1_state::screen_update_nascom1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - UINT8 *videoram = m_videoram; - int sy, sx; - - for (sx = 0; sx < 48; sx++) - { - m_gfxdecode->gfx(0)->opaque(bitmap,cliprect, videoram[0x03ca + sx], - 1, 0, 0, sx * 8, 0); - } - - for (sy = 0; sy < 15; sy++) - { - for (sx = 0; sx < 48; sx++) - { - m_gfxdecode->gfx(0)->opaque(bitmap,cliprect, videoram[0x000a + (sy * 64) + sx], - 1, 0, 0, sx * 8, (sy + 1) * 16); - } - } - return 0; -} - -UINT32 nascom1_state::screen_update_nascom2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - UINT8 *videoram = m_videoram; - int sy, sx; - - for (sx = 0; sx < 48; sx++) - { - m_gfxdecode->gfx(0)->opaque(bitmap,cliprect, videoram[0x03ca + sx], - 1, 0, 0, sx * 8, 0); - } - - for (sy = 0; sy < 15; sy++) - { - for (sx = 0; sx < 48; sx++) - { - m_gfxdecode->gfx(0)->opaque(bitmap,cliprect, videoram[0x000a + (sy * 64) + sx], - 1, 0, 0, sx * 8, (sy + 1) * 14); - } - } - return 0; -}