This commit is contained in:
RobertoFresca 2015-10-30 06:48:05 -03:00
commit f9b063306e
27 changed files with 1677 additions and 785 deletions

View File

@ -17955,14 +17955,14 @@ Info from Atariage and Atarimania
</part>
</software>
<!-- This was released by the author, also available via Atariage, are both versions the same? needs DPC+ emulation -->
<!-- This was released by the author, also available via Atariage, are both versions the same? needs HARMONY/MELODY emulation -->
<software name="stayfr2" supported="no">
<description>Stay Frosty 2 (NTSC)</description>
<year>2013</year>
<publisher>Spiceware</publisher>
<sharedfeat name="compatibility" value="NTSC" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_dpcplus" />
<feature name="slot" value="a26_harmony" />
<dataarea name="rom" size="0x8000">
<rom name="SF2_20131217_RC8_NTSC.bin" size="0x8000" crc="4eb739ab" sha1="5eceaf8e90bd9a002f4935f082df7b25716dceb0" offset="0" />
</dataarea>
@ -17975,7 +17975,7 @@ Info from Atariage and Atarimania
<publisher>Spiceware</publisher>
<sharedfeat name="compatibility" value="NTSC" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_dpcplus" />
<feature name="slot" value="a26_harmony" />
<dataarea name="rom" size="0x8000">
<rom name="SF2_demo_NTSC.bin" size="0x8000" crc="fd850bd6" sha1="bd8166da7777c66e6bb3ab0c77563193d8289f5f" offset="0" />
</dataarea>
@ -17989,7 +17989,7 @@ Info from Atariage and Atarimania
<publisher>Spiceware</publisher>
<sharedfeat name="compatibility" value="PAL" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_dpcplus" />
<feature name="slot" value="a26_harmony" />
<dataarea name="rom" size="0x8000">
<rom name="SF2_20131217_RC8_PAL.bin" size="0x8000" crc="7b495dc3" sha1="1625ef74b0a48c2968fad832ab8e2edc8187a53f" offset="0" />
</dataarea>
@ -18002,13 +18002,80 @@ Info from Atariage and Atarimania
<publisher>Spiceware</publisher>
<sharedfeat name="compatibility" value="PAL" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_dpcplus" />
<feature name="slot" value="a26_harmony" />
<dataarea name="rom" size="0x8000">
<rom name="SF2_demo_PAL.bin" size="0x8000" crc="b47582f3" sha1="73625429e73f1b354e0cbe6a360d79590032de2b" offset="0" />
</dataarea>
</part>
</software>
<software name="spcrocks" supported="no">
<description>Space Rocks (RC7, NTSC)</description>
<year>2012</year>
<publisher>Spiceware</publisher>
<sharedfeat name="compatibility" value="NTSC" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_harmony" />
<dataarea name="rom" size="0x8000">
<rom name="spacerocks20121129_NTSC.bin" size="0x8000" crc="c5d8eb83" sha1="bf3af5c76bb4dded5cb9c9b232c369250ad20ac4" offset="0" />
</dataarea>
</part>
</software>
<software name="spcrockse" cloneof="spcrocks" supported="no">
<description>Space Rocks (RC7, PAL)</description>
<year>2012</year>
<publisher>Spiceware</publisher>
<sharedfeat name="compatibility" value="PAL" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_harmony" />
<dataarea name="rom" size="0x8000">
<rom name="spacerocks20121129_PAL.bin" size="0x8000" crc="133cb923" sha1="0511a35ee435227fbb5665e8488590eb993256f7" offset="0" />
</dataarea>
</part>
</software>
<software name="frantic" supported="no">
<description>Frantic (20140305, NTSC)</description>
<year>2014</year>
<publisher>Spiceware</publisher>
<sharedfeat name="compatibility" value="NTSC" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_harmony" />
<dataarea name="rom" size="0x8000">
<rom name="frantic20140305.bin" size="0x8000" crc="04d0f558" sha1="ee2a004a50861c5fdfbdabfa5ed4bf825333ec43" offset="0" />
</dataarea>
</part>
</software>
<software name="harmbios" supported="no"> <!-- I think these are the bios roms if you're using it as a multi-game cart? -->
<description>Harmony Bios Updater</description>
<year>2014</year>
<publisher>Harmony</publisher>
<sharedfeat name="compatibility" value="NTSC" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_harmony" />
<dataarea name="rom" size="0x8000">
<rom name="bios_updater_NTSC.cu" size="0x8000" crc="03153eb2" sha1="cd9ee1d820737b3887ebe5fc6fe96a2a043ab009" offset="0" />
</dataarea>
<dataarea name="bios" size="0x21400">
<rom name="hbios_106_NTSC_official_beta.bin" size="0x21400" crc="1e1d237b" sha1="8fd74e0119bce43a89bcc4998b750bc6884971da" offset="0" />
<rom name="hbios_106_NTSC_beta_2.bin" size="0x21400" crc="807b86bd" sha1="633960295c30e7430b3ce58f6244495f4b708e9d" offset="0" />
<rom name="hbios_106_NTSC.bin" size="0x21400" crc="48664301" sha1="aaa5e839f307734306c2a9ccbe38482579c70391" offset="0" />
<rom name="hbios_105_NTSC.bin" size="0x19400" crc="c0b8aae9" sha1="68b10153695da505756eb7dc7cc4a7e93fe68860" offset="0" />
<rom name="hbios_105_PAL50.bin" size="0x19400" crc="fb942c80" sha1="81bba9d9c245d23cc4b9503180ebe2d67bf1e117" offset="0" />
<rom name="hbios_105_PAL60.bin" size="0x19400" crc="b59ebe6d" sha1="873830286c66935fd23e3ea7c192e6573e056cbd" offset="0" />
<rom name="eeloader_104e_NTSC.bin" size="0x36f8" crc="ad04a8d9" sha1="c83d724299875cd5ea8d6be05db12d688ce8eff1" offset="0" />
<rom name="eeloader_104e_PAL50.bin" size="0x36f8" crc="4868ba51" sha1="e6a65523824ecf4f2a5145e2c5118cfb4bee059d" offset="0" />
<rom name="eeloader_104e_PAL60.bin" size="0x36f8" crc="58845532" sha1="255b5c9f4f2f7322c20d2619126cd150a1b8f71c" offset="0" />
</dataarea>
</part>
</software>
</softwarelist>

View File

@ -1161,8 +1161,8 @@ if (BUSES["VCS"]~=null) then
MAME_DIR .. "src/devices/bus/vcs/compumat.h",
MAME_DIR .. "src/devices/bus/vcs/dpc.c",
MAME_DIR .. "src/devices/bus/vcs/dpc.h",
MAME_DIR .. "src/devices/bus/vcs/dpcplus.c",
MAME_DIR .. "src/devices/bus/vcs/dpcplus.h",
MAME_DIR .. "src/devices/bus/vcs/harmony_melody.c",
MAME_DIR .. "src/devices/bus/vcs/harmony_melody.h",
MAME_DIR .. "src/devices/bus/vcs/scharger.c",
MAME_DIR .. "src/devices/bus/vcs/scharger.h",
}

View File

@ -132,6 +132,8 @@ if (CPUS["ARM7"]~=null) then
MAME_DIR .. "src/devices/cpu/arm7/arm7.h",
MAME_DIR .. "src/devices/cpu/arm7/arm7thmb.c",
MAME_DIR .. "src/devices/cpu/arm7/arm7ops.c",
MAME_DIR .. "src/devices/cpu/arm7/lpc210x.c",
MAME_DIR .. "src/devices/cpu/arm7/lpc210x.h",
}
end
@ -1134,6 +1136,7 @@ end
--@src/devices/cpu/m6502/r65c02.h,CPUS["M6502"] = true
--@src/devices/cpu/m6502/m65sc02.h,CPUS["M6502"] = true
--@src/devices/cpu/m6502/m6504.h,CPUS["M6502"] = true
--@src/devices/cpu/m6502/m6507.h,CPUS["M6502"] = true
--@src/devices/cpu/m6502/m6509.h,CPUS["M6502"] = true
--@src/devices/cpu/m6502/m6510.h,CPUS["M6502"] = true
--@src/devices/cpu/m6502/m6510t.h,CPUS["M6502"] = true
@ -1162,6 +1165,8 @@ if (CPUS["M6502"]~=null) then
MAME_DIR .. "src/devices/cpu/m6502/m65sc02.h",
MAME_DIR .. "src/devices/cpu/m6502/m6504.c",
MAME_DIR .. "src/devices/cpu/m6502/m6504.h",
MAME_DIR .. "src/devices/cpu/m6502/m6507.c",
MAME_DIR .. "src/devices/cpu/m6502/m6507.h",
MAME_DIR .. "src/devices/cpu/m6502/m6509.c",
MAME_DIR .. "src/devices/cpu/m6502/m6509.h",
MAME_DIR .. "src/devices/cpu/m6502/m6510.c",

View File

@ -1,98 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:
/***************************************************************************
Atari 2600 cart with DPC+
the DPC+ adds an ARM CPU amongst other things (display improvements, etc.)
map (according to a blogpost on atariage):
NOTE: All banks are accessible via $F000
* ARM RAM mapped at $40000000 in this area
$0000-$0BFF: DPC+ driver (not accessible by 2600 itself)
$0C00-$1BFF: Bank 0
$1C00-$2BFF: Bank 1
$2C00-$3BFF: Bank 2
$3C00-$4BFF: Bank 3
$4C00-$5BFF: Bank 4
$5C00-$6BFF: Bank 5
* ARM RAM mapped at $40000C00 in this area
$6C00-$7BFF: Display Data (indirect access)
* ARM RAM mapped at $40001C00 in this area
$7C00-$7FFF: Frequency Data (not accessible by 2600 itself)
***************************************************************************/
#include "emu.h"
#include "dpcplus.h"
// cart device
const device_type A26_ROM_DPCPLUS = &device_creator<a26_rom_dpcplus_device>;
a26_rom_dpcplus_device::a26_rom_dpcplus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: a26_rom_f8_device(mconfig, A26_ROM_DPCPLUS, "Atari 2600 ROM Cart DPC+", tag, owner, clock, "a2600_dpcplus", __FILE__)
{
}
//-------------------------------------------------
// mapper specific start/reset
//-------------------------------------------------
void a26_rom_dpcplus_device::device_start()
{
save_item(NAME(m_base_bank));
}
void a26_rom_dpcplus_device::device_reset()
{
m_base_bank = 0;
}
READ32_MEMBER(a26_rom_dpcplus_device::armrom_r)
{
UINT32 ret = (a26_rom_f8_device::read_rom(space, offset * 4 + 3) << 24) |
(a26_rom_f8_device::read_rom(space, offset * 4 + 2) << 16) |
(a26_rom_f8_device::read_rom(space, offset * 4 + 1) << 8) |
(a26_rom_f8_device::read_rom(space, offset * 4 + 0) << 0);
return ret;
}
WRITE32_MEMBER(a26_rom_dpcplus_device::armrom_w)
{
}
static ADDRESS_MAP_START( dpcplus_arm7_map, AS_PROGRAM, 32, a26_rom_dpcplus_device )
// todo: implement all this correctly
AM_RANGE(0x00000000, 0x00007fff) AM_READWRITE(armrom_r,armrom_w)// flash, 32k
AM_RANGE(0x40000000, 0x40001fff) AM_RAM // sram, 8k
ADDRESS_MAP_END
static MACHINE_CONFIG_FRAGMENT( a26_dpcplus )
MCFG_CPU_ADD("arm", ARM7, 70000000) // correct type?
MCFG_CPU_PROGRAM_MAP(dpcplus_arm7_map)
MACHINE_CONFIG_END
machine_config_constructor a26_rom_dpcplus_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( a26_dpcplus );
}
READ8_MEMBER(a26_rom_dpcplus_device::read_rom)
{
return a26_rom_f8_device::read_rom(space, offset);
}
WRITE8_MEMBER(a26_rom_dpcplus_device::write_bank)
{
a26_rom_f8_device::write_bank(space, offset, data);
}

View File

@ -1,38 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:
#ifndef __VCS_DPCPLUS_H
#define __VCS_DPCPLUS_H
#include "rom.h"
#include "cpu/arm7/arm7.h"
// ======================> a26_rom_dpcplus_device
class a26_rom_dpcplus_device : public a26_rom_f8_device
{
public:
// construction/destruction
a26_rom_dpcplus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// device-level overrides
virtual void device_start();
virtual machine_config_constructor device_mconfig_additions() const;
virtual void device_reset();
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom);
virtual DECLARE_WRITE8_MEMBER(write_bank);
DECLARE_READ32_MEMBER(armrom_r);
DECLARE_WRITE32_MEMBER(armrom_w);
protected:
};
// device type definition
extern const device_type A26_ROM_DPCPLUS;
#endif

View File

@ -0,0 +1,146 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/***************************************************************************
Harmony / Melody cart for the A2600
The Harmony cart is a 'modern' A2600 cartridge, used for homebrew etc. It has
an SD slot and can be connected to a PC, roms can be transfered to it with
software on the PC side. It uses an ARM7TDMI-S LPC2103 @ 70 Mhz to emulate
the mapper behavior of other cartridges. It has an SD card slot for storing
game data.
The Melody version of the cartridge has been used for several recent A2600
commercial releases as well as some reproductions due to it's ability to be
programmed as any other cartridge type. This lacks the SD slot?
The 'DPC+' games by SpiceWare run on a Harmony / Melody cart, DPC+ seems to
be a virtual 'software mapper' programmed on the ARM rather than a real mapper.
There is also a 'Harmony Encore' cartridge which adds support for some of the
games the original couldn't handle due to them having larger ROMs and more
complex banking schemes (Stella's Stocking etc.)
some Harmony cart details can be found at
http://atariage.com/forums/topic/156500-latest-harmony-cart-software/
DPC+ notes
----------
Some info on the Harmony / Melody when configured as DPC+ hardware can be found on Darrell Spice Jr's guides:
http://atariage.com/forums/blog/148/entry-11811-dpcarm-part-6-dpc-cartridge-layout/
http://atariage.com/forums/blog/148/entry-11883-dpcarm-part-7-6507arm-exchange-of-information/
http://atariage.com/forums/blog/148/entry-11903-dpcarm-part-8-multiple-functions/
http://atariage.com/forums/blog/148/entry-11935-dpcarm-part-9-functional-menu/
http://atariage.com/forums/blog/148/entry-11964-dpcarm-part-10-score-timer-display/
http://atariage.com/forums/blog/148/entry-11988-dpcarm-part-12-gamepad-support/
map:
Bankswitching uses addresses $FFF6-$FFFB
* ARM RAM mapped at $40000000 in this area
$0000-$0BFF: HARMONY/MELODY driver (not accessible by 2600 itself) (copied to $40000000 - $40000bff on startup by ARM)
$0C00-$1BFF: Bank 0 (each bank can map to 0x1000 - 0x1fff in 6507 space, like other carts)
$1C00-$2BFF: Bank 1
$2C00-$3BFF: Bank 2
$3C00-$4BFF: Bank 3
$4C00-$5BFF: Bank 4
$5C00-$6BFF: Bank 5 (default bank is bank 5)
$6C00-$7BFF: Display Data (indirect access) (copied to $40000C00 - $40001bff on startup by ARM)
$7C00-$7FFF: Synth Frequency Data (not accessible by 2600 itself) (copied to $40001C00 - $40001fff on startup by ARM)
***************************************************************************/
#include "emu.h"
#include "harmony_melody.h"
// cart device
const device_type A26_ROM_HARMONY = &device_creator<a26_rom_harmony_device>;
a26_rom_harmony_device::a26_rom_harmony_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: a26_rom_f8_device(mconfig, A26_ROM_HARMONY, "Atari 2600 ROM Cart HARMONY/MELODY", tag, owner, clock, "a2600_harmony", __FILE__),
m_cpu(*this, "arm")
{
}
//-------------------------------------------------
// mapper specific start/reset
//-------------------------------------------------
void a26_rom_harmony_device::device_start()
{
save_item(NAME(m_base_bank));
}
static ADDRESS_MAP_START( harmony_arm7_map, AS_PROGRAM, 32, a26_rom_harmony_device )
ADDRESS_MAP_END
static MACHINE_CONFIG_FRAGMENT( a26_harmony )
MCFG_CPU_ADD("arm", LPC2103, 70000000)
MCFG_CPU_PROGRAM_MAP(harmony_arm7_map)
MACHINE_CONFIG_END
machine_config_constructor a26_rom_harmony_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( a26_harmony );
}
// actually if the ARM code is doing this and providing every opcode to the main CPU based
// on bus activity then we shouldn't be doing and of this here (if the ROM is actually
// the internal Flash rom of the ARM CPU then the A2600 CPU won't be able to see it directly
// at all?)
//
// instead we need the ARM monitoring the bus at all times and supplying the code on
// demand transparent to the main CPU? is this theory correct?
void a26_rom_harmony_device::device_reset()
{
m_base_bank = 5;
memcpy(m_cpu->m_flash, m_rom, 0x8000);
m_cpu->reset();
}
READ8_MEMBER(a26_rom_harmony_device::read8_r)
{
return m_rom[offset + (m_base_bank * 0x1000)];
}
void a26_rom_harmony_device::check_bankswitch(offs_t offset)
{
switch (offset)
{
case 0x0FF6: m_base_bank = 0; break;
case 0x0FF7: m_base_bank = 1; break;
case 0x0FF8: m_base_bank = 2; break;
case 0x0FF9: m_base_bank = 3; break;
case 0x0FFa: m_base_bank = 4; break;
case 0x0FFb: m_base_bank = 5; break;
default: break;
}
}
READ8_MEMBER(a26_rom_harmony_device::read_rom)
{
UINT8 retvalue = read8_r(space, offset + 0xc00); // banks start at 0xc00
check_bankswitch(offset);
return retvalue;
}
WRITE8_MEMBER(a26_rom_harmony_device::write_bank)
{
check_bankswitch(offset);
// a26_rom_f8_device::write_bank(space, offset, data);
}

View File

@ -0,0 +1,42 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
#ifndef __VCS_HARMONY_H
#define __VCS_HARMONY_H
#include "rom.h"
#include "cpu/arm7/lpc210x.h"
// ======================> a26_rom_harmony_device
class a26_rom_harmony_device : public a26_rom_f8_device
{
public:
// construction/destruction
a26_rom_harmony_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// device-level overrides
virtual void device_start();
virtual machine_config_constructor device_mconfig_additions() const;
virtual void device_reset();
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom);
virtual DECLARE_WRITE8_MEMBER(write_bank);
DECLARE_READ8_MEMBER(read8_r);
void check_bankswitch(offs_t offset);
protected:
private:
required_device<lpc210x_device> m_cpu;
};
// device type definition
extern const device_type A26_ROM_HARMONY;
#endif

View File

@ -157,7 +157,7 @@ static const vcs_slot slot_list[] =
{ A26_8IN1, "a26_8in1" },
{ A26_32IN1, "a26_32in1" },
{ A26_X07, "a26_x07" },
{ A26_DPCPLUS, "a26_dpcplus" },
{ A26_HARMONY, "a26_harmony" },
};
static int vcs_get_pcb_id(const char *slot)

View File

@ -36,7 +36,7 @@ enum
A26_SS,
A26_CM,
A26_X07,
A26_DPCPLUS,
A26_HARMONY,
};

View File

@ -0,0 +1,285 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/***************************************************************************
NXP (Phillips) LPC2103 series
covering LPC2101, LPC2102, LPC2103*
*currently only LPC2103
these are based on an ARM7TDMI-S CPU
internal flash and integrated peripherals
***************************************************************************/
#include "lpc210x.h"
const device_type LPC2103 = &device_creator<lpc210x_device>;
static ADDRESS_MAP_START( lpc2103_map, AS_PROGRAM, 32, lpc210x_device )
AM_RANGE(0x00000000, 0x00007fff) AM_READWRITE(flash_r, flash_w) // 32kb internal FLASH rom
AM_RANGE(0x3FFFC000, 0x3FFFC01f) AM_READWRITE( fio_r, fio_w ) // GPIO
AM_RANGE(0x40000000, 0x40001fff) AM_RAM // 8kb internal SROM (writes should actually latch - see docs)
AM_RANGE(0xE0004000, 0xE000407f) AM_READWRITE( timer0_r, timer0_w)
AM_RANGE(0xE0008000, 0xE000807f) AM_READWRITE( timer1_r, timer1_w)
AM_RANGE(0xE002C000, 0xE002C007) AM_READWRITE( pin_r, pin_w )
AM_RANGE(0xE01FC000, 0xE01FC007) AM_READWRITE( mam_r, mam_w )
AM_RANGE(0xE01FC080, 0xE01FC08f) AM_READWRITE( pll_r, pll_w ) // phase locked loop
AM_RANGE(0xE01FC100, 0xE01FC103) AM_READWRITE( apbdiv_r, apbdiv_w )
AM_RANGE(0xE01FC1a0, 0xE01FC1a3) AM_READWRITE( scs_r, scs_w )
AM_RANGE(0xFFFFF000, 0xFFFFF2ff) AM_READWRITE( vic_r, vic_w ) // interrupt controller
ADDRESS_MAP_END
lpc210x_device::lpc210x_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: arm7_cpu_device(mconfig, LPC2103, "LPC2103", tag, owner, clock, "lpc2103", __FILE__, 4, eARM_ARCHFLAGS_T, ENDIANNESS_LITTLE),
m_program_config("program", ENDIANNESS_LITTLE, 32, 32, 0, ADDRESS_MAP_NAME(lpc2103_map))
{
}
READ32_MEMBER(lpc210x_device::arm_E01FC088_r)
{
return 0xffffffff;
}
READ32_MEMBER(lpc210x_device::flash_r)
{
UINT32 ret = (m_flash[offset * 4 + 3] << 24) |
(m_flash[offset * 4 + 2] << 16) |
(m_flash[offset * 4 + 1] << 8) |
(m_flash[offset * 4 + 0] << 0);
return ret;
}
WRITE32_MEMBER(lpc210x_device::flash_w)
{
//
}
const address_space_config *lpc210x_device::memory_space_config(address_spacenum spacenum) const
{
switch(spacenum)
{
case AS_PROGRAM: return &m_program_config;
default: return NULL;
}
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void lpc210x_device::device_start()
{
arm7_cpu_device::device_start();
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void lpc210x_device::device_reset()
{
arm7_cpu_device::device_reset();
m_TxPR[0] = 0;
m_TxPR[1] = 0;
}
/* VIC (Vectored Interrupt Controller) */
READ32_MEMBER( lpc210x_device::vic_r )
{
switch (offset*4)
{
default:
logerror("%08x unhandled read from VIC offset %08x mem_mask %08x\n", space.device().safe_pc(), offset * 4, mem_mask);
}
return 0x00000000;
}
WRITE32_MEMBER( lpc210x_device::vic_w )
{
switch (offset * 4)
{
default:
logerror("%08x unhandled write VIC offset %02x data %08x mem_mask %08x\n", space.device().safe_pc(), offset * 4, data, mem_mask);
}
}
/* PIN Select block */
READ32_MEMBER( lpc210x_device::pin_r )
{
switch (offset*4)
{
default:
logerror("%08x unhandled read from PINSEL offset %08x mem_mask %08x\n",space.device().safe_pc(), offset * 4, mem_mask);
}
return 0x00000000;
}
WRITE32_MEMBER( lpc210x_device::pin_w )
{
switch (offset * 4)
{
default:
logerror("%08x unhandled write PINSEL offset %02x data %08x mem_mask %08x\n", space.device().safe_pc(), offset * 4, data, mem_mask);
}
}
/* MAM block (memory conttroller) */
READ32_MEMBER( lpc210x_device::mam_r )
{
switch (offset*4)
{
default:
logerror("%08x unhandled read from MAM offset %08x mem_mask %08x\n", space.device().safe_pc(), offset * 4, mem_mask);
}
return 0x00000000;
}
WRITE32_MEMBER( lpc210x_device::mam_w )
{
switch (offset * 4)
{
default:
logerror("%08x unhandled write MAM offset %02x data %08x mem_mask %08x\n", space.device().safe_pc(), offset * 4, data, mem_mask);
}
}
/* FIO block */
READ32_MEMBER( lpc210x_device::fio_r )
{
switch (offset*4)
{
default:
logerror("%08x unhandled read from FIO offset %08x mem_mask %08x\n", space.device().safe_pc(), offset * 4, mem_mask);
}
return 0x00000000;
}
WRITE32_MEMBER( lpc210x_device::fio_w )
{
switch (offset * 4)
{
default:
logerror("%08x unhandled write FIO offset %02x data %08x mem_mask %08x\n", space.device().safe_pc(), offset * 4, data, mem_mask);
}
}
/* APB Divider */
READ32_MEMBER( lpc210x_device::apbdiv_r )
{
logerror("%08x unhandled read from APBDIV offset %08x mem_mask %08x\n", space.device().safe_pc(), offset * 4, mem_mask);
return 0x00000000;
}
WRITE32_MEMBER( lpc210x_device::apbdiv_w )
{
logerror("%08x unhandled write APBDIV offset %02x data %08x mem_mask %08x\n", space.device().safe_pc(),offset * 4, data, mem_mask);
}
/* Syscon misc registers */
READ32_MEMBER( lpc210x_device::scs_r )
{
logerror("%08x unhandled read from SCS offset %08x mem_mask %08x\n", space.device().safe_pc(),offset * 4, mem_mask);
return 0x00000000;
}
WRITE32_MEMBER( lpc210x_device::scs_w )
{
logerror("%08x unhandled write SCS offset %02x data %08x mem_mask %08x\n", space.device().safe_pc(),offset * 4, data, mem_mask);
}
/* PLL Phase Locked Loop */
READ32_MEMBER( lpc210x_device::pll_r )
{
switch (offset*4)
{
default:
logerror("%08x unhandled read from PLL offset %08x mem_mask %08x\n", space.device().safe_pc(),offset * 4, mem_mask);
}
return 0xffffffff;
}
WRITE32_MEMBER( lpc210x_device::pll_w )
{
switch (offset * 4)
{
default:
logerror("%08x unhandled write PLL offset %02x data %08x mem_mask %08x\n", space.device().safe_pc(),offset * 4, data, mem_mask);
}
}
/* Timers */
UINT32 lpc210x_device::read_timer(address_space &space, int timer, int offset, UINT32 mem_mask)
{
switch (offset*4)
{
case 0x0c:
return m_TxPR[timer];
default:
logerror("%08x unhandled read from timer %d offset %02x mem_mask %08x\n", space.device().safe_pc(),timer, offset * 4, mem_mask);
}
return 0x00000000;
}
void lpc210x_device::write_timer(address_space &space, int timer, int offset, UINT32 data, UINT32 mem_mask)
{
switch (offset * 4)
{
case 0x0c:
COMBINE_DATA(&m_TxPR[timer]);
logerror("%08x Timer %d Prescale Register set to %08x\n", space.device().safe_pc(),timer, m_TxPR[timer]);
break;
default:
logerror("%08x unhandled write timer %d offset %02x data %08x mem_mask %08x\n", space.device().safe_pc(),timer, offset * 4, data, mem_mask);
}
}
static MACHINE_CONFIG_FRAGMENT( lpc210x )
MACHINE_CONFIG_END
machine_config_constructor lpc210x_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( lpc210x );
}

View File

@ -0,0 +1,104 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
#pragma once
#ifndef __LPC2103__
#define __LPC2103__
#include "emu.h"
#include "arm7.h"
#include "arm7core.h"
/***************************************************************************
DEVICE CONFIGURATION MACROS
***************************************************************************/
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
class lpc210x_device : public arm7_cpu_device
{
public:
lpc210x_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32);
// static configuration helpers
// todo, use an appropriate flash type instead
UINT8 m_flash[0x8000];
DECLARE_READ32_MEMBER(arm_E01FC088_r);
DECLARE_READ32_MEMBER(flash_r);
DECLARE_WRITE32_MEMBER(flash_w);
// timer 0 / 1
DECLARE_READ32_MEMBER(timer0_r) { return read_timer(space, 0, offset, mem_mask); }
DECLARE_WRITE32_MEMBER(timer0_w) { write_timer(space, 0, offset, data, mem_mask); }
DECLARE_READ32_MEMBER(timer1_r) { return read_timer(space, 1, offset, mem_mask); }
DECLARE_WRITE32_MEMBER(timer1_w) { write_timer(space, 1, offset, data, mem_mask); }
void write_timer(address_space &space, int timer, int offset, UINT32 data, UINT32 mem_mask);
UINT32 read_timer(address_space &space, int timer, int offset, UINT32 mem_mask);
UINT32 m_TxPR[2];
// VIC
DECLARE_READ32_MEMBER(vic_r);
DECLARE_WRITE32_MEMBER(vic_w);
// PIN select block
DECLARE_READ32_MEMBER(pin_r);
DECLARE_WRITE32_MEMBER(pin_w);
//PLL Phase Locked Loop
DECLARE_READ32_MEMBER(pll_r);
DECLARE_WRITE32_MEMBER(pll_w);
//MAM memory controller
DECLARE_READ32_MEMBER(mam_r);
DECLARE_WRITE32_MEMBER(mam_w);
//APB divider
DECLARE_READ32_MEMBER(apbdiv_r);
DECLARE_WRITE32_MEMBER(apbdiv_w);
//syscon misc
DECLARE_READ32_MEMBER(scs_r);
DECLARE_WRITE32_MEMBER(scs_w);
// fio
DECLARE_READ32_MEMBER(fio_r);
DECLARE_WRITE32_MEMBER(fio_w);
protected:
// device-level overrides
virtual machine_config_constructor device_mconfig_additions() const;
virtual void device_start();
virtual void device_reset();
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const;
private:
address_space_config m_program_config;
};
// device type definition
extern const device_type LPC2103;
#endif /// __LPC2103__

View File

@ -0,0 +1,61 @@
// license:BSD-3-Clause
// copyright-holders:Olivier Galibert
/***************************************************************************
m6507.c
Mostek 6502, NMOS variant with reduced address bus
***************************************************************************/
#include "emu.h"
#include "m6507.h"
const device_type M6507 = &device_creator<m6507_device>;
m6507_device::m6507_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
m6502_device(mconfig, M6507, "M6507", tag, owner, clock, "m6507", __FILE__)
{
program_config.m_addrbus_width = 13;
sprogram_config.m_addrbus_width = 13;
}
void m6507_device::device_start()
{
if(direct_disabled)
mintf = new mi_6507_nd;
else
mintf = new mi_6507_normal;
init();
}
UINT8 m6507_device::mi_6507_normal::read(UINT16 adr)
{
return program->read_byte(adr & 0x1fff);
}
UINT8 m6507_device::mi_6507_normal::read_sync(UINT16 adr)
{
return sdirect->read_byte(adr & 0x1fff);
}
UINT8 m6507_device::mi_6507_normal::read_arg(UINT16 adr)
{
return direct->read_byte(adr & 0x1fff);
}
void m6507_device::mi_6507_normal::write(UINT16 adr, UINT8 val)
{
program->write_byte(adr & 0x1fff, val);
}
UINT8 m6507_device::mi_6507_nd::read_sync(UINT16 adr)
{
return sprogram->read_byte(adr & 0x1fff);
}
UINT8 m6507_device::mi_6507_nd::read_arg(UINT16 adr)
{
return program->read_byte(adr & 0x1fff);
}

View File

@ -0,0 +1,49 @@
// license:BSD-3-Clause
// copyright-holders:Olivier Galibert
/***************************************************************************
m6507.h
Mostek 6502, NMOS variant with reduced address bus
***************************************************************************/
#ifndef __M6507_H__
#define __M6507_H__
#include "m6502.h"
class m6507_device : public m6502_device {
public:
m6507_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
protected:
class mi_6507_normal : public memory_interface {
public:
virtual ~mi_6507_normal() {}
virtual UINT8 read(UINT16 adr);
virtual UINT8 read_sync(UINT16 adr);
virtual UINT8 read_arg(UINT16 adr);
virtual void write(UINT16 adr, UINT8 val);
};
class mi_6507_nd : public mi_6507_normal {
public:
virtual ~mi_6507_nd() {}
virtual UINT8 read_sync(UINT16 adr);
virtual UINT8 read_arg(UINT16 adr);
};
virtual void device_start();
};
enum {
M6507_IRQ_LINE = m6502_device::IRQ_LINE,
M6507_NMI_LINE = m6502_device::NMI_LINE,
M6507_SET_OVERFLOW = m6502_device::V_LINE
};
extern const device_type M6507;
#endif

View File

@ -3120,6 +3120,7 @@ leds2011u // 1988 (c) 1988 (US)
// Capcom CPS1 games
forgottn // 7/1988 (c) 1988 (World)
forgottna // 7/1988 (c) 1988 (World)
forgottnu // 7/1988 (c) 1988 (USA)
forgottnu1 // 7/1988 (c) 1988 (USA)
forgottnua // 7/1988 (c) 1988 (USA)
@ -11399,6 +11400,7 @@ pepp0045 // (c) 1987 IGT - International Game Technology
pepp0045a // (c) 1987 IGT - International Game Technology
pepp0045b // (c) 1987 IGT - International Game Technology
pepp0045c // (c) 1987 IGT - International Game Technology
pepp0045d // (c) 1987 IGT - International Game Technology
pepp0046 // (c) 1987 IGT - International Game Technology
pepp0046a // (c) 1987 IGT - International Game Technology
pepp0046b // (c) 1987 IGT - International Game Technology

View File

@ -12,13 +12,13 @@ TODO:
#include "emu.h"
#include "machine/mos6530n.h"
#include "cpu/m6502/m6502.h"
#include "cpu/m6502/m6507.h"
#include "sound/tiaintf.h"
#include "video/tia.h"
#include "bus/vcs/vcs_slot.h"
#include "bus/vcs/rom.h"
#include "bus/vcs/dpc.h"
#include "bus/vcs/dpcplus.h"
#include "bus/vcs/harmony_melody.h"
#include "bus/vcs/scharger.h"
#include "bus/vcs/compumat.h"
#include "bus/vcs_ctrl/ctrl.h"
@ -70,7 +70,7 @@ protected:
required_device<tia_video_device> m_tia;
unsigned long detect_2600controllers();
required_device<m6502_device> m_maincpu;
required_device<m6507_device> m_maincpu;
required_device<screen_device> m_screen;
required_ioport m_swb;
required_device<mos6532_t> m_riot;
@ -85,8 +85,7 @@ protected:
static const UINT16 supported_screen_heights[4] = { 262, 312, 328, 342 };
static ADDRESS_MAP_START(a2600_mem, AS_PROGRAM, 8, a2600_state )
ADDRESS_MAP_GLOBAL_MASK(0x1fff)
static ADDRESS_MAP_START(a2600_mem, AS_PROGRAM, 8, a2600_state ) // 6507 has 13-bit address space, 0x0000 - 0x1fff
AM_RANGE(0x0000, 0x007f) AM_MIRROR(0x0f00) AM_DEVREADWRITE("tia_video", tia_video_device, read, write)
AM_RANGE(0x0080, 0x00ff) AM_MIRROR(0x0d00) AM_RAM AM_SHARE("riot_ram")
AM_RANGE(0x0280, 0x029f) AM_MIRROR(0x0d00) AM_DEVICE("riot", mos6532_t, io_map)
@ -391,7 +390,7 @@ MACHINE_START_MEMBER(a2600_state,a2600)
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0000, 0x0fff, read8_delegate(FUNC(a2600_state::cart_over_all_r), this), write8_delegate(FUNC(a2600_state::cart_over_all_w), this));
break;
case A26_DPCPLUS:
case A26_HARMONY:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
break;
}
@ -528,7 +527,7 @@ static SLOT_INTERFACE_START(a2600_cart)
SLOT_INTERFACE_INTERNAL("a26_8in1", A26_ROM_8IN1)
SLOT_INTERFACE_INTERNAL("a26_32in1", A26_ROM_32IN1)
SLOT_INTERFACE_INTERNAL("a26_x07", A26_ROM_X07)
SLOT_INTERFACE_INTERNAL("a26_dpcplus", A26_ROM_DPCPLUS)
SLOT_INTERFACE_INTERNAL("a26_harmony", A26_ROM_HARMONY)
SLOT_INTERFACE_END
static MACHINE_CONFIG_FRAGMENT(a2600_cartslot)
@ -541,7 +540,7 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_START( a2600, a2600_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6502, MASTER_CLOCK_NTSC / 3) /* actually M6507 */
MCFG_CPU_ADD("maincpu", M6507, MASTER_CLOCK_NTSC / 3)
MCFG_M6502_DISABLE_DIRECT()
MCFG_CPU_PROGRAM_MAP(a2600_mem)
@ -581,7 +580,7 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_START( a2600p, a2600_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6502, MASTER_CLOCK_PAL / 3) /* actually M6507 */
MCFG_CPU_ADD("maincpu", M6507, MASTER_CLOCK_PAL / 3)
MCFG_CPU_PROGRAM_MAP(a2600_mem)
MCFG_M6502_DISABLE_DIRECT()

View File

@ -3284,12 +3284,10 @@ MACHINE_CONFIG_END
/* B-Board 88621B-2 */
/*
These ROMs read from a dead and very unique top board. All EPROMs are type 27C1000, except LW_00.13C which is a 27C512.
There are 5 surface mounted ROMs each on it's own small 88621B-sub satellite board, type HN62404FP-18 package is QFP44.
There are 4 surface mounted ROMs each on it's own small 88621B-sub satellite board, type HN62404FP-18 package is QFP44.
The ROMs on the satellite boards are named and located as follows:
LW-02 @ 6B
LW-05 @ 6D
LW-08 @ 9B
LW-06 @ 9D
LW-07 @ 10G
@ -3301,6 +3299,82 @@ MACHINE_CONFIG_END
*/
/* Note that ROMs are labeled left to right, top to bottom, instead of top to bottom, left to right as usual. */
ROM_START( forgottn )
ROM_REGION( CODE_SIZE, "maincpu", 0 )
ROM_LOAD16_BYTE( "lw40.12f", 0x00000, 0x20000, CRC(73e920b7) SHA1(2df12fc1a66f488d06b0927db909da81466d7d07) ) /* Higher program numbers indicates a later revision */
ROM_LOAD16_BYTE( "lw41.12h", 0x00001, 0x20000, CRC(58210b9e) SHA1(416cb56a81e74fce6f86c2b2519ba620457b785a) ) /* 1 byte difference: 0x66D4 == 0x0C versus 0x04 in lw15.12h below */
ROM_LOAD16_BYTE( "lw42.13f", 0x40000, 0x20000, CRC(bea45994) SHA1(c419f65c5e0c11ae7508ec54412bf6b62fac4f72) )
ROM_LOAD16_BYTE( "lw43.13h", 0x40001, 0x20000, CRC(539b2339) SHA1(8a9e452ef8ed05e0b956d36990266657d3077470) )
ROM_LOAD16_WORD_SWAP( "lw-07.10g", 0x80000, 0x80000, CRC(fd252a26) SHA1(5cfb097984912a5167a8c7ec4c2e119b642f9970) ) // == lw-07.13e
ROM_REGION( 0x400000, "gfx", 0 )
ROMX_LOAD( "lw_2.2b", 0x000000, 0x20000, CRC(4bd75fee) SHA1(c27bfba951a0dc4f493937ceca335c50a1afeddf) , ROM_SKIP(7) ) // == lw-01.9d
ROMX_LOAD( "lw_1.2a", 0x000001, 0x20000, CRC(65f41485) SHA1(fb05dffc87ee2f2b1b6646d54b13671f8eee0429) , ROM_SKIP(7) ) // == lw-01.9d
ROMX_LOAD( "lw-08.9b", 0x000002, 0x80000, CRC(25a8e43c) SHA1(d57cee1fc508db2677e84882fb814e4d9ad20543) , ROM_GROUPWORD | ROM_SKIP(6) ) // == lw-08.9f
ROMX_LOAD( "lw_18.5e", 0x000004, 0x20000, CRC(b4b6241b) SHA1(92b6b530e18ce27ba8739ebba0d8096b1551026c) , ROM_SKIP(7) )
ROMX_LOAD( "lw_17.5c", 0x000005, 0x20000, CRC(c5eea115) SHA1(22fe692eaf9dd00a56a76f46c19fb76bb5e5f0d6) , ROM_SKIP(7) )
ROMX_LOAD( "lw_30.8h", 0x000006, 0x20000, CRC(b385954e) SHA1(d33adb5842e7b85d304836bd92a7a96be4ff3694) , ROM_SKIP(7) ) // == lw-12.9g
ROMX_LOAD( "lw_29.8f", 0x000007, 0x20000, CRC(7bda1ac6) SHA1(5b8bd05f52798f98ae16efa2ff61c06e28a4e3a0) , ROM_SKIP(7) ) // == lw-12.9g
ROMX_LOAD( "lw_4.3b", 0x100000, 0x20000, CRC(50cf757f) SHA1(c70d7d34ac2d6671d40dd372e241ccb60bf3bf2b) , ROM_SKIP(7) ) // == lw-01.9d
ROMX_LOAD( "lw_3.3a", 0x100001, 0x20000, CRC(c03ef278) SHA1(ad33b01bd8194025a2ecf7755894d6d638da457a) , ROM_SKIP(7) ) // == lw-01.9d
ROMX_LOAD( "lw_20.7e", 0x100004, 0x20000, CRC(df1a3665) SHA1(7ba9c0edc64d4f9a8563533ce723a0a748352a15) , ROM_SKIP(7) )
ROMX_LOAD( "lw_19.7c", 0x100005, 0x20000, CRC(15af8440) SHA1(5afd0e833593f1a78487af489fe4384ab68f52b1) , ROM_SKIP(7) )
ROMX_LOAD( "lw_32.9h", 0x100006, 0x20000, CRC(30967a15) SHA1(6f6c6ca2f40aa9beec63ed64f0571bebc7c1aa50) , ROM_SKIP(7) ) // == lw-12.9g
ROMX_LOAD( "lw_31.9f", 0x100007, 0x20000, CRC(c49d37fb) SHA1(ce400261a0f8d5a9b95d3823f8f52de87b8007f1) , ROM_SKIP(7) ) // == lw-12.9g
ROMX_LOAD( "lw-02.6b", 0x200000, 0x80000, CRC(43e6c5c8) SHA1(d3e6c971de0477ec4e178adc82508208dd8b397f) , ROM_GROUPWORD | ROM_SKIP(6) ) // == lw-02.12d
ROMX_LOAD( "lw_14.10b", 0x200002, 0x20000, CRC(82862cce) SHA1(727ca4ee55e076185b071a49afc87533fde9ec27) , ROM_SKIP(7) ) // == lw-09.12f
ROMX_LOAD( "lw_13.10a", 0x200003, 0x20000, CRC(b81c0e96) SHA1(09f4235786b8ff92a57112669c0385b64477eb01) , ROM_SKIP(7) ) // == lw-09.12f
ROMX_LOAD( "lw-06.9d", 0x200004, 0x80000, CRC(5b9edffc) SHA1(6fd8f4a3ab070733b52365ab1945bf86acb2bf62) , ROM_GROUPWORD | ROM_SKIP(6) ) // == lw-06.12e
ROMX_LOAD( "lw_26.10e", 0x200006, 0x20000, CRC(57bcd032) SHA1(6db0f96fb909ed02fe4b7ee25fe662ea23f884d2) , ROM_SKIP(7) ) // == lw-13.12g
ROMX_LOAD( "lw_25.10c", 0x200007, 0x20000, CRC(bac91554) SHA1(52f5de144193e0f78b9824cc8fd6f934dc19bab0) , ROM_SKIP(7) ) // == lw-13.12g
ROMX_LOAD( "lw_16.11b", 0x300002, 0x20000, CRC(40b26554) SHA1(b4b27573d6c329bc2bc4c64fd857475bf2a10877) , ROM_SKIP(7) ) // == lw-09.12f
ROMX_LOAD( "lw_15.11a", 0x300003, 0x20000, CRC(1b7d2e07) SHA1(0edf4d4b314fd9c29e7915d5d1adef6f9617f921) , ROM_SKIP(7) ) // == lw-09.12f
ROMX_LOAD( "lw_28.11e", 0x300006, 0x20000, CRC(a805ad30) SHA1(baded4ab5fe4e87d53233b5df88edc693c292fc4) , ROM_SKIP(7) ) // == lw-13.12g
ROMX_LOAD( "lw_27.11c", 0x300007, 0x20000, CRC(103c1bd2) SHA1(fc7ce74e108c30554139e55651c5348b11e9e3bd) , ROM_SKIP(7) ) // == lw-13.12g
ROM_REGION( 0x8000, "stars", 0 )
ROM_COPY( "gfx", 0x200000, 0x000000, 0x8000 )
ROM_REGION( 0x18000, "audiocpu", 0 )
ROM_LOAD( "lw_37.13c", 0x00000, 0x08000, CRC(59df2a63) SHA1(dfe1fffc7a17179a80a2ae623e93b30a7d6df20d) ) // == lw_00b.13c
ROM_CONTINUE( 0x10000, 0x08000 )
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
ROM_LOAD( "lw-03u.12e", 0x00000, 0x20000, CRC(807d051f) SHA1(720e4733787b9b11f4d1cdce0892b69475802844) ) // == lw-03u.14c
ROM_LOAD( "lw-04u.13e", 0x20000, 0x20000, CRC(e6cd098e) SHA1(667f6e5736f76a1c4c450c4e2035574ea89d7910) ) // == lw-04u.13c
ROM_REGION( 0x0200, "aboardplds", 0 )
ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) )
ROM_LOAD( "ioa1", 0x0000, 0x0117, CRC(59c7ee3b) SHA1(fbb887c5b4f5cb8df77cec710eaac2985bc482a6) )
ROM_LOAD( "prg1", 0x0000, 0x0117, CRC(f1129744) SHA1(a5300f301c1a08a7da768f0773fa0fe3f683b237) )
ROM_LOAD( "rom1", 0x0000, 0x0117, CRC(41dc73b9) SHA1(7d4c9f1693c821fbf84e32dd6ef62ddf14967845) )
ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) )
ROM_REGION( 0x0200, "bboardplds", 0 )
ROM_LOAD( "lw621.1a", 0x0000, 0x0117, CRC(5eec6ce9) SHA1(5ec8b60f1f1bdba865b1fa2387987ce99ff4093a) )
ROM_LOAD( "lwio.12b", 0x0000, 0x0117, CRC(ad52b90c) SHA1(f0fd6aeea515ee449320fe15684e6b3ab7f97bf4) )
ROM_END
/* B-Board 88621B-2 */
/*
These ROMs read from a dead and very unique top board. All EPROMs are type 27C1000, except LW_00.13C which is a 27C512.
There are 5 surface mounted ROMs each on it's own small 88621B-sub satellite board, type HN62404FP-18 package is QFP44.
The ROMs on the satellite boards are named and located as follows:
LW-02 @ 6B
LW-05 @ 6D (instead of LW_17.5C, LW_18.5E, LW_19.7C & LW_20.7E as above)
LW-08 @ 9B
LW-06 @ 9D
LW-07 @ 10G
Also known to have LW-13 @ 10D instead of LW_25.10C, LW_26.10E, LW_27.11C & LW_28.11E
OTHER:
2 PALs labeled LW621 (near LW_1.2A) and LWI0 (near LW_00.13C)
Custom chip - CAPCOM CPS-B-01 (QFP160)
NEC D4701AC
*/
/* Note that ROMs are labeled left to right, top to bottom, instead of top to bottom, left to right as usual. */
ROM_START( forgottna )
ROM_REGION( CODE_SIZE, "maincpu", 0 )
ROM_LOAD16_BYTE( "lw11.12f", 0x00000, 0x20000, CRC(73e920b7) SHA1(2df12fc1a66f488d06b0927db909da81466d7d07) )
ROM_LOAD16_BYTE( "lw15.12h", 0x00001, 0x20000, CRC(50d7012d) SHA1(f82a28a835f0a83b26c2c8170b824447b1d7409f) )
@ -11748,7 +11822,8 @@ WRITE16_MEMBER( cps_state::sf2m3_layer_w )
/*************************************************** Game Macros *****************************************************/
GAME( 1988, forgottn, 0, cps1_10MHz, forgottn, cps_state, forgottn, ROT0, "Capcom", "Forgotten Worlds (World)", MACHINE_SUPPORTS_SAVE ) // (c) Capcom U.S.A. but World "warning"
GAME( 1988, forgottn, 0, cps1_10MHz, forgottn, cps_state, forgottn, ROT0, "Capcom", "Forgotten Worlds (World, newer)", MACHINE_SUPPORTS_SAVE ) // (c) Capcom U.S.A. but World "warning"
GAME( 1988, forgottna, forgottn, cps1_10MHz, forgottn, cps_state, forgottn, ROT0, "Capcom", "Forgotten Worlds (World)", MACHINE_SUPPORTS_SAVE ) // (c) Capcom U.S.A. but World "warning"
GAME( 1988, forgottnu, forgottn, cps1_10MHz, forgottn, cps_state, forgottn, ROT0, "Capcom", "Forgotten Worlds (USA, B-Board 88621B-2, Rev. C)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, forgottnu1, forgottn, cps1_10MHz, forgottn, cps_state, forgottn, ROT0, "Capcom", "Forgotten Worlds (USA, B-Board 88618B-2, Rev. C)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, forgottnua, forgottn, cps1_10MHz, forgottn, cps_state, forgottn, ROT0, "Capcom", "Forgotten Worlds (USA, B-Board 88618B-2, Rev. A)", MACHINE_SUPPORTS_SAVE )

View File

@ -3172,7 +3172,7 @@ GAME( 1998, ehrgeiz, 0, coh700, namcos12, namcos12_state, namcos12, R
GAME( 1998, ehrgeizaa, ehrgeiz, coh700, namcos12, namcos12_state, namcos12, ROT0, "Square / Namco", "Ehrgeiz (Asia, EG2/VER.A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) /* KC021 */
GAME( 1998, ehrgeizja, ehrgeiz, coh700, namcos12, namcos12_state, namcos12, ROT0, "Square / Namco", "Ehrgeiz (Japan, EG1/VER.A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) /* KC021 */
GAME( 1998, mdhorse, 0, coh700, namcos12, namcos12_state, namcos12, ROT0, "MOSS / Namco", "Derby Quiz My Dream Horse (Japan, MDH1/VER.A2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) /* KC035 */
GAME( 1998, aplarail, 0, aplarail, aplarail, namcos12_state, namcos12, ROT0, "Namco / Tomy", "Attack Pla Rail (Japan, AP1/VER.A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) /* KC032 */
GAME( 1998, aplarail, 0, aplarail, aplarail, namcos12_state, namcos12, ROT0, "Namco / Tomy", "Attack Pla Rail (Japan, AP1/VER.A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) /* KC032 */
GAME( 1998, sws98, 0, coh700, namcos12, namcos12_state, namcos12, ROT0, "Namco", "Super World Stadium '98 (Japan, SS81/VER.A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) /* KC0?? */
GAME( 1998, technodr, 0, technodr, technodr, namcos12_state, namcos12, ROT0, "Namco", "Techno Drive (Japan, TD2/VER.B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) /* KC056 */
GAME( 1998, tenkomor, 0, coh700, namcos12, namcos12_state, namcos12, ROT90,"Namco", "Tenkomori Shooting (Asia, TKM2/VER.A1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) /* KC036 */

View File

@ -294,6 +294,229 @@ CPU68 PCB:
JP2 /D-ST /VBL
JP3
*****************************
Winning Run / Winning Run Suzuka GP/ Winning Run 91
Namco 1988-91
These games run on Namco System 21 hardware. Note each set of PCBs for System 21 games are slightly different,
with some common PCBs and some unique-to-that-game PCBs. This covers the Winning Run series.
The PCBs are housed in a metal box. The front has a small filter board containing a 60-pin flat cable connector.
Underneath is a connector that plugs into PCB #3.
Inside at the bottom is a small MOTHER PCB containing 8 connectors where the PCBs plug in and the power input connector.
On Winning Run there is an additional PCB for the controls and cabinet motion.
The PAL labels suggest it was originally used with Metal Hawk. It may be used with other games too.
PCB Layouts
-----------
In the layouts below, the jumpers set the ROM type.
If horizontally shorted the ROM type is 27C101
If vertically shorted the ROM type is 27C301/27C1001
ROM labels/locations shown are printed on the PCB. Not all ROM positions are used.
See the ROM loading below (per game) for ROM usage and actual label names.
PCB#1 (top):
2252960601
(2252970601)
|--------------------------------------------------------------|
| POINT3L.7P POINT3U.5P DIP28_SOCKET(2P) |
| POINT2L.7N POINT2U.5N |-------| |
| JP5 O=O JP6 O=O | TMS | 40MHz |
| O=O 0=0 |320C25 | |
| POINT1U.8L MB8422 |-------| |
| PAL16L8 MB81C69 MB81C69 |
| POINT0U.8J MB8422 (WR-D2.4J) |
| MB81C69 MB81C69 |
| |
| |
|JP3 O=O |
| O=O |
| POINT1L.2E MB8422 62256 62256 |
| |
| POINT0L.8D MB8422 |
|JP4 O=O |
| O=O |
| |
| |
| PAL16L8 |
| (WR-D1.3B) |
| |
| |
|----|----------------------|----|------------------------|----|
|----------------------| |------------------------|
PCB#2 (2nd down):
2252960701
(2252970701)
|--------------------------------------------------------------|
| |
| 62256 62256 C157 C157 M5M5178 |
| |
| 62256 62256 C157 C157 M5M5178 |
| |
| 62256 62256 C157 C157 62256 |
| C150 |
| 62256 62256 C157 C157 62256 |
| |
| C157 C157 |
| |
| C157 C157 62256 |
| |-------| |-------| |-------| |
| |L7A0080| |L7A0080| |L7A0081| M5M5178 62256 |
| |110FAI | |110FAI | |111MUR | |
| |-------| |-------| |-------| M5M5178 62256 |
| |
| 2018 2018 |---------| 62256 |
| 20MHz | | |
| 2018 2018 2018 | C167 | |
| C157 C157 | | PAL16L8 |
| C157 C157 |---------| (WR-P1.1B)|
| |
|----|----------------------|----|------------------------|----|
|----------------------| |------------------------|
PCB#3 (3rd down):
2252960101
(2252970101) RGB_CABLE |------------------------|
|--------------------||||||------|------------------------|----|
| TL084C |---| MB3771 |
| MB87077 LB1760 |C65| PAL16L8 PC910 PC900|
|MB87077 34063 |---| (SYS87B-2.3W) |
|TL084C TL084C DSW1(8) M5M5179 |
|LC7880 YM3012 PAL12L10 SYS2C65C.5P |----| |
|MB8464 YM2151 (WR-C1.5P) |C139| |
| |----| C137 3.579545MHz HN58C65 |----| |
| |C121| 49.152MHz 8422 C149 |
| |----| PAL12L10 65256 65256 |
| (WR-C2.8K) |
| 2018 2018 62256 62256 MPRU.3K MPRL.1K |
| |
| VOI3.11E MB8464 68000 |
| |
| VOI2.11D |------| SND1.7D C148 C148 DATA3U.3D DATA3L.1D|
| | C140 | |
| VOI1.11C |------| SND0.7C 65256 65256 DATA2U.3C DATA2L.1C|
| |
| VOI0.11B 6809 SPRU.6B SPRL.4B DATA1U.3B DATA1L.1B|
| JP3 JP1 |
| O=O 68000 OO DATA0U.3A DATAOL.1A|
| O=O || |
| OO |
|----|----------------------|----|------------------------|----|
|----------------------| |------------------------|
PCB#4 (bottom):
2252960401
(2252970401) RGB_CABLE
|--------------------||||||------------------------------------|
| |
| |----| |----| |
| |C164| |C148| 68000 |
| |----| |----| |
| MB3771 |
| PAL20V8 62256 62256 |
| (WR-G3.4S) |
| 62256 GDT1L.3S GDT1U.1S |
| MB81461 MB81461 JP10 O-O JP9 OO|
| 62256 PAL16L8 GDT0L.3P GDT0U.1P |||
| MB81461 MB81461 (WR-G2.4P) OO|
| 62256 GPR1L.3L GPR1U.1L |
| MB81461 MB81461 J J J JP8 OO|
| P P P GPR0L.3J GPR0U.1J |||
| MB81461 MB81461 |----| 6 5 4 OO|
| |C138| O|O|O| JP12 |
| MB81461 MB81461 |----| O|O|O| O| JP7 OO|
| PAL16L8 O O O O| MB8422 |||
| MB81461 MB81461 (WR-G4.7L) 49.152MHz O OO|
| C165 MB8422 |
| MB81461 MB81461 38.808MHz |
| PAL16L8 |
| MB81461 MB81461 (WR-G1.3A) |
|----|----------------------|----|------------------------|----|
|----------------------| |------------------------|
I/O & Drive Board For Motion Cabinet
------------------------------------
2286964100 (2286974100)
|--------------------------------|
|SW2 SW1 8255 8251 TLP521 |
|DSW(6) EMPTY_SOCKET |
| 4.9152MHz |
|RESET MB3773 ADC0809 J201|
| 68B09 EMPTY_SOCKET |
| WR_DR1.5A S1WB |
| 8464 LM324 |
| TLP521 |
| PAL20L10 S2VB |
|(MH1-DR2) A490 J205|
| A490 |
|J206 TLP511 |
| 8253 PAL14H8 TLP511|
|TLP511 (MH1-DR3) |
| J204 J202 J203 |
|TLP511 |
|BCR16DM BCR16DM BCR16DM BCR16DM |
|--------------------------------|
Notes:
J201 - 50 pin flat cable connector for controls
J202 - 6 pin Power connector
J203 - 2-pin Power connector
J204 - 3-pin Power connector
J205 - 4-pin connector for DC feedback motor
J206 - 5-pin connector for main board communication
S1WB - Bridge Rectifier
S2VB - Bridge Rectifier
A490 - Transistor
BCR16DM - Transistor
TLP511 - Toshiba TLP511 GAAS Infrared & Photo Thyristor
TLP521 - Toshiba TLP521 Programmable Controller AC/DC-Input Module Solid State Relay
8255 - Mitsubishi M5L8255AP-5 Programmable Peripheral Interface
8251 - Mitsubishi M5L8251AP-5 Programmable Communication Interface
8253 - Mitsubishi M5L8253P-5 Programmable Interval Timer
ADC0809 - National Semiconductor ADC0809CCN 8-Bit Microprocessor Compatible A/D Converters with 8-Channel Multiplexer
68B09 - Hitachi HD68B09EP CPU
8464 - 8k x8-bit SRAM
LM324 - National Semiconductor LM324 General Purpose Operational Amplifier
MB3773 - Fujitsu MB3773 Power Supply Monitor with Watch-Dog Timer
Slot PCB
--------
2252960502 (2252970502)
V21 MOTHER PCB
|--------------------------------------------------------------|
| PWR_CONN |
| |--------SLOT1---------| |---------SLOT5----------| |
| |--------SLOT2---------| |---------SLOT6----------| |
| |--------SLOT3---------| |---------SLOT7----------| |
| |--------SLOT4---------| |---------SLOT8----------| |
|--------------------------------------------------------------|
Filter Board
------------
2252960801 (2252970801)
|--------------------------------|
| |----------------------| |
| |----------------------| |
| |
|-------|60-PIN FLAT CABLE|------|
|-------CONN------|
****************************
*/
#include "emu.h"
#include "cpu/m68000/m68000.h"

View File

@ -128,8 +128,8 @@ Sega NAOMI Mainboard PCB Layout
| LED2 14.7456MHz |
|---------------------------------------------------|
Notes:
SH4 - Hitachi SH4 CPU (BGAxxx, with heatsink)
POWERVR2 - NEC POWERVR2 Video Generator IC (large BGAxxx, with heatsink and fan)
SH4 - Hitachi HD6417091 SH4 CPU (BGAxxx, with heatsink)
POWERVR2 - VideoLogic/NEC 'CLX2/HOLLY' chipset and PowerVR2 GPU (large BGAxxx, with heatsink and fan)
EPF8452AQC160-3 - Altera FLEX EPF8452AQC160-3 FPGA (QFP160)
93C46 - 128 bytes serial EEPROM (SOIC8)
BIOS.IC27 - 27C160 EPROM (DIP42)
@ -137,10 +137,10 @@ EPF8452AQC160-3 - Altera FLEX EPF8452AQC160-3 FPGA (QFP160)
HY57V161610 - Hynix HY57V161610DTC-8 512k x 16-bit x 2-banks (16Mbit) SDRAM (TSOPII-50)
KM416S4030 - Samsung KM416S4030 1M x 16-bit x 4 Banks SDRAM (TSOPII-54)
62256 - 32k x8-bit SRAM (SOP28)
315-6145 - Sega Custom IC (QFP56)
315-6146 - Sega Custom IC (QFP176)
315-6145 - video DAC/encoder, BU1426KS equivalent (QFP56)
315-6146 - Sega Custom Z80-based MCU (QFP176)
315-6188 - Altera EPC1064PC8 FPGA Configuration Device with sticker '315-6188' at IC31 (DIP8)
315-6232 - Sega Custom IC (QFP100)
315-6232 - Yamaha AICA SPU (QFP100)
CY2308SC-3 - Cypress CY2308SC-3 2-Bank 4-Output Tri-state PLL Programmable Clock Generator IC with 2X or 4X outputs and Zero Delay Buffer (SOIC16)
C844 - NEC uPC844 Quad Operational Amplifier (SOIC14)
A179B - TI SN75179B Differential Driver and Receiver Pair (DIP8)
@ -184,7 +184,7 @@ Sega NAOMI 2 Mainboard PCB Layout
| LED2 LED1 *CY2308 CY2292 3773|
|---------------------------------------------------|
Notes: (* - these parts on other side of PCB)
SH4 - Hitachi SH4 CPU (BGAxxx, with heatsink)
SH4 - Hitachi HD6417091 SH4 CPU (BGAxxx, with heatsink)
BIOS.IC27 - 27C160 EPROM (DIP42)
EPF8452 - Altera FLEX EPF8452AQC160-3 FPGA (QFP160)
93C46 - 128 bytes serial EEPROM (SOIC8)
@ -192,14 +192,14 @@ Notes: (* - these parts on other side of PCB)
16M - Hynix HY57V161610DTC-8 512k x 16-bit x 2-banks (16Mbit) SDRAM (TSOP-II 50)
64M - NEC D4564323 512k x 32-bit x 4-banks (64Mbit) SDRAM (TSOP-II 86)
62256 - 32k x8-bit SRAM (SOP28)
315-6146 - Sega Custom IC (QFP176)
315-6146 - Sega Custom Z80-based MCU (QFP176)
315-6188 - Altera EPC1064PC8 FPGA Configuration Device with sticker '315-6188' at IC31 (DIP8)
315-6232 - Sega Custom IC (QFP100)
315-6258 - Sega Custom IC (QFP56)
315-6267 - NEC POWER-VR2 Video Generator IC (large BGAxxx, with heatsink and fan, x2)
315-6232 - Yamaha AICA SPU (QFP100)
315-6258 - video DAC/encoder, BU1426KS equivalent (QFP56, x2)
315-6267 - VideoLogic/NEC 'CLX2/HOLLY' chipset and PowerVR2 GPU (large BGAxxx, with heatsink and fan, x2)
315-6268 - Altera EPM7032AELC44-10 CPLD with sticker '315-6268' (PLCC44)
315-6269 - Altera MAX EPM7064AETC100-10 CPLD with sticker '315-6269' (TQFP100)
315-6289 - Sega custom IC (large BGAxxx, with heatsink)
315-6289 - VideoLogic/NEC 'ELAN' T&L coprocessor (large BGAxxx, with heatsink)
MC33470 - ON Semiconductor MC33470 Synchronous Rectification DC/DC Converter Programmable Integrated Controller (SOIC20)
CY2308 - Cypress CY2308SC-3 2-Bank 4-Output Tri-state PLL Programmable Clock Generator IC with 2X or 4X outputs and Zero Delay Buffer (SOIC16)
CY2292 - Cypress CY2292SL Three-PLL General-Purpose EPROM Programmable Clock Generator IC (SOIC16)

View File

@ -37,44 +37,65 @@ used, and the value on the data bus is completley ignored.
02 - Set BIT 9 signal (map bank 3 into F000-FFFF)
03 - Clear BIT 9 signal (map bank 1/2 into F000-FFFF)
Selecting between bank 1 and bank 2 is also affected by M1 and IRQACK
conditions using a set of three flipflops.
The serial speed configuration implements wiring changes recommended in the
Osborne 1 Technical Manual. There's no way for software to read the
selected baud rates, so it will always call the low speed "300" and the high
speed "1200". You as the user have to keep this in mind using the system.
Serial communications can be flaky when 600/2400 is selected. This is not a
bug in MAME. I've checked and double-checked the schematics to confirm it's
an original bug. The division ratio from the master clock to the baud rates
in this mode is effectively 16*24*64 or 16*24*16 giving actual data rates of
650 baud or 2600 baud, about 8.3% too fast (16*26*64 and 16*26*16 would give
the correct rates). MAME's bitbanger seems to be able to accept the ACIA
output at this rate, but the ACIA screws up when consuming data from MAME's
bitbanger.
TODO:
- Implement ROM/IO bank selection properly
- Implement serial port
- Implement reset key (generates NMI and affects bank selection)
- Verify frequency of the beep/audio alarm.
***************************************************************************/
#include "includes/osborne1.h"
#include "bus/rs232/rs232.h"
#define MAIN_CLOCK 15974400
static ADDRESS_MAP_START( osborne1_mem, AS_PROGRAM, 8, osborne1_state )
AM_RANGE( 0x0000, 0x0FFF ) AM_READ_BANK("bank1") AM_WRITE( osborne1_0000_w )
AM_RANGE( 0x1000, 0x1FFF ) AM_READ_BANK("bank2") AM_WRITE( osborne1_1000_w )
AM_RANGE( 0x2000, 0x3FFF ) AM_READWRITE( osborne1_2000_r, osborne1_2000_w )
AM_RANGE( 0x0000, 0x0FFF ) AM_READ_BANK("bank_0xxx") AM_WRITE(bank_0xxx_w)
AM_RANGE( 0x1000, 0x1FFF ) AM_READ_BANK("bank_1xxx") AM_WRITE(bank_1xxx_w)
AM_RANGE( 0x2000, 0x3FFF ) AM_READWRITE(bank_2xxx_3xxx_r, bank_2xxx_3xxx_w)
AM_RANGE( 0x4000, 0xEFFF ) AM_RAM
AM_RANGE( 0xF000, 0xFFFF ) AM_READ_BANK("bank3") AM_WRITE( osborne1_videoram_w )
AM_RANGE( 0xF000, 0xFFFF ) AM_READ_BANK("bank_fxxx") AM_WRITE(videoram_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( osborne1_op, AS_DECRYPTED_OPCODES, 8, osborne1_state )
AM_RANGE( 0x0000, 0xFFFF ) AM_READ(opcode_r)
ADDRESS_MAP_END
static ADDRESS_MAP_START( osborne1_io, AS_IO, 8, osborne1_state )
ADDRESS_MAP_UNMAP_HIGH
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE( 0x00, 0xff ) AM_WRITE( osborne1_bankswitch_w )
AM_RANGE( 0x00, 0xff ) AM_WRITE(bankswitch_w)
ADDRESS_MAP_END
static INPUT_PORTS_START( osborne1 )
PORT_START("ROW0")
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('[') PORT_CHAR(']')
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('[') PORT_CHAR(']')
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('\'') PORT_CHAR('"')
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t')
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
@ -150,21 +171,28 @@ static INPUT_PORTS_START( osborne1 )
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("RESET")
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("CNF")
PORT_CONFNAME(0x06, 0x00, "Serial Speed")
PORT_CONFSETTING(0x00, "300/1200")
PORT_CONFSETTING(0x02, "600/2400")
PORT_CONFSETTING(0x04, "1200/4800")
PORT_CONFSETTING(0x06, "2400/9600")
PORT_CONFNAME(0x01, 0x00, "Video Output")
PORT_CONFSETTING(0x00, "Standard")
PORT_CONFSETTING(0x01, "SCREEN-PAC")
INPUT_PORTS_END
static const z80_daisy_config osborne1_daisy_chain[] =
{
/* { osborne1_z80_reset, osborne1_z80_irq_state, osborne1_z80_irq_ack, osborne1_z80_irq_reti, 0 }, */
{ "osborne1_daisy" },
{ NULL }
};
/*
* The Osborne-1 supports the following disc formats:
* - Osborne single density: 40 tracks, 10 sectors per track, 256-byte sectors (100 KByte)
@ -176,37 +204,36 @@ static const z80_daisy_config osborne1_daisy_chain[] =
*/
static SLOT_INTERFACE_START( osborne1_floppies )
SLOT_INTERFACE( "525sssd", FLOPPY_525_SSSD ) // Siemens FDD 100-5, custom Osborne electronics
SLOT_INTERFACE( "525ssdd", FLOPPY_525_SSDD ) // MPI 52(?), custom Osborne electronics
SLOT_INTERFACE("525sssd", FLOPPY_525_SSSD) // Siemens FDD 100-5, custom Osborne electronics
SLOT_INTERFACE("525ssdd", FLOPPY_525_SSDD) // MPI 52(?), custom Osborne electronics
SLOT_INTERFACE_END
/* F4 Character Displayer */
static const gfx_layout osborne1_charlayout =
{
8, 10, /* 8 x 10 characters */
128, /* 128 characters */
1, /* 1 bits per pixel */
{ 0 }, /* no bitplanes */
/* x offsets */
8, 10, // 8 x 10 characters
128, // 128 characters
1, // 1 bits per pixel
{ 0 }, // no bitplanes
// x offsets
{ 0, 1, 2, 3, 4, 5, 6, 7 },
/* y offsets */
// y offsets
{ 0*128*8, 1*128*8, 2*128*8, 3*128*8, 4*128*8, 5*128*8, 6*128*8, 7*128*8, 8*128*8, 9*128*8 },
8 /* every char takes 16 x 1 bytes */
8 // every char takes 16 x 1 bytes
};
static GFXDECODE_START( osborne1 )
GFXDECODE_ENTRY( "chargen", 0x0000, osborne1_charlayout, 0, 1 )
GFXDECODE_ENTRY("chargen", 0x0000, osborne1_charlayout, 0, 1)
GFXDECODE_END
static MACHINE_CONFIG_START( osborne1, osborne1_state )
MCFG_CPU_ADD( "maincpu", Z80, MAIN_CLOCK/4 )
MCFG_CPU_PROGRAM_MAP( osborne1_mem)
MCFG_CPU_IO_MAP( osborne1_io)
MCFG_CPU_CONFIG( osborne1_daisy_chain )
MCFG_DEVICE_ADD( "osborne1_daisy", OSBORNE1_DAISY, 0 )
MCFG_CPU_ADD("maincpu", Z80, MAIN_CLOCK/4)
MCFG_CPU_PROGRAM_MAP(osborne1_mem)
MCFG_CPU_DECRYPTED_OPCODES_MAP(osborne1_op)
MCFG_CPU_IO_MAP(osborne1_io)
MCFG_Z80_SET_IRQACK_CALLBACK(WRITELINE(osborne1_state, irqack_w))
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_UPDATE_DRIVER(osborne1_state, screen_update)
@ -228,12 +255,23 @@ static MACHINE_CONFIG_START( osborne1, osborne1_state )
MCFG_PIA_CB2_HANDLER(DEVWRITELINE(IEEE488_TAG, ieee488_device, ren_w))
MCFG_PIA_IRQA_HANDLER(WRITELINE(osborne1_state, ieee_pia_irq_a_func))
MCFG_DEVICE_ADD( "pia_1", PIA6821, 0)
MCFG_DEVICE_ADD("pia_1", PIA6821, 0)
MCFG_PIA_WRITEPA_HANDLER(WRITE8(osborne1_state, video_pia_port_a_w))
MCFG_PIA_WRITEPB_HANDLER(WRITE8(osborne1_state, video_pia_port_b_w))
MCFG_PIA_CB2_HANDLER(WRITELINE(osborne1_state, video_pia_out_cb2_dummy))
MCFG_PIA_IRQA_HANDLER(WRITELINE(osborne1_state, video_pia_irq_a_func))
MCFG_DEVICE_ADD("acia", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd))
MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(osborne1_state, serial_acia_irq_func))
MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, NULL)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia", acia6850_device, write_rxd))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("acia", acia6850_device, write_dcd))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("acia", acia6850_device, write_cts))
MCFG_RS232_RI_HANDLER(DEVWRITELINE("pia_1", pia6821_device, ca2_w))
MCFG_DEVICE_ADD("mb8877", MB8877, MAIN_CLOCK/16)
MCFG_WD_FDC_FORCE_READY
MCFG_FLOPPY_DRIVE_ADD("mb8877:0", osborne1_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
@ -243,9 +281,9 @@ static MACHINE_CONFIG_START( osborne1, osborne1_state )
MCFG_IEEE488_SRQ_CALLBACK(DEVWRITELINE("pia_0", pia6821_device, ca2_w))
MCFG_SOFTWARE_LIST_ADD("flop_list","osborne1")
/* internal ram */
// internal ram
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("68K") /* 64KB Main RAM and 4Kbit video attribute RAM */
MCFG_RAM_DEFAULT_SIZE("68K") // 64bB main RAM and 4kbit video attribute RAM
MACHINE_CONFIG_END

View File

@ -1946,7 +1946,7 @@ PayTable 10s+ 2PR 3K STR FL FH 4K SF RF (Bonus)
ROM_LOAD( "pp0045_a45-a74.u68", 0x00000, 0x10000, CRC(9c7cf6d7) SHA1(3da9829678b853d85146b66b40800257a8eaa151) ) /* Game Version: A45, Library Version: A74 */
ROM_REGION( 0x020000, "gfx1", 0 )
ROM_LOAD( "mro-cg1072.u72", 0x00000, 0x8000, CRC(8e5cf3bf) SHA1(a8c2fde9105a37eddc218ae1476cdbfb0271e314) ) /* Custom Annie Oakely's Central City graphics */
ROM_LOAD( "mro-cg1072.u72", 0x00000, 0x8000, CRC(8e5cf3bf) SHA1(a8c2fde9105a37eddc218ae1476cdbfb0271e314) ) /* Custom Annie Oakley's Central City graphics */
ROM_LOAD( "mgo-cg1072.u73", 0x08000, 0x8000, CRC(a3c85c1b) SHA1(9b810c5779dde21db6da5bac5cf797bad65c2c1b) )
ROM_LOAD( "mbo-cg1072.u74", 0x10000, 0x8000, CRC(833371e1) SHA1(5d7a994aee61a751f89171885423276b86e872b6) ) /* These graphics will work for many other standard poker sets */
ROM_LOAD( "mxo-cg1072.u75", 0x18000, 0x8000, CRC(0df703b3) SHA1(2042251cc9c11687ff7fd920213a448974ff3050) ) /* However there is no support for Deuces Wild sets */
@ -1956,6 +1956,27 @@ PayTable 10s+ 2PR 3K STR FL FH 4K SF RF (Bonus)
ROM_LOAD( "cap740.u50", 0x0000, 0x0100, CRC(6fe619c4) SHA1(49e43dafd010ce0fe9b2a63b96a4ddedcb933c6d) ) /* BPROM type DM74LS471 (compatible with N82S135N) verified */
ROM_END
ROM_START( pepp0045d ) /* Normal board : 10's or Better (PP0045) */
/*
PayTable 10s+ 2PR 3K STR FL FH 4K SF RF (Bonus)
----------------------------------------------------------
P8A 1 1 3 4 5 8 25 50 300 800
% Range: 84.6-86.6% Optimum: 88.6% Hit Frequency: 49.2%
Programs Available: PP0045, X000045P
*/
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "pp0045_a45-a74.u68", 0x00000, 0x10000, CRC(9c7cf6d7) SHA1(3da9829678b853d85146b66b40800257a8eaa151) ) /* Game Version: A45, Library Version: A74 */
ROM_REGION( 0x020000, "gfx1", 0 )
ROM_LOAD( "mro-cg881.u72", 0x00000, 0x8000, CRC(282a029f) SHA1(42b35761839d6379ddfb4eed20f90d9f7b145e64) ) /* Custom Las Vegas Rio graphics */
ROM_LOAD( "mgo-cg881.u73", 0x08000, 0x8000, CRC(af433702) SHA1(fbd877c06eaab433332c94f135e13a8c041fa1a2) )
ROM_LOAD( "mbo-cg881.u74", 0x10000, 0x8000, CRC(c5b0a0b3) SHA1(a989d21f4b10a09d3cfd0bbb9f53b4ad326561b9) ) /* These graphics will work for many other standard poker sets */
ROM_LOAD( "mxo-cg881.u75", 0x18000, 0x8000, CRC(6a78bc1d) SHA1(7861465ab98df5219330d58a3e5a4bd37a393534) ) /* However there is no support for Deuces Wild sets */
ROM_REGION( 0x100, "proms", 0 )
ROM_LOAD( "cap881.u50", 0x0000, 0x0100, CRC(e51990d5) SHA1(41946722b61e955d37808761d451fc894e6adc8a) )
ROM_END
ROM_START( pepp0046 ) /* Normal board : 10's or Better (PP0046) */
/*
PayTable 10s+ 2PR 3K STR FL FH 4K SF RF (Bonus)
@ -10832,6 +10853,7 @@ GAMEL(1987, pepp0045, pepp0002, peplus, peplus_poker, peplus_state, peplus,
GAMEL(1987, pepp0045a, pepp0002, peplus, peplus_poker, peplus_state, peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (PP0045) 10's or Better (Gambler Downtown Reno)", 0, layout_pe_poker )
GAMEL(1987, pepp0045b, pepp0002, peplus, peplus_poker, peplus_state, peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (PP0045) 10's or Better (Par-A-Dice Riverboat Casino)", MACHINE_WRONG_COLORS, layout_pe_poker ) /* CAP1150 not dumped */
GAMEL(1987, pepp0045c, pepp0002, peplus, peplus_poker, peplus_state, peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (PP0045) 10's or Better (Annie Oakley's Central City)", MACHINE_WRONG_COLORS, layout_pe_poker ) /* CAP1072 not dumped */
GAMEL(1987, pepp0045d, pepp0002, peplus, peplus_poker, peplus_state, peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (PP0045) 10's or Better (Las Vegas Rio)", 0, layout_pe_poker )
GAMEL(1987, pepp0046, pepp0002, peplus, peplus_poker, peplus_state, peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (PP0046) 10's or Better (set 1)", 0, layout_pe_poker )
GAMEL(1987, pepp0046a, pepp0002, peplus, peplus_poker, peplus_state, peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (PP0046) 10's or Better (International)",0, layout_pe_poker )
GAMEL(1987, pepp0046b, pepp0002, peplus, peplus_poker, peplus_state, nonplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (PP0046) 10's or Better (set 2)", 0, layout_pe_poker )

View File

@ -191,7 +191,8 @@ READ8_MEMBER( super6_state::fdc_r )
*/
fatalerror("Z80 WAIT not supported by MAME core\n");
// don't crash please... but it's true, WAIT does nothing in our Z80
//fatalerror("Z80 WAIT not supported by MAME core\n");
m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE);
return !m_fdc->intrq_r() << 7;
@ -217,13 +218,16 @@ WRITE8_MEMBER( super6_state::fdc_w )
6
7
Codes passed to here during boot are 0x00, 0x08, 0x38
*/
// disk drive select
floppy_image_device *m_floppy = NULL;
if (BIT(data, 0)) m_floppy = m_floppy0->get_device();
if (BIT(data, 1)) m_floppy = m_floppy1->get_device();
if ((data & 3) == 0)
m_floppy = m_floppy0->get_device();
if ((data & 3) == 1)
m_floppy = m_floppy1->get_device();
m_fdc->set_floppy(m_floppy);
if (m_floppy) m_floppy->mon_w(0);

View File

@ -1,5 +1,5 @@
// license:BSD-3-Clause
// copyright-holders:Curt Coder
// copyright-holders:Curt Coder, Robbbert
/*
Osborne 4 Vixen
@ -47,9 +47,6 @@ Notes:
TODO:
- video line buffer
- floppy
- keyboard
- RS232 RI interrupt
- PCB layouts
@ -76,17 +73,17 @@ void vixen_state::update_interrupt()
}
//-------------------------------------------------
// ctl_w - command write
//-------------------------------------------------
WRITE8_MEMBER( vixen_state::ctl_w )
READ8_MEMBER( vixen_state::opram_r )
{
logerror("CTL %u\n", data);
membank("bank3")->set_entry(BIT(data, 0));
membank("bank3")->set_entry(0); // read videoram
return m_program->read_byte(offset);
}
READ8_MEMBER( vixen_state::oprom_r )
{
membank("bank3")->set_entry(1); // read rom
return m_rom[offset];
}
//-------------------------------------------------
// status_r - status read
@ -256,12 +253,20 @@ READ8_MEMBER( vixen_state::port3_r )
// ADDRESS_MAP( vixen_mem )
//-------------------------------------------------
// when M1 is inactive: read and write of data
static ADDRESS_MAP_START( vixen_mem, AS_PROGRAM, 8, vixen_state )
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x0000, 0xefff) AM_READ_BANK("bank1") AM_WRITE_BANK("bank2")
AM_RANGE(0x0000, 0xefff) AM_RAM
AM_RANGE(0xf000, 0xffff) AM_READ_BANK("bank3") AM_WRITE_BANK("bank4") AM_SHARE("video_ram")
ADDRESS_MAP_END
// when M1 is active: read opcodes
static ADDRESS_MAP_START( bios_mem, AS_DECRYPTED_OPCODES, 8, vixen_state )
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x0000, 0xefff) AM_READ(opram_r)
AM_RANGE(0xf000, 0xffff) AM_READ(oprom_r)
ADDRESS_MAP_END
//-------------------------------------------------
// ADDRESS_MAP( vixen_io )
@ -296,84 +301,84 @@ ADDRESS_MAP_END
INPUT_PORTS_START( vixen )
PORT_START("KEY.0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) PORT_CHAR(0x1B)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR(0x09)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(0x0D)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(0x27) PORT_CHAR(0x22)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR(']')
PORT_START("KEY.1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@')
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^')
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&')
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*')
PORT_START("KEY.2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_CHAR('q') PORT_CHAR(0x11)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_CHAR('w') PORT_CHAR(0x17)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_CHAR('e') PORT_CHAR(0x05)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_CHAR('r') PORT_CHAR(0x12)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_CHAR('t') PORT_CHAR(0x14)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_CHAR('y') PORT_CHAR(0x19)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_CHAR('u') PORT_CHAR(0x15)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_CHAR('i') PORT_CHAR(0x09)
PORT_START("KEY.3")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_CHAR('a') PORT_CHAR(0x01)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("S") PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_CHAR('s') PORT_CHAR(0x13)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_CHAR('d') PORT_CHAR(0x04)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_CHAR('f') PORT_CHAR(0x06)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('G') PORT_CHAR('g') PORT_CHAR(0x07)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("H") PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_CHAR('h') PORT_CHAR(0x08)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_CHAR('j') PORT_CHAR(0x0a)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_CHAR('k') PORT_CHAR(0x0b)
PORT_START("KEY.4")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_CHAR('z') PORT_CHAR(0x1a)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_CHAR('x') PORT_CHAR(0x18)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_CHAR('c') PORT_CHAR(0x03)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_CHAR('v') PORT_CHAR(0x16)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_CHAR('b') PORT_CHAR(0x02)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_CHAR('n') PORT_CHAR(0x0e)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_CHAR('m') PORT_CHAR(0x0d)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
PORT_START("KEY.5")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("UP") PORT_CODE(KEYCODE_UP)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LEFT) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')')
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_CHAR('p') PORT_CHAR(0x10)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_CHAR('o') PORT_CHAR(0x0f)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(')
PORT_START("KEY.6")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RIGHT") PORT_CODE(KEYCODE_RIGHT)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("DOWN") PORT_CODE(KEYCODE_DOWN)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("- _") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') PORT_CHAR(0x1F)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') PORT_CHAR(0x7E)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\\ |") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') PORT_CHAR(0x1C)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_CHAR('l')
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') PORT_CHAR(0x60)
PORT_START("KEY.7")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("DEL") PORT_CODE(KEYCODE_DEL) PORT_CHAR(127)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('{') PORT_CHAR('}')
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("FUNC") PORT_CODE(KEYCODE_END)
INPUT_PORTS_END
@ -412,16 +417,17 @@ void vixen_state::video_start()
UINT32 vixen_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
const pen_t *pen = m_palette->pens();
UINT8 x, y, chr, gfx, inv, ra;
for (int txadr = 0; txadr < 26; txadr++)
for (y = 0; y < 26; y++)
{
for (int scan = 0; scan < 10; scan++)
for (ra = 0; ra < 10; ra++)
{
for (int chadr = 0; chadr < 128; chadr++)
for (x = 0; x < 128; x++)
{
UINT16 sync_addr = (txadr << 7) | chadr;
UINT8 sync_data = m_sync_rom[sync_addr];
int blank = BIT(sync_data, 4);
UINT16 sync_addr = ((y+1) << 7) + x + 1; // it's out by a row and a column
UINT8 sync_data = m_sync_rom[sync_addr & 0xfff];
bool blank = BIT(sync_data, 4);
/*
int clrchadr = BIT(sync_data, 7);
int hsync = BIT(sync_data, 6);
@ -433,30 +439,26 @@ UINT32 vixen_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, c
sync_addr,sync_data,txadr,scan,chadr,comp_sync,vsync,blank,clrtxadr,hsync,clrchadr);
*/
int reverse = 0;
UINT16 video_addr = (txadr << 7) | chadr;
UINT8 video_data = m_video_ram[video_addr];
UINT16 char_addr = 0;
chr = m_video_ram[(y<<7) + x];
if (m_256)
{
char_addr = (BIT(video_data, 7) << 11) | (scan << 7) | (video_data & 0x7f);
reverse = m_alt;
gfx = m_char_rom[(BIT(chr, 7) << 11) | (ra << 7) | (chr & 0x7f)];
inv = m_alt ? 0xff : 0;
}
else
{
char_addr = (scan << 7) | (video_data & 0x7f);
reverse = BIT(video_data, 7);
gfx = m_char_rom[(ra << 7) | (chr & 0x7f)];
inv = BIT(chr, 7) ? 0xff : 0;
}
UINT8 char_data = m_char_rom[char_addr];
gfx = (blank) ? 0 : (gfx ^ inv);
for (int x = 0; x < 8; x++)
for (int b = 0; b < 8; b++)
{
int color = (BIT(char_data, 7 - x) ^ reverse) & !blank;
int color = BIT(gfx, 7 - b);
bitmap.pix32((txadr * 10) + scan, (chadr * 8) + x) = pen[color];
bitmap.pix32((y * 10) + ra, (x * 8) + b) = pen[color];
}
}
}
@ -517,7 +519,7 @@ WRITE8_MEMBER( vixen_state::i8155_pc_w )
2 DDEN/
3 ALT CHARSET/
4 256 CHARS
5 BEEP ENB
5 BEEP ENABLE
6
7
@ -537,11 +539,11 @@ WRITE8_MEMBER( vixen_state::i8155_pc_w )
m_fdc->dden_w(BIT(data, 2));
// charset
m_alt = BIT(data, 3);
m_256 = BIT(data, 4);
m_alt = !BIT(data, 3);
m_256 = !BIT(data, 4);
// beep enable
m_discrete->write(space, NODE_01, BIT(data, 5));
m_discrete->write(space, NODE_01, !BIT(data, 5));
}
//-------------------------------------------------
@ -690,13 +692,6 @@ IRQ_CALLBACK_MEMBER(vixen_state::vixen_int_ack)
void vixen_state::machine_start()
{
// configure memory banking
UINT8 *ram = m_ram->pointer();
membank("bank1")->configure_entry(0, ram);
membank("bank1")->configure_entry(1, m_rom);
membank("bank2")->configure_entry(0, ram);
membank("bank2")->configure_entry(1, m_video_ram);
membank("bank3")->configure_entry(0, m_video_ram);
membank("bank3")->configure_entry(1, m_rom);
@ -704,7 +699,6 @@ void vixen_state::machine_start()
membank("bank4")->configure_entry(0, m_video_ram);
// register for state saving
save_item(NAME(m_reset));
save_item(NAME(m_col));
save_item(NAME(m_cmd_d0));
save_item(NAME(m_cmd_d1));
@ -714,17 +708,8 @@ void vixen_state::machine_start()
void vixen_state::machine_reset()
{
address_space &program = m_maincpu->space(AS_PROGRAM);
program.install_read_bank(0x0000, 0xefff, 0xfff, 0, "bank1");
program.install_write_bank(0x0000, 0xefff, 0xfff, 0, "bank2");
membank("bank1")->set_entry(1);
membank("bank2")->set_entry(1);
membank("bank3")->set_entry(1);
m_reset = 1;
m_vsync = 0;
m_cmd_d0 = 0;
m_cmd_d1 = 0;
@ -733,6 +718,7 @@ void vixen_state::machine_reset()
m_fdc->reset();
m_io_i8155->reset();
m_usart->reset();
m_maincpu->set_state_int(Z80_PC, 0xf000);
}
@ -749,6 +735,7 @@ static MACHINE_CONFIG_START( vixen, vixen_state )
// basic machine hardware
MCFG_CPU_ADD(Z8400A_TAG, Z80, XTAL_23_9616MHz/6)
MCFG_CPU_PROGRAM_MAP(vixen_mem)
MCFG_CPU_DECRYPTED_OPCODES_MAP(bios_mem)
MCFG_CPU_IO_MAP(vixen_io)
MCFG_CPU_IRQ_ACKNOWLEDGE_DRIVER(vixen_state,vixen_int_ack)
@ -793,7 +780,9 @@ static MACHINE_CONFIG_START( vixen, vixen_state )
MCFG_FD1797_ADD(FDC1797_TAG, XTAL_23_9616MHz/24)
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(vixen_state, fdc_intrq_w))
MCFG_FLOPPY_DRIVE_ADD(FDC1797_TAG":0", vixen_floppies, "525dd", floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_SOUND(true)
MCFG_FLOPPY_DRIVE_ADD(FDC1797_TAG":1", vixen_floppies, "525dd", floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_SOUND(true)
MCFG_IEEE488_BUS_ADD()
MCFG_IEEE488_SRQ_CALLBACK(WRITELINE(vixen_state, srq_w))
MCFG_IEEE488_ATN_CALLBACK(WRITELINE(vixen_state, atn_w))
@ -837,34 +826,10 @@ ROM_END
// DRIVER_INIT( vixen )
//-------------------------------------------------
DIRECT_UPDATE_MEMBER(vixen_state::vixen_direct_update_handler)
{
if (address >= 0xf000)
{
if (m_reset)
{
address_space &program = m_maincpu->space(AS_PROGRAM);
program.install_read_bank(0x0000, 0xefff, "bank1");
program.install_write_bank(0x0000, 0xefff, "bank2");
membank("bank1")->set_entry(0);
membank("bank2")->set_entry(0);
m_reset = 0;
}
direct.explicit_configure(0xf000, 0xffff, 0xfff, m_rom);
return ~0;
}
return address;
}
DRIVER_INIT_MEMBER(vixen_state,vixen)
{
m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(vixen_state::vixen_direct_update_handler), this));
m_program = &m_maincpu->space(AS_PROGRAM);
}
@ -873,5 +838,5 @@ DRIVER_INIT_MEMBER(vixen_state,vixen)
// SYSTEM DRIVERS
//**************************************************************************
// YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS
COMP( 1984, vixen, 0, 0, vixen, vixen, vixen_state, vixen, "Osborne", "Vixen", MACHINE_NOT_WORKING )
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1984, vixen, 0, 0, vixen, vixen, vixen_state, vixen, "Osborne", "Vixen", 0 )

View File

@ -11,7 +11,6 @@
#include "emu.h"
#include "cpu/z80/z80.h"
#include "cpu/z80/z80daisy.h"
#include "sound/beep.h"
#include "machine/6821pia.h"
#include "machine/6850acia.h"
@ -25,43 +24,75 @@ public:
enum
{
TIMER_VIDEO,
TIMER_ACIA_RXC_TXC,
TIMER_SETUP
};
osborne1_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
osborne1_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_pia0(*this, "pia_0"),
m_pia1(*this, "pia_1"),
m_acia(*this, "acia"),
m_fdc(*this, "mb8877"),
m_beep(*this, "beeper"),
m_ram(*this, RAM_TAG),
m_ieee(*this, IEEE488_TAG),
m_floppy0(*this, "mb8877:0:525ssdd"),
m_floppy1(*this, "mb8877:1:525ssdd"),
m_row0(*this, "ROW0"),
m_row1(*this, "ROW1"),
m_row2(*this, "ROW2"),
m_row3(*this, "ROW3"),
m_row4(*this, "ROW4"),
m_row5(*this, "ROW5"),
m_row6(*this, "ROW6"),
m_row7(*this, "ROW7"),
m_video_timer(NULL),
m_keyb_row0(*this, "ROW0"),
m_keyb_row1(*this, "ROW1"),
m_keyb_row2(*this, "ROW2"),
m_keyb_row3(*this, "ROW3"),
m_keyb_row4(*this, "ROW4"),
m_keyb_row5(*this, "ROW5"),
m_keyb_row6(*this, "ROW6"),
m_keyb_row7(*this, "ROW7"),
m_btn_reset(*this, "RESET"),
m_cnf(*this, "CNF"),
m_bank1(*this, "bank1"),
m_bank2(*this, "bank2"),
m_bank3(*this, "bank3"),
m_region_maincpu(*this, "maincpu") { }
m_region_maincpu(*this, "maincpu"),
m_bank_0xxx(*this, "bank_0xxx"),
m_bank_1xxx(*this, "bank_1xxx"),
m_bank_fxxx(*this, "bank_fxxx"),
m_acia_rxc_txc_timer(NULL)
{ }
DECLARE_WRITE8_MEMBER(bank_0xxx_w);
DECLARE_WRITE8_MEMBER(bank_1xxx_w);
DECLARE_READ8_MEMBER(bank_2xxx_3xxx_r);
DECLARE_WRITE8_MEMBER(bank_2xxx_3xxx_w);
DECLARE_WRITE8_MEMBER(videoram_w);
DECLARE_READ8_MEMBER(opcode_r);
DECLARE_WRITE8_MEMBER(bankswitch_w);
DECLARE_WRITE_LINE_MEMBER(irqack_w);
DECLARE_READ8_MEMBER(ieee_pia_pb_r);
DECLARE_WRITE8_MEMBER(ieee_pia_pb_w);
DECLARE_WRITE_LINE_MEMBER(ieee_pia_irq_a_func);
DECLARE_WRITE8_MEMBER(video_pia_port_a_w);
DECLARE_WRITE8_MEMBER(video_pia_port_b_w);
DECLARE_WRITE_LINE_MEMBER(video_pia_out_cb2_dummy);
DECLARE_WRITE_LINE_MEMBER(video_pia_irq_a_func);
DECLARE_WRITE_LINE_MEMBER(serial_acia_irq_func);
DECLARE_DRIVER_INIT(osborne1);
virtual void machine_reset();
virtual void video_start();
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_CALLBACK_MEMBER(video_callback);
TIMER_CALLBACK_MEMBER(setup_callback);
bitmap_ind16 m_bitmap;
required_device<cpu_device> m_maincpu;
required_device<pia6821_device> m_pia0;
required_device<pia6821_device> m_pia1;
required_device<acia6850_device> m_acia;
required_device<mb8877_t> m_fdc;
required_device<beep_device> m_beep;
required_device<ram_device> m_ram;
@ -69,79 +100,59 @@ public:
required_device<floppy_image_device> m_floppy0;
required_device<floppy_image_device> m_floppy1;
DECLARE_WRITE8_MEMBER(osborne1_0000_w);
DECLARE_WRITE8_MEMBER(osborne1_1000_w);
DECLARE_READ8_MEMBER(osborne1_2000_r);
DECLARE_WRITE8_MEMBER(osborne1_2000_w);
DECLARE_WRITE8_MEMBER(osborne1_videoram_w);
DECLARE_WRITE8_MEMBER(osborne1_bankswitch_w);
DECLARE_WRITE_LINE_MEMBER(ieee_pia_irq_a_func);
DECLARE_READ8_MEMBER(ieee_pia_pb_r);
DECLARE_WRITE8_MEMBER(ieee_pia_pb_w);
DECLARE_WRITE_LINE_MEMBER(video_pia_out_cb2_dummy);
DECLARE_WRITE8_MEMBER(video_pia_port_a_w);
DECLARE_WRITE8_MEMBER(video_pia_port_b_w);
DECLARE_WRITE_LINE_MEMBER(video_pia_irq_a_func);
DECLARE_DIRECT_UPDATE_MEMBER(osborne1_opbase);
bool m_bank2_enabled;
UINT8 m_bit_9;
/* IRQ states */
bool m_pia_0_irq_state;
bool m_pia_1_irq_state;
/* video related */
UINT8 m_screen_pac;
UINT8 m_resolution;
UINT8 m_hc_left;
UINT8 m_new_start_x;
UINT8 m_new_start_y;
emu_timer *m_video_timer;
UINT8 *m_p_chargen;
/* bankswitch setting */
UINT8 m_bankswitch;
bool m_in_irq_handler;
bool m_beep_state;
DECLARE_DRIVER_INIT(osborne1);
virtual void machine_reset();
TIMER_CALLBACK_MEMBER(osborne1_video_callback);
TIMER_CALLBACK_MEMBER(setup_osborne1);
protected:
required_ioport m_row0;
required_ioport m_row1;
required_ioport m_row2;
required_ioport m_row3;
required_ioport m_row4;
required_ioport m_row5;
required_ioport m_row6;
required_ioport m_row7;
required_ioport m_cnf;
required_memory_bank m_bank1;
required_memory_bank m_bank2;
required_memory_bank m_bank3;
required_memory_region m_region_maincpu;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
bool set_rom_mode(UINT8 value);
bool set_bit_9(UINT8 value);
void update_irq();
void update_acia_rxc_txc();
// user inputs
required_ioport m_keyb_row0;
required_ioport m_keyb_row1;
required_ioport m_keyb_row2;
required_ioport m_keyb_row3;
required_ioport m_keyb_row4;
required_ioport m_keyb_row5;
required_ioport m_keyb_row6;
required_ioport m_keyb_row7;
required_ioport m_btn_reset;
// fake inputs for hardware configuration and things that need rewiring
required_ioport m_cnf;
// pieces of memory
required_memory_region m_region_maincpu;
required_memory_bank m_bank_0xxx;
required_memory_bank m_bank_1xxx;
required_memory_bank m_bank_fxxx;
// configuration (reloaded on reset)
UINT8 m_screen_pac;
UINT8 m_acia_rxc_txc_div;
UINT8 m_acia_rxc_txc_p_low;
UINT8 m_acia_rxc_txc_p_high;
// bank switch control bits
UINT8 m_ub4a_q;
UINT8 m_ub6a_q;
UINT8 m_rom_mode;
UINT8 m_bit_9;
// serial state
int m_acia_irq_state;
int m_acia_rxc_txc_state;
emu_timer *m_acia_rxc_txc_timer;
};
// ======================> osborne1_daisy_device
class osborne1_daisy_device : public device_t,
public device_z80daisy_interface
{
public:
// construction/destruction
osborne1_daisy_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
private:
virtual void device_start();
// z80daisy_interface overrides
virtual int z80daisy_irq_state();
virtual int z80daisy_irq_ack();
virtual void z80daisy_irq_reti();
};
extern const device_type OSBORNE1_DAISY;
#endif /* OSBORNE1_H_ */

View File

@ -53,6 +53,29 @@ public:
m_txrdy(0)
{ }
DECLARE_READ8_MEMBER( status_r );
DECLARE_WRITE8_MEMBER( cmd_w );
DECLARE_READ8_MEMBER( ieee488_r );
DECLARE_READ8_MEMBER( port3_r );
DECLARE_READ8_MEMBER( i8155_pa_r );
DECLARE_WRITE8_MEMBER( i8155_pb_w );
DECLARE_WRITE8_MEMBER( i8155_pc_w );
DECLARE_WRITE8_MEMBER( io_i8155_pb_w );
DECLARE_WRITE8_MEMBER( io_i8155_pc_w );
DECLARE_WRITE_LINE_MEMBER( io_i8155_to_w );
DECLARE_WRITE_LINE_MEMBER( srq_w );
DECLARE_WRITE_LINE_MEMBER( atn_w );
DECLARE_WRITE_LINE_MEMBER( rxrdy_w );
DECLARE_WRITE_LINE_MEMBER( txrdy_w );
DECLARE_WRITE_LINE_MEMBER( fdc_intrq_w );
DECLARE_DRIVER_INIT(vixen);
TIMER_DEVICE_CALLBACK_MEMBER(vsync_tick);
IRQ_CALLBACK_MEMBER(vixen_int_ack);
DECLARE_READ8_MEMBER(opram_r);
DECLARE_READ8_MEMBER(oprom_r);
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
private:
required_device<cpu_device> m_maincpu;
required_device<fd1797_t> m_fdc;
required_device<i8155_device> m_io_i8155;
@ -70,35 +93,15 @@ public:
required_shared_ptr<UINT8> m_video_ram;
required_ioport_array<8> m_key;
address_space *m_program;
virtual void machine_start();
virtual void machine_reset();
virtual void video_start();
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void update_interrupt();
DECLARE_WRITE8_MEMBER( ctl_w );
DECLARE_READ8_MEMBER( status_r );
DECLARE_WRITE8_MEMBER( cmd_w );
DECLARE_READ8_MEMBER( ieee488_r );
DECLARE_READ8_MEMBER( port3_r );
DECLARE_READ8_MEMBER( i8155_pa_r );
DECLARE_WRITE8_MEMBER( i8155_pb_w );
DECLARE_WRITE8_MEMBER( i8155_pc_w );
DECLARE_WRITE8_MEMBER( io_i8155_pb_w );
DECLARE_WRITE8_MEMBER( io_i8155_pc_w );
DECLARE_WRITE_LINE_MEMBER( io_i8155_to_w );
DECLARE_WRITE_LINE_MEMBER( srq_w );
DECLARE_WRITE_LINE_MEMBER( atn_w );
DECLARE_WRITE_LINE_MEMBER( rxrdy_w );
DECLARE_WRITE_LINE_MEMBER( txrdy_w );
DECLARE_WRITE_LINE_MEMBER( fdc_intrq_w );
DIRECT_UPDATE_MEMBER(vixen_direct_update_handler);
// memory state
int m_reset;
// keyboard state
UINT8 m_col;
@ -122,12 +125,8 @@ public:
int m_enb_ring_int;
// video state
int m_alt;
int m_256;
DECLARE_DRIVER_INIT(vixen);
TIMER_DEVICE_CALLBACK_MEMBER(vsync_tick);
IRQ_CALLBACK_MEMBER(vixen_int_ack);
bool m_alt;
bool m_256;
};
#endif

View File

@ -3,229 +3,155 @@
/***************************************************************************
There are three IRQ sources:
- IRQ0
- IRQ0 = IRQ from the serial ACIA
- IRQ1 = IRQA from the video PIA
- IRQ2 = IRQA from the IEEE488 PIA
Interrupt handling on the Osborne-1 is a bit awkward. When an interrupt is
taken by the Z80 the ROMMODE is enabled on each fetch of an instruction
byte. During execution of an instruction the previous ROMMODE setting seems
to be used. Side effect of this is that when an interrupt is taken and the
stack pointer is pointing to 0000-3FFF then the return address will still
be written to RAM if RAM was switched in.
***************************************************************************/
#include "includes/osborne1.h"
#define RAMMODE (0x01)
WRITE8_MEMBER( osborne1_state::osborne1_0000_w )
WRITE8_MEMBER( osborne1_state::bank_0xxx_w )
{
/* Check whether regular RAM is enabled */
if ( !m_bank2_enabled || ( m_in_irq_handler && m_bankswitch == RAMMODE) )
{
m_ram->pointer()[ offset ] = data;
}
if (!m_rom_mode)
m_ram->pointer()[offset] = data;
}
WRITE8_MEMBER( osborne1_state::osborne1_1000_w )
WRITE8_MEMBER( osborne1_state::bank_1xxx_w )
{
/* Check whether regular RAM is enabled */
if ( !m_bank2_enabled || ( m_in_irq_handler && m_bankswitch == RAMMODE) )
{
m_ram->pointer()[ 0x1000 + offset ] = data;
}
if (!m_rom_mode)
m_ram->pointer()[0x1000 + offset] = data;
}
READ8_MEMBER( osborne1_state::osborne1_2000_r )
READ8_MEMBER( osborne1_state::bank_2xxx_3xxx_r )
{
if (!m_rom_mode)
return m_ram->pointer()[0x2000 + offset];
// This isn't really accurate - bus fighting will occur for many values
// since each peripheral only checks two bits. We just return 0xFF for
// any undocumented address.
UINT8 data = 0xFF;
/* Check whether regular RAM is enabled */
if ( !m_bank2_enabled )
switch (offset & 0x0F00)
{
data = m_ram->pointer()[ 0x2000 + offset ];
}
else
{
// This isn't really accurate - bus fighting will occur for many values
// since each peripheral only checks two bits. We just return 0xFF for
// any undocumented address.
switch ( offset & 0x0F00 )
{
case 0x100: /* Floppy */
data = m_fdc->read( space, offset & 0x03 );
break;
case 0x200: /* Keyboard */
/* Row 0 */
if ( offset & 0x01 ) data &= m_row0->read();
/* Row 1 */
if ( offset & 0x02 ) data &= m_row1->read();
/* Row 2 */
if ( offset & 0x04 ) data &= m_row3->read();
/* Row 3 */
if ( offset & 0x08 ) data &= m_row4->read();
/* Row 4 */
if ( offset & 0x10 ) data &= m_row5->read();
/* Row 5 */
if ( offset & 0x20 ) data &= m_row2->read();
/* Row 6 */
if ( offset & 0x40 ) data &= m_row6->read();
/* Row 7 */
if ( offset & 0x80 ) data &= m_row7->read();
break;
case 0x400: /* SCREEN-PAC */
if (m_screen_pac) data &= 0xFB;
break;
case 0x900: /* IEEE488 PIA */
data = m_pia0->read(space, offset & 0x03);
break;
case 0xA00: /* Serial */
break;
case 0xC00: /* Video PIA */
data = m_pia1->read(space, offset & 0x03);
break;
}
case 0x100: /* Floppy */
data = m_fdc->read(space, offset & 0x03);
break;
case 0x200: /* Keyboard */
if (offset & 0x01) data &= m_keyb_row0->read();
if (offset & 0x02) data &= m_keyb_row1->read();
if (offset & 0x04) data &= m_keyb_row3->read();
if (offset & 0x08) data &= m_keyb_row4->read();
if (offset & 0x10) data &= m_keyb_row5->read();
if (offset & 0x20) data &= m_keyb_row2->read();
if (offset & 0x40) data &= m_keyb_row6->read();
if (offset & 0x80) data &= m_keyb_row7->read();
break;
case 0x400: /* SCREEN-PAC */
if (m_screen_pac) data &= 0xFB;
break;
case 0x900: /* IEEE488 PIA */
data = m_pia0->read(space, offset & 0x03);
break;
case 0xA00: /* Serial */
if (offset & 0x01) data = m_acia->data_r(space, 0);
else data = m_acia->status_r(space, 0);
break;
case 0xC00: /* Video PIA */
data = m_pia1->read(space, offset & 0x03);
break;
}
return data;
}
WRITE8_MEMBER( osborne1_state::osborne1_2000_w )
WRITE8_MEMBER( osborne1_state::bank_2xxx_3xxx_w )
{
#if 0
/* Check whether regular RAM is enabled */
if ( !m_bank2_enabled || (m_in_irq_handler && m_bankswitch == RAMMODE) )
if (!m_rom_mode)
{
m_ram->pointer()[ 0x2000 + offset ] = data;
m_ram->pointer()[0x2000 + offset] = data;
}
else
{
/* Handle writes to the I/O area */
if ( 0x100 == (offset & 0x900) ) /* Floppy */
// Handle writes to the I/O area
if ((offset & 0x900) == 0x100) // Floppy
m_fdc->write(space, offset & 0x03, data);
if ( 0x400 == (offset & 0xC00) ) /* SCREEN-PAC */
if ((offset & 0x900) == 0x900) // IEEE488 PIA
m_pia0->write(space, offset & 0x03, data);
if ((offset & 0xA00) == 0xA00) // Serial
{
if (offset & 0x01) m_acia->data_w(space, 0, data);
else m_acia->control_w(space, 0, data);
}
if ((offset & 0xC00) == 0x400) // SCREEN-PAC
{
m_resolution = data & 0x01;
m_hc_left = (data >> 1) & 0x01;
}
if ( 0x900 == (offset & 0x900) ) /* IEEE488 PIA */
m_pia0->write(space, offset & 0x03, data);
if ( 0xA00 == (offset & 0xA00) ) /* Serial */
/* not implemented */;
if ( 0xC00 == (offset & 0xC00) ) /* Video PIA */
if ((offset & 0xC00) == 0xC00) // Video PIA
m_pia1->write(space, offset & 0x03, data);
}
#else
// This code is a nasty hack that doesn't reflect hardware operation,
// but it gets us by while the bank selection implementation is inadequate
if ( ! m_bank2_enabled )
{
m_ram->pointer()[ 0x2000 + offset ] = data;
}
else
{
if ( m_in_irq_handler && m_bankswitch == RAMMODE )
{
m_ram->pointer()[ 0x2000 + offset ] = data;
}
/* Handle writes to the I/O area */
switch( offset & 0x1F00 )
{
case 0x100: /* Floppy */
m_fdc->write(space, offset & 0x03, data);
break;
case 0x400: /* SCREEN-PAC */
m_resolution = data & 0x01;
m_hc_left = (data >> 1) & 0x01;
break;
case 0x900: /* IEEE488 PIA */
m_pia0->write(space, offset & 0x03, data );
break;
case 0xA00: /* Serial */
break;
case 0xC00: /* Video PIA */
m_pia1->write(space, offset & 0x03, data );
break;
}
}
#endif
}
WRITE8_MEMBER( osborne1_state::osborne1_videoram_w )
WRITE8_MEMBER( osborne1_state::videoram_w )
{
/* Check whether the video attribute section is enabled */
if ( m_bit_9 )
data |= 0x7F;
reinterpret_cast<UINT8 *>(m_bank3->base())[offset] = data;
// Attribute RAM is only one bit wide - low seven bits are discarded and read back high
if (m_bit_9) data |= 0x7F;
reinterpret_cast<UINT8 *>(m_bank_fxxx->base())[offset] = data;
}
WRITE8_MEMBER( osborne1_state::osborne1_bankswitch_w )
READ8_MEMBER( osborne1_state::opcode_r )
{
switch ( offset & 0x03 )
// Update the flipflops that control bank selection and NMI
UINT8 const new_ub6a_q = (m_btn_reset->read() & 0x80) ? 1 : 0;
if (!m_rom_mode)
{
set_rom_mode(m_ub4a_q ? 0 : 1);
m_ub4a_q = m_ub6a_q;
}
m_ub6a_q = new_ub6a_q;
m_maincpu->set_input_line(INPUT_LINE_NMI, m_ub6a_q ? CLEAR_LINE : ASSERT_LINE);
// Now that's sorted out we can call the normal read handler
return m_maincpu->space(AS_PROGRAM).read_byte(offset);
}
WRITE8_MEMBER( osborne1_state::bankswitch_w )
{
switch (offset & 0x03)
{
case 0x00:
m_bank2_enabled = 1;
m_bankswitch = 0x00;
if (set_rom_mode(1))
m_ub4a_q = m_ub6a_q;
break;
case 0x01:
m_bank2_enabled = 0;
m_bankswitch = 0x01;
m_ub4a_q = 1;
m_ub6a_q = 1;
set_rom_mode(0);
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
break;
case 0x02:
m_bit_9 = 1;
set_bit_9(1);
break;
case 0x03:
m_bit_9 = 0;
set_bit_9(0);
break;
}
if ( m_bank2_enabled )
{
m_bank1->set_base(m_region_maincpu->base());
m_bank2->set_base(m_region_maincpu->base());
}
else
{
m_bank1->set_base(m_ram->pointer());
m_bank2->set_base(m_ram->pointer() + 0x1000);
}
m_bank3->set_base(m_ram->pointer() + (m_bit_9 ? 0x10000 : 0xF000));
m_in_irq_handler = 0;
}
DIRECT_UPDATE_MEMBER(osborne1_state::osborne1_opbase)
WRITE_LINE_MEMBER( osborne1_state::irqack_w )
{
if ( ( address & 0xF000 ) == 0x2000 )
{
if ( ! m_bank2_enabled )
{
direct.explicit_configure(0x2000, 0x2fff, 0x0fff, m_ram->pointer() + 0x2000);
return ~0;
}
}
return address;
}
WRITE_LINE_MEMBER( osborne1_state::ieee_pia_irq_a_func )
{
m_pia_0_irq_state = state;
m_maincpu->set_input_line(0, ( m_pia_1_irq_state ) ? ASSERT_LINE : CLEAR_LINE);
// Update the flipflops that control bank selection and NMI
if (!m_rom_mode) set_rom_mode(m_ub4a_q ? 0 : 1);
m_ub4a_q = 0;
m_ub6a_q = (m_btn_reset->read() & 0x80) ? 1 : 0;
m_maincpu->set_input_line(INPUT_LINE_NMI, m_ub6a_q ? CLEAR_LINE : ASSERT_LINE);
}
READ8_MEMBER( osborne1_state::ieee_pia_pb_r )
{
/*
bit description
0
@ -236,9 +162,7 @@ READ8_MEMBER( osborne1_state::ieee_pia_pb_r )
5 DAV
6 NDAC
7 NRFD
*/
UINT8 data = 0;
data |= m_ieee->eoi_r() << 3;
@ -249,11 +173,9 @@ READ8_MEMBER( osborne1_state::ieee_pia_pb_r )
return data;
}
WRITE8_MEMBER( osborne1_state::ieee_pia_pb_w )
{
/*
bit description
0
@ -264,9 +186,7 @@ WRITE8_MEMBER( osborne1_state::ieee_pia_pb_w )
5 DAV
6 NDAC
7 NRFD
*/
m_ieee->eoi_w(BIT(data, 3));
m_ieee->atn_w(BIT(data, 4));
m_ieee->dav_w(BIT(data, 5));
@ -274,9 +194,9 @@ WRITE8_MEMBER( osborne1_state::ieee_pia_pb_w )
m_ieee->nrfd_w(BIT(data, 7));
}
WRITE_LINE_MEMBER( osborne1_state::video_pia_out_cb2_dummy )
WRITE_LINE_MEMBER( osborne1_state::ieee_pia_irq_a_func )
{
update_irq();
}
@ -293,7 +213,6 @@ WRITE8_MEMBER( osborne1_state::video_pia_port_a_w )
//logerror("Video pia port a write: %02X, density set to %s\n", data, data & 1 ? "FM" : "MFM" );
}
WRITE8_MEMBER( osborne1_state::video_pia_port_b_w )
{
m_new_start_y = data & 0x1F;
@ -317,63 +236,114 @@ WRITE8_MEMBER( osborne1_state::video_pia_port_b_w )
//logerror("Video pia port b write: %02X\n", data );
}
WRITE_LINE_MEMBER( osborne1_state::video_pia_out_cb2_dummy )
{
}
WRITE_LINE_MEMBER( osborne1_state::video_pia_irq_a_func )
{
m_pia_1_irq_state = state;
m_maincpu->set_input_line(0, ( m_pia_1_irq_state ) ? ASSERT_LINE : CLEAR_LINE);
update_irq();
}
//static const struct aica6850_interface osborne1_6850_config =
//{
// 10, /* tx_clock */
// 10, /* rx_clock */
// NULL, /* rx_pin */
// NULL, /* tx_pin */
// NULL, /* cts_pin */
// NULL, /* rts_pin */
// NULL, /* dcd_pin */
// NULL /* int_callback */
//};
void osborne1_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
WRITE_LINE_MEMBER( osborne1_state::serial_acia_irq_func )
{
switch (id)
{
case TIMER_VIDEO:
osborne1_video_callback(ptr, param);
break;
case TIMER_SETUP:
setup_osborne1(ptr, param);
break;
default:
assert_always(FALSE, "Unknown id in osborne1_state::device_timer");
}
m_acia_irq_state = state;
update_irq();
}
TIMER_CALLBACK_MEMBER(osborne1_state::osborne1_video_callback)
DRIVER_INIT_MEMBER( osborne1_state, osborne1 )
{
m_bank_0xxx->configure_entries(0, 1, m_ram->pointer(), 0);
m_bank_0xxx->configure_entries(1, 1, m_region_maincpu->base(), 0);
m_bank_1xxx->configure_entries(0, 1, m_ram->pointer() + 0x1000, 0);
m_bank_1xxx->configure_entries(1, 1, m_region_maincpu->base(), 0);
m_bank_fxxx->configure_entries(0, 1, m_ram->pointer() + 0xF000, 0);
m_bank_fxxx->configure_entries(1, 1, m_ram->pointer() + 0x10000, 0);
m_video_timer = timer_alloc(TIMER_VIDEO);
m_video_timer->adjust(machine().first_screen()->time_until_pos(1, 0));
m_acia_rxc_txc_timer = timer_alloc(TIMER_ACIA_RXC_TXC);
timer_set(attotime::zero, TIMER_SETUP);
}
void osborne1_state::machine_reset()
{
// Refresh configuration
m_screen_pac = 0 != (m_cnf->read() & 0x01);
switch (m_cnf->read() & 0x06)
{
case 0x00:
m_acia_rxc_txc_div = 16;
m_acia_rxc_txc_p_low = 23;
m_acia_rxc_txc_p_high = 29;
break;
case 0x02:
m_acia_rxc_txc_div = 16;
m_acia_rxc_txc_p_low = 9;
m_acia_rxc_txc_p_high = 15;
break;
case 0x04:
m_acia_rxc_txc_div = 16;
m_acia_rxc_txc_p_low = 5;
m_acia_rxc_txc_p_high = 8;
break;
case 0x06:
m_acia_rxc_txc_div = 8;
m_acia_rxc_txc_p_low = 5;
m_acia_rxc_txc_p_high = 8;
break;
}
// Initialise memory configuration
m_rom_mode = 0;
m_bit_9 = 1;
set_rom_mode(1);
set_bit_9(0);
// Reset serial state
m_acia_irq_state = 0;
m_acia_rxc_txc_state = 0;
update_acia_rxc_txc();
m_resolution = 0;
m_hc_left = 0;
m_p_chargen = memregion( "chargen" )->base();
for (unsigned i = 0; i < 0x1000; i++)
m_ram->pointer()[0x10000 + i] |= 0x7F;
}
void osborne1_state::video_start()
{
machine().first_screen()->register_screen_bitmap(m_bitmap);
}
UINT32 osborne1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect);
return 0;
}
TIMER_CALLBACK_MEMBER(osborne1_state::video_callback)
{
int const y = machine().first_screen()->vpos();
UINT8 ra=0;
UINT8 ra = 0;
/* Check for start of frame */
if ( y == 0 )
{
/* Clear CA1 on video PIA */
// Check for start/end of visible area and clear/set CA1 on video PIA
if (y == 0)
m_pia1->ca1_w(0);
}
if ( y == 240 )
{
/* Set CA1 on video PIA */
else if (y == 240)
m_pia1->ca1_w(1);
}
if ( y < 240 )
if (y < 240)
{
ra = y % 10;
/* Draw a line of the display */
// Draw a line of the display
bool const hires = m_screen_pac & m_resolution;
UINT16 const row = (m_new_start_y + (y/10)) * 128 & 0xF80;
UINT16 const col = (m_new_start_x & (hires ? 0x60 : 0x7F)) - ((hires && m_hc_left) ? 8 : 0);
@ -382,12 +352,12 @@ TIMER_CALLBACK_MEMBER(osborne1_state::osborne1_video_callback)
for ( UINT16 x = 0; x < (hires ? 104 : 52); x++ )
{
UINT16 offs = row | ((col + x) & 0x7F);
UINT8 const chr = m_ram->pointer()[ 0xF000 + offs ];
UINT8 const dim = m_ram->pointer()[ 0x10000 + offs ] & 0x80;
UINT8 const chr = m_ram->pointer()[0xF000 + offs];
UINT8 const dim = m_ram->pointer()[0x10000 + offs] & 0x80;
UINT8 const gfx = ((chr & 0x80) && (ra == 9)) ? 0xFF : m_p_chargen[ (ra << 7) | (chr & 0x7F) ];
UINT8 const gfx = ((chr & 0x80) && (ra == 9)) ? 0xFF : m_p_chargen[(ra << 7) | (chr & 0x7F)];
/* Display a scanline of a character */
// Display a scanline of a character
*p++ = BIT(gfx, 7) ? ( dim ? 2 : 1 ) : 0;
if (!hires) { p[0] = p[-1]; p++; }
*p++ = BIT(gfx, 6) ? ( dim ? 2 : 1 ) : 0;
@ -407,133 +377,92 @@ TIMER_CALLBACK_MEMBER(osborne1_state::osborne1_video_callback)
}
}
if ( (ra==2) || (ra==6) )
{
m_beep->set_state( m_beep_state );
}
if ((ra == 2) || (ra == 6))
m_beep->set_state(m_beep_state);
else
{
m_beep->set_state( 0 );
}
m_beep->set_state(0);
m_video_timer->adjust(machine().first_screen()->time_until_pos(y + 1, 0 ));
// Check reset key if necessary - it affects NMI
if (!m_ub6a_q)
m_maincpu->set_input_line(INPUT_LINE_NMI, (m_btn_reset->read() && 0x80) ? CLEAR_LINE : ASSERT_LINE);
m_video_timer->adjust(machine().first_screen()->time_until_pos(y + 1, 0));
}
TIMER_CALLBACK_MEMBER(osborne1_state::setup_osborne1)
TIMER_CALLBACK_MEMBER(osborne1_state::setup_callback)
{
m_beep->set_state( 0 );
m_beep->set_frequency( 300 /* 60 * 240 / 2 */ );
m_pia1->ca1_w(0);
}
void osborne1_state::machine_reset()
void osborne1_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
/* Initialize memory configuration */
osborne1_bankswitch_w( m_maincpu->space(AS_IO), 0x00, 0 );
m_pia_0_irq_state = FALSE;
m_pia_1_irq_state = FALSE;
m_in_irq_handler = 0;
m_screen_pac = 0 != (m_cnf->read() & 0x01);
m_resolution = 0;
m_hc_left = 0;
m_p_chargen = memregion( "chargen" )->base();
memset( m_ram->pointer() + 0x10000, 0xFF, 0x1000 );
address_space& space = m_maincpu->space(AS_PROGRAM);
space.set_direct_update_handler(direct_update_delegate(FUNC(osborne1_state::osborne1_opbase), this));
switch (id)
{
case TIMER_VIDEO:
video_callback(ptr, param);
break;
case TIMER_ACIA_RXC_TXC:
m_acia_rxc_txc_state = m_acia_rxc_txc_state ? 0 : 1;
update_acia_rxc_txc();
break;
case TIMER_SETUP:
setup_callback(ptr, param);
break;
default:
assert_always(FALSE, "Unknown id in osborne1_state::device_timer");
}
}
DRIVER_INIT_MEMBER(osborne1_state,osborne1)
bool osborne1_state::set_rom_mode(UINT8 value)
{
/* Configure the 6850 ACIA */
// acia6850_config( 0, &osborne1_6850_config );
m_video_timer = timer_alloc(TIMER_VIDEO);
m_video_timer->adjust(machine().first_screen()->time_until_pos(1, 0 ));
timer_set(attotime::zero, TIMER_SETUP);
if (value != m_rom_mode)
{
m_rom_mode = value;
m_bank_0xxx->set_entry(m_rom_mode);
m_bank_1xxx->set_entry(m_rom_mode);
return true;
}
else
{
return false;
}
}
void osborne1_state::video_start()
bool osborne1_state::set_bit_9(UINT8 value)
{
machine().first_screen()->register_screen_bitmap(m_bitmap);
if (value != m_bit_9)
{
m_bit_9 = value;
m_bank_fxxx->set_entry(m_bit_9);
return true;
}
else
{
return false;
}
}
UINT32 osborne1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
void osborne1_state::update_irq()
{
copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect);
return 0;
if (m_pia0->irq_a_state())
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xF0);
else if (m_pia1->irq_a_state())
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xF8);
else if (m_acia_irq_state)
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xFC);
else
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, CLEAR_LINE, 0xFE);
}
/****************************************************************
Osborne1 specific daisy chain code
****************************************************************/
const device_type OSBORNE1_DAISY = &device_creator<osborne1_daisy_device>;
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// z80ctc_device - constructor
//-------------------------------------------------
osborne1_daisy_device::osborne1_daisy_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, OSBORNE1_DAISY, "Osborne 1 daisy", tag, owner, clock, "osborne1_daisy", __FILE__),
device_z80daisy_interface(mconfig, *this)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void osborne1_daisy_device::device_start()
{
}
//**************************************************************************
// DAISY CHAIN INTERFACE
//**************************************************************************
//-------------------------------------------------
// z80daisy_irq_state - return the overall IRQ
// state for this device
//-------------------------------------------------
int osborne1_daisy_device::z80daisy_irq_state()
{
osborne1_state *state = machine().driver_data<osborne1_state>();
return ( state->m_pia_1_irq_state ? Z80_DAISY_INT : 0 );
}
//-------------------------------------------------
// z80daisy_irq_ack - acknowledge an IRQ and
// return the appropriate vector
//-------------------------------------------------
int osborne1_daisy_device::z80daisy_irq_ack()
{
osborne1_state *state = machine().driver_data<osborne1_state>();
/* Enable ROM and I/O when IRQ is acknowledged */
UINT8 old_bankswitch = state->m_bankswitch;
state->osborne1_bankswitch_w( state->m_maincpu->space(AS_IO), 0, 0 );
state->m_bankswitch = old_bankswitch;
state->m_in_irq_handler = 1;
return 0xF8;
}
//-------------------------------------------------
// z80daisy_irq_reti - clear the interrupt
// pending state to allow other interrupts through
//-------------------------------------------------
void osborne1_daisy_device::z80daisy_irq_reti()
void osborne1_state::update_acia_rxc_txc()
{
m_acia->write_rxc(m_acia_rxc_txc_state);
m_acia->write_txc(m_acia_rxc_txc_state);
attoseconds_t const dividend = (ATTOSECONDS_PER_SECOND / 100) * (m_acia_rxc_txc_state ? m_acia_rxc_txc_p_high : m_acia_rxc_txc_p_low);
attoseconds_t const divisor = (15974400 / 100) / m_acia_rxc_txc_div;
m_acia_rxc_txc_timer->adjust(attotime(0, dividend / divisor));
}

View File

@ -22,7 +22,8 @@ Known A-board revisions:
Game Year B-board # B-board PALs C-board # CPS-B # C-board PALs
----------------------------------------------------------- ---- --------- --------------------- ----------- ----------------------- ------------
Forgotten Worlds (World) 1988 88621B-2 LW621 LWIO None CPS-B-01 DL-0411-10001 N/A
Forgotten Worlds (World, newer) 1988 88621B-2 LW621 LWIO None CPS-B-01 DL-0411-10001 N/A
Forgotten Worlds (World) 88621B-2 LW621 LWIO None CPS-B-01 DL-0411-10001 N/A
Forgotten Worlds (USA, B-Board 88618B-2, Rev. A) 88618B-2 LWCHR LWIO None CPS-B-01 DL-0411-10001 N/A
Forgotten Worlds (USA, B-Board 88618B-2, Rev. AA) 88618B-2 LWCHR LWIO None CPS-B-01 DL-0411-10001 N/A
Forgotten Worlds (USA, B-Board 88618B-2, Rev. C) 88618B-2 LWCHR LWIO None CPS-B-01 DL-0411-10001 N/A
@ -1388,6 +1389,7 @@ static const struct CPS1config cps1_config_table[]=
{
/* name CPSB gfx mapper in2 in3 out2 kludge */
{"forgottn", CPS_B_01, mapper_LW621 },
{"forgottna", CPS_B_01, mapper_LW621 },
{"forgottnu", CPS_B_01, mapper_LW621 },
{"forgottnu1", CPS_B_01, mapper_LWCHR },
{"forgottnua", CPS_B_01, mapper_LWCHR },