(mess) pc: split tandy 1000 and pcjr from pc.c (nw)

This commit is contained in:
cracyc 2014-03-27 21:31:00 +00:00
parent 2026fc5a9d
commit 8d2db3434a
10 changed files with 1806 additions and 1795 deletions

4
.gitattributes vendored
View File

@ -7688,6 +7688,7 @@ src/mess/drivers/hx20.c svneol=native#text/plain
src/mess/drivers/hyperscan.c svneol=native#text/plain
src/mess/drivers/ibm6580.c svneol=native#text/plain
src/mess/drivers/ibmpc.c svneol=native#text/plain
src/mess/drivers/ibmpcjr.c svneol=native#text/plain
src/mess/drivers/ie15.c svneol=native#text/plain
src/mess/drivers/if800.c svneol=native#text/plain
src/mess/drivers/imds.c svneol=native#text/plain
@ -7967,6 +7968,7 @@ src/mess/drivers/swtpc09.c svneol=native#text/plain
src/mess/drivers/sym1.c svneol=native#text/plain
src/mess/drivers/sys2900.c svneol=native#text/plain
src/mess/drivers/systec.c svneol=native#text/plain
src/mess/drivers/tandy1t.c svneol=native#text/plain
src/mess/drivers/tandy2k.c svneol=native#text/plain
src/mess/drivers/tavernie.c svneol=native#text/plain
src/mess/drivers/tdv2324.c svneol=native#text/plain
@ -8245,7 +8247,6 @@ src/mess/includes/superslave.h svneol=native#text/plain
src/mess/includes/svi318.h svneol=native#text/plain
src/mess/includes/svision.h svneol=native#text/plain
src/mess/includes/swtpc09.h svneol=native#text/plain
src/mess/includes/tandy1t.h svneol=native#text/plain
src/mess/includes/tandy2k.h svneol=native#text/plain
src/mess/includes/tdv2324.h svneol=native#text/plain
src/mess/includes/tek405x.h svneol=native#text/plain
@ -8611,7 +8612,6 @@ src/mess/machine/svi318.c svneol=native#text/plain
src/mess/machine/swim.c svneol=native#text/plain
src/mess/machine/swim.h svneol=native#text/plain
src/mess/machine/swtpc09.c svneol=native#text/plain
src/mess/machine/tandy1t.c svneol=native#text/plain
src/mess/machine/tandy2kb.c svneol=native#text/plain
src/mess/machine/tandy2kb.h svneol=native#text/plain
src/mess/machine/thomflop.c svneol=native#text/plain

754
src/mess/drivers/ibmpcjr.c Normal file
View File

@ -0,0 +1,754 @@
#include "emu.h"
#include "cpu/i86/i86.h"
#include "sound/sn76496.h"
#include "sound/speaker.h"
#include "video/pc_t1t.h"
#include "machine/ins8250.h"
#include "machine/i8255.h"
#include "machine/pic8259.h"
#include "machine/pit8253.h"
#include "machine/ram.h"
#include "machine/pckeybrd.h"
#include "machine/pc_lpt.h"
#include "machine/pc_fdc.h"
#include "bus/rs232/rs232.h"
#include "bus/rs232/ser_mouse.h"
#include "bus/pc_joy/pc_joy.h"
#include "bus/isa/fdc.h"
#include "imagedev/cassette.h"
#include "imagedev/cartslot.h"
class pcjr_state : public driver_device
{
public:
pcjr_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_pic8259(*this, "pic8259"),
m_pit8253(*this, "pit8253"),
m_speaker(*this, "speaker"),
m_cassette(*this, "cassette"),
m_ram(*this, RAM_TAG),
m_fdc(*this, "fdc")
{ }
required_device<cpu_device> m_maincpu;
required_device<pic8259_device> m_pic8259;
required_device<pit8253_device> m_pit8253;
required_device<speaker_sound_device> m_speaker;
required_device<cassette_image_device> m_cassette;
required_device<ram_device> m_ram;
required_device<upd765a_device> m_fdc;
TIMER_DEVICE_CALLBACK_MEMBER(frame_interrupt);
DECLARE_WRITE_LINE_MEMBER(out2_changed);
DECLARE_WRITE8_MEMBER(pc_nmi_enable_w);
DECLARE_READ8_MEMBER(pcjr_nmi_enable_r);
DECLARE_WRITE_LINE_MEMBER(pic8259_set_int_line);
DECLARE_WRITE8_MEMBER(pcjr_ppi_portb_w);
DECLARE_READ8_MEMBER(pcjr_ppi_porta_r);
DECLARE_READ8_MEMBER(pcjr_ppi_portc_r);
DECLARE_WRITE8_MEMBER(pcjr_fdc_dor_w);
DECLARE_READ8_MEMBER(pcjx_port_1ff_r);
DECLARE_WRITE8_MEMBER(pcjx_port_1ff_w);
void pcjx_set_bank(int unk1, int unk2, int unk3);
IRQ_CALLBACK_MEMBER(pc_irq_callback) { return m_pic8259->acknowledge(); }
DECLARE_DEVICE_IMAGE_LOAD_MEMBER( pcjr_cartridge );
void pc_speaker_set_spkrdata(UINT8 data);
UINT8 m_pc_spkrdata;
UINT8 m_pit_out2;
UINT8 m_pcjr_dor;
UINT8 m_pcjx_1ff_count;
UINT8 m_pcjx_1ff_val;
UINT8 m_pcjx_1ff_bankval;
UINT8 m_pcjx_1ff_bank[20][2];
int m_ppi_portc_switch_high;
UINT8 m_ppi_portb;
UINT8 m_pc_keyb_data;
UINT8 m_transferring;
UINT8 m_latch;
UINT32 m_raw_keyb_data;
int m_signal_count;
UINT8 m_nmi_enabled;
void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
emu_timer *m_pc_int_delay_timer;
emu_timer *m_pcjr_watchdog;
emu_timer *m_keyb_signal_timer;
enum
{
TIMER_IRQ_DELAY,
TIMER_WATCHDOG,
TIMER_KB_SIGNAL
};
void machine_reset();
DECLARE_DRIVER_INIT(pcjr);
};
INPUT_PORTS_EXTERN(t1000_keyboard);
static INPUT_PORTS_START( ibmpcjr )
PORT_INCLUDE( t1000_keyboard )
PORT_MODIFY("pc_keyboard_3")
PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Caps") PORT_CODE(KEYCODE_CAPSLOCK)
PORT_MODIFY("pc_keyboard_4")
PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("NumLock") PORT_CODE(KEYCODE_NUMLOCK)
PORT_START("IN0") /* IN0 */
PORT_BIT ( 0xf0, 0xf0, IPT_UNUSED )
PORT_BIT ( 0x08, 0x08, IPT_CUSTOM ) PORT_VBLANK("pcvideo_pcjr:screen")
PORT_BIT ( 0x07, 0x07, IPT_UNUSED )
INPUT_PORTS_END
DRIVER_INIT_MEMBER(pcjr_state, pcjr)
{
m_pc_int_delay_timer = timer_alloc(TIMER_IRQ_DELAY);
m_pcjr_watchdog = timer_alloc(TIMER_WATCHDOG);
m_keyb_signal_timer = timer_alloc(TIMER_KB_SIGNAL);
m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(pcjr_state::pc_irq_callback),this));
at_keyboard_init(machine(), AT_KEYBOARD_TYPE_PC);
at_keyboard_set_scan_code_set(1);
}
void pcjr_state::machine_reset()
{
m_pc_spkrdata = 0;
m_pit_out2 = 1;
m_ppi_portc_switch_high = 0;
m_ppi_portb = 0;
m_pcjr_dor = 0;
m_speaker->level_w(0);
m_pcjx_1ff_count = 0;
m_pcjx_1ff_val = 0;
m_pcjx_1ff_bankval = 0;
memset(m_pcjx_1ff_bank, 0, sizeof(m_pcjx_1ff_bank));
m_transferring = 0;
m_latch = 0;
m_raw_keyb_data = 0;
m_nmi_enabled = 0x80;
}
void pcjr_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
switch(id)
{
case TIMER_IRQ_DELAY:
m_maincpu->set_input_line(0, param ? ASSERT_LINE : CLEAR_LINE);
break;
case TIMER_WATCHDOG:
if(m_pcjr_dor & 0x20)
m_pic8259->ir6_w(1);
else
m_pic8259->ir6_w(0);
break;
case TIMER_KB_SIGNAL:
m_raw_keyb_data = m_raw_keyb_data >> 1;
m_signal_count--;
if ( m_signal_count <= 0 )
{
m_keyb_signal_timer->adjust( attotime::never, 0, attotime::never );
m_transferring = 0;
}
break;
}
}
/*************************************************************
*
* PCJR pic8259 configuration
*
* Part of the PCJR CRT POST test at address F0452/F0454 writes
* to the PIC enabling an IRQ which is then immediately fired,
* however it is expected that the actual IRQ is taken one
* instruction later (the irq bit is reset by the instruction
* at F0454). Delaying taking of an IRQ by one instruction for
* all cases breaks floppy emulation. This seems to be a really
* tight corner case. For now we delay the IRQ by one instruction
* only for the PCJR and only when it's inside the POST checks.
*
*************************************************************/
WRITE_LINE_MEMBER(pcjr_state::pic8259_set_int_line)
{
UINT32 pc = m_maincpu->pc();
if ( (pc == 0xF0453) || (pc == 0xFF196) )
{
m_pc_int_delay_timer->adjust( m_maincpu->cycles_to_attotime(20), state );
}
else
{
m_maincpu->set_input_line(0, state ? ASSERT_LINE : CLEAR_LINE);
}
}
/*************************************************************************
*
* PC Speaker related
*
*************************************************************************/
void pcjr_state::pc_speaker_set_spkrdata(UINT8 data)
{
m_pc_spkrdata = data ? 1 : 0;
m_speaker->level_w(m_pc_spkrdata & m_pit_out2);
}
WRITE_LINE_MEMBER(pcjr_state::out2_changed)
{
m_pit_out2 = state ? 1 : 0;
m_speaker->level_w(m_pc_spkrdata & m_pit_out2);
}
/*************************************************************
*
* PCJR NMI and raw keybaord handling
*
* raw signals on the keyboard cable:
* ---_-b0b1b2b3b4b5b6b7pa----------------------
* | | | | | | | | | | |
* | | | | | | | | | | *--- 11 stop bits ( -- = 1 stop bit )
* | | | | | | | | | *----- parity bit ( 0 = _-, 1 = -_ )
* | | | | | | | | *------- bit 7 ( 0 = _-, 1 = -_ )
* | | | | | | | *--------- bit 6 ( 0 = _-, 1 = -_ )
* | | | | | | *----------- bit 5 ( 0 = _-, 1 = -_ )
* | | | | | *------------- bit 4 ( 0 = _-, 1 = -_ )
* | | | | *--------------- bit 3 ( 0 = _-, 1 = -_ )
* | | | *----------------- bit 2 ( 0 = _-, 1 = -_ )
* | | *------------------- bit 1 ( 0 = _-, 1 = -_ )
* | *--------------------- bit 0 ( 0 = _-, 1 = -_ )
* *----------------------- start bit (always _- )
*
* An entire bit lasts for 440 uSec, half bit time is 220 uSec.
* Transferring an entire byte takes 21 x 440uSec. The extra
* time of the stop bits is to allow the CPU to do other things
* besides decoding keyboard signals.
*
* These signals get inverted before going to the PCJR
* handling hardware. The sequence for the start then
* becomes:
*
* __-_b0b1.....
* |
* *---- on the 0->1 transition of the start bit a keyboard
* latch signal is set to 1 and an NMI is generated
* when enabled.
* The keyboard latch is reset by reading from the
* NMI enable port (A0h).
*
*************************************************************/
TIMER_DEVICE_CALLBACK_MEMBER(pcjr_state::frame_interrupt)
{
int data;
if((param % 64) || m_transferring)
return;
at_keyboard_polling();
if ( (data=at_keyboard_read())!=-1)
{
UINT8 parity = 0;
int i;
m_pc_keyb_data = data;
/* Calculate the raw data */
for( i = 0; i < 8; i++ )
{
if ( ( 1 << i ) & data )
{
parity ^= 1;
}
}
m_raw_keyb_data = 0;
m_raw_keyb_data = ( m_raw_keyb_data << 2 ) | ( parity ? 1 : 2 );
for( i = 0; i < 8; i++ )
{
m_raw_keyb_data = ( m_raw_keyb_data << 2 ) | ( ( data & 0x80 ) ? 1 : 2 );
data <<= 1;
}
/* Insert start bit */
m_raw_keyb_data = ( m_raw_keyb_data << 2 ) | 1;
m_signal_count = 20 + 22;
/* we are now transferring a byte of keyboard data */
m_transferring = 1;
/* Set timer */
m_keyb_signal_timer->adjust( attotime::from_usec(220), 0, attotime::from_usec(220) );
m_latch = 1;
}
m_maincpu->set_input_line(INPUT_LINE_NMI, m_latch && m_nmi_enabled);
}
READ8_MEMBER(pcjr_state::pcjr_nmi_enable_r)
{
m_latch = 0;
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
return m_nmi_enabled;
}
WRITE8_MEMBER(pcjr_state::pc_nmi_enable_w)
{
m_nmi_enabled = data & 0x80;
}
WRITE8_MEMBER(pcjr_state::pcjr_ppi_portb_w)
{
/* KB controller port B */
m_ppi_portb = data;
m_ppi_portc_switch_high = data & 0x08;
m_pit8253->write_gate2(BIT(data, 0));
pc_speaker_set_spkrdata( data & 0x02 );
m_cassette->change_state(( data & 0x08 ) ? CASSETTE_MOTOR_DISABLED : CASSETTE_MOTOR_ENABLED,CASSETTE_MASK_MOTOR);
}
/*
* Port C connections on a PCJR (notes from schematics):
* PC0 - KYBD LATCH
* PC1 - MODEM CD INSTALLED
* PC2 - DISKETTE CD INSTALLED
* PC3 - ATR CD IN
* PC4 - cassette audio
* PC5 - OUT2 from 8253
* PC6 - KYBD IN
* PC7 - (keyboard) CABLE CONNECTED
*/
READ8_MEMBER(pcjr_state::pcjr_ppi_portc_r)
{
int data=0xff;
data&=~0x80;
data &= ~0x04; /* floppy drive installed */
if ( m_ram->size() > 64 * 1024 ) /* more than 64KB ram installed */
data &= ~0x08;
data = ( data & ~0x01 ) | ( m_latch ? 0x01: 0x00 );
if ( ! ( m_ppi_portb & 0x08 ) )
{
double tap_val = m_cassette->input();
if ( tap_val < 0 )
{
data &= ~0x10;
}
else
{
data |= 0x10;
}
}
else
{
if ( m_ppi_portb & 0x01 )
{
data = ( data & ~0x10 ) | ( m_pit_out2 ? 0x10 : 0x00 );
}
}
data = ( data & ~0x20 ) | ( m_pit_out2 ? 0x20 : 0x00 );
data = ( data & ~0x40 ) | ( ( m_raw_keyb_data & 0x01 ) ? 0x40 : 0x00 );
return data;
}
I8255_INTERFACE( pcjr_ppi8255_interface )
{
DEVCB_CONSTANT(0xff),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_MEMBER(pcjr_state,pcjr_ppi_portb_w),
DEVCB_DRIVER_MEMBER(pcjr_state,pcjr_ppi_portc_r),
DEVCB_NULL
};
WRITE8_MEMBER(pcjr_state::pcjr_fdc_dor_w)
{
logerror("fdc: dor = %02x\n", data);
UINT8 pdor = m_pcjr_dor;
floppy_image_device *floppy0 = m_fdc->subdevice<floppy_connector>("0")->get_device();
floppy_image_device *floppy1 = NULL;
if(m_fdc->subdevice("1"))
floppy1 = m_fdc->subdevice<floppy_connector>("1")->get_device();
m_pcjr_dor = data;
if(floppy0)
floppy0->mon_w(!(m_pcjr_dor & 1));
if(floppy1)
floppy1->mon_w(!(m_pcjr_dor & 2));
if(m_pcjr_dor & 1)
m_fdc->set_floppy(floppy0);
else if(m_pcjr_dor & 2)
m_fdc->set_floppy(floppy1);
else
m_fdc->set_floppy(NULL);
if((pdor^m_pcjr_dor) & 0x80)
m_fdc->reset();
if(m_pcjr_dor & 0x20) {
if((pdor & 0x40) && !(m_pcjr_dor & 0x40))
m_pcjr_watchdog->adjust(attotime::from_seconds(3));
} else {
m_pcjr_watchdog->adjust(attotime::never);
m_pic8259->ir6_w(0);
}
}
// pcjx port 0x1ff, some info from Toshiya Takeda
void pcjr_state::pcjx_set_bank(int unk1, int unk2, int unk3)
{
logerror("pcjx: 0x1ff 0:%02x 1:%02x 2:%02x\n", unk1, unk2, unk3);
}
WRITE8_MEMBER(pcjr_state::pcjx_port_1ff_w)
{
switch(m_pcjx_1ff_count) {
case 0:
m_pcjx_1ff_bankval = data;
m_pcjx_1ff_count++;
break;
case 1:
m_pcjx_1ff_bank[m_pcjx_1ff_bankval & 0x1f][0] = data;
m_pcjx_1ff_count++;
break;
case 2:
m_pcjx_1ff_bank[m_pcjx_1ff_bankval & 0x1f][1] = data;
m_pcjx_1ff_count = 0;
pcjx_set_bank(m_pcjx_1ff_bankval, m_pcjx_1ff_bank[m_pcjx_1ff_bankval & 0x1f][0], data);
break;
}
}
READ8_MEMBER(pcjr_state::pcjx_port_1ff_r)
{
if(m_pcjx_1ff_count == 2)
pcjx_set_bank(m_pcjx_1ff_bankval, m_pcjx_1ff_bank[m_pcjx_1ff_bankval & 0x1f][0], m_pcjx_1ff_bank[m_pcjx_1ff_bankval & 0x1f][1]);
m_pcjx_1ff_count = 0;
return 0x60; // expansion?
}
DEVICE_IMAGE_LOAD_MEMBER( pcjr_state, pcjr_cartridge )
{
UINT32 address;
UINT32 size;
address = (!strcmp(":cart2", image.device().tag())) ? 0xd0000 : 0xe0000;
if ( image.software_entry() )
{
UINT8 *cart = image.get_software_region( "rom" );
size = image.get_software_region_length("rom" );
memcpy( memregion("maincpu")->base() + address, cart, size );
}
else
{
UINT8 header[0x200];
unsigned header_size = 0;
unsigned image_size = image.length();
bool imagic_hack = false;
/* Check for supported header sizes */
switch( image_size & 0x3ff )
{
case 0x80:
header_size = 0x80;
break;
case 0x200:
header_size = 0x200;
break;
default:
image.seterror(IMAGE_ERROR_UNSUPPORTED, "Invalid header size" );
return IMAGE_INIT_FAIL;
}
/* Check for supported image sizes */
switch( image_size - header_size )
{
case 0xa000:
imagic_hack = true;
case 0x2000:
case 0x4000:
case 0x8000:
case 0x10000:
break;
default:
image.seterror(IMAGE_ERROR_UNSUPPORTED, "Invalid rom file size" );
return IMAGE_INIT_FAIL;
}
/* Read and verify the header */
if ( header_size != image.fread( header, header_size ) )
{
image.seterror(IMAGE_ERROR_UNSUPPORTED, "Unable to read header" );
return IMAGE_INIT_FAIL;
}
/* Read the cartridge contents */
if ( ( image_size - header_size ) != image.fread(memregion("maincpu")->base() + address, image_size - header_size ) )
{
image.seterror(IMAGE_ERROR_UNSUPPORTED, "Unable to read cartridge contents" );
return IMAGE_INIT_FAIL;
}
if (imagic_hack)
{
UINT8 *cart_area = memregion("maincpu")->base() + address;
memcpy( cart_area + 0xe000, cart_area + 0x2000, 0x2000 );
memcpy( cart_area + 0xc000, cart_area + 0x2000, 0x2000 );
memcpy( cart_area + 0xa000, cart_area + 0x2000, 0x2000 );
memcpy( cart_area + 0x8000, cart_area + 0x2000, 0x2000 );
memcpy( cart_area + 0x6000, cart_area, 0x2000 );
memcpy( cart_area + 0x4000, cart_area, 0x2000 );
memcpy( cart_area + 0x2000, cart_area, 0x2000 );
}
}
return IMAGE_INIT_PASS;
}
static SLOT_INTERFACE_START( pcjr_floppies )
SLOT_INTERFACE( "525dd", FLOPPY_525_DD )
SLOT_INTERFACE( "35dd", FLOPPY_35_DD )
SLOT_INTERFACE_END
static SLOT_INTERFACE_START(pcjr_com)
SLOT_INTERFACE("microsoft_mouse", MSFT_SERIAL_MOUSE)
SLOT_INTERFACE("mousesys_mouse", MSYSTEM_SERIAL_MOUSE)
SLOT_INTERFACE_END
static const gfx_layout pc_8_charlayout =
{
8, 8, /* 8 x 8 characters */
512, /* 512 characters */
1, /* 1 bits per pixel */
{ 0 }, /* no bitplanes */
/* x offsets */
{ 0, 1, 2, 3, 4, 5, 6, 7 },
/* y offsets */
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
8*8 /* every char takes 8 bytes */
};
static const gfx_layout kanji_layout =
{
16, 16, /* 8 x 8 characters */
RGN_FRAC(1,1), /* 512 characters */
1, /* 1 bits per pixel */
{ 0 }, /* no bitplanes */
/* x offsets */
{ STEP16(0,1) },
/* y offsets */
{ STEP16(0,16) },
16*16 /* every char takes 8 bytes */
};
static GFXDECODE_START( pcjr )
GFXDECODE_ENTRY( "gfx1", 0x0000, pc_8_charlayout, 3, 1 )
GFXDECODE_END
static const cassette_interface pcjr_cassette_interface =
{
cassette_default_formats,
NULL,
(cassette_state)(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED),
NULL,
NULL
};
const ins8250_interface pcjr_com_interface =
{
DEVCB_DEVICE_LINE_MEMBER("serport", rs232_port_device, write_txd),
DEVCB_DEVICE_LINE_MEMBER("serport", rs232_port_device, write_dtr),
DEVCB_DEVICE_LINE_MEMBER("serport", rs232_port_device, write_rts),
DEVCB_DEVICE_LINE_MEMBER("pic8259", pic8259_device, ir3_w),
DEVCB_NULL,
DEVCB_NULL
};
static ADDRESS_MAP_START(ibmpcjr_map, AS_PROGRAM, 8, pcjr_state)
AM_RANGE(0x00000, 0x9ffff) AM_RAMBANK("bank10")
AM_RANGE(0xa0000, 0xaffff) AM_RAM
AM_RANGE(0xb0000, 0xb7fff) AM_NOP
AM_RANGE(0xb8000, 0xbffff) AM_RAMBANK("bank14")
AM_RANGE(0xc0000, 0xc7fff) AM_NOP
AM_RANGE(0xc8000, 0xc9fff) AM_ROM
AM_RANGE(0xca000, 0xcffff) AM_NOP
AM_RANGE(0xd0000, 0xdffff) AM_ROM
AM_RANGE(0xe0000, 0xeffff) AM_ROM
AM_RANGE(0xf0000, 0xfffff) AM_ROM
ADDRESS_MAP_END
static ADDRESS_MAP_START(ibmpcjr_io, AS_IO, 8, pcjr_state)
AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE("pic8259", pic8259_device, read, write)
AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE("pit8253", pit8253_device, read, write)
AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE("ppi8255", i8255_device, read, write)
AM_RANGE(0x00a0, 0x00a0) AM_READWRITE(pcjr_nmi_enable_r, pc_nmi_enable_w )
AM_RANGE(0x00c0, 0x00c0) AM_DEVWRITE("sn76496", sn76496_device, write)
AM_RANGE(0x00f2, 0x00f2) AM_WRITE(pcjr_fdc_dor_w)
AM_RANGE(0x00f4, 0x00f5) AM_DEVICE("fdc", upd765a_device, map)
AM_RANGE(0x0200, 0x0207) AM_DEVREADWRITE("pc_joy", pc_joy_device, joy_port_r, joy_port_w)
AM_RANGE(0x02f8, 0x02ff) AM_DEVREADWRITE("ins8250", ins8250_device, ins8250_r, ins8250_w)
AM_RANGE(0x0378, 0x037b) AM_DEVREADWRITE("lpt_0", pc_lpt_device, read, write)
AM_RANGE(0x03d0, 0x03df) AM_DEVREADWRITE("pcvideo_pcjr", pcvideo_pcjr_device, read, write)
ADDRESS_MAP_END
static ADDRESS_MAP_START(ibmpcjx_map, AS_PROGRAM, 8, pcjr_state )
AM_RANGE(0x80000, 0xb7fff) AM_ROM AM_REGION("kanji",0)
AM_IMPORT_FROM( ibmpcjr_map )
ADDRESS_MAP_END
static ADDRESS_MAP_START(ibmpcjx_io, AS_IO, 8, pcjr_state)
AM_RANGE(0x01ff, 0x01ff) AM_READWRITE(pcjx_port_1ff_r, pcjx_port_1ff_w)
AM_IMPORT_FROM( ibmpcjr_io )
ADDRESS_MAP_END
static MACHINE_CONFIG_START( ibmpcjr, pcjr_state)
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8088, 4900000) \
MCFG_CPU_PROGRAM_MAP(ibmpcjr_map) \
MCFG_CPU_IO_MAP(ibmpcjr_io) \
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", pcjr_state, frame_interrupt, "pcvideo_pcjr:screen", 0, 1)
/*
On the PC Jr the input for clock 1 seems to be selectable
based on bit 4(/5?) written to output port A0h. This is not
supported yet.
*/
MCFG_DEVICE_ADD("pit8253", PIT8253, 0)
MCFG_PIT8253_CLK0(XTAL_14_31818MHz/12)
MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("pic8259", pic8259_device, ir0_w))
MCFG_PIT8253_CLK1(XTAL_14_31818MHz/12)
MCFG_PIT8253_CLK2(XTAL_14_31818MHz/12)
MCFG_PIT8253_OUT2_HANDLER(WRITELINE(pcjr_state, out2_changed))
MCFG_PIC8259_ADD( "pic8259", WRITELINE(pcjr_state, pic8259_set_int_line), VCC, NULL )
MCFG_I8255_ADD( "ppi8255", pcjr_ppi8255_interface )
MCFG_INS8250_ADD( "ins8250", pcjr_com_interface, XTAL_1_8432MHz )
MCFG_RS232_PORT_ADD( "serport", pcjr_com, NULL )
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("ins8250", ins8250_uart_device, rx_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("ins8250", ins8250_uart_device, dcd_w))
MCFG_RS232_DSR_HANDLER(DEVWRITELINE("ins8250", ins8250_uart_device, dsr_w))
MCFG_RS232_RI_HANDLER(DEVWRITELINE("ins8250", ins8250_uart_device, ri_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("ins8250", ins8250_uart_device, cts_w))
/* video hardware */
MCFG_PCVIDEO_PCJR_ADD("pcvideo_pcjr")
MCFG_GFXDECODE_ADD("gfxdecode", "pcvideo_pcjr:palette", pcjr)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
MCFG_SOUND_ADD("sn76496", SN76496, XTAL_14_31818MHz/4)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
/* printer */
MCFG_DEVICE_ADD("lpt_0", PC_LPT, 0)
MCFG_PC_LPT_IRQ_HANDLER(DEVWRITELINE("pic8259", pic8259_device, ir7_w))
MCFG_PC_JOY_ADD("pc_joy")
/* cassette */
MCFG_CASSETTE_ADD( "cassette", pcjr_cassette_interface )
MCFG_UPD765A_ADD("fdc", false, false)
MCFG_FLOPPY_DRIVE_ADD("fdc:0", pcjr_floppies, "525dd", isa8_fdc_device::floppy_formats)
MCFG_SLOT_FIXED(true)
/* cartridge */
MCFG_CARTSLOT_ADD("cart1")
MCFG_CARTSLOT_INTERFACE("ibmpcjr_cart")
MCFG_CARTSLOT_EXTENSION_LIST("jrc")
MCFG_CARTSLOT_NOT_MANDATORY
MCFG_CARTSLOT_LOAD(pcjr_state,pcjr_cartridge)
MCFG_CARTSLOT_ADD("cart2")
MCFG_CARTSLOT_INTERFACE("ibmpcjr_cart")
MCFG_CARTSLOT_EXTENSION_LIST("jrc")
MCFG_CARTSLOT_NOT_MANDATORY
MCFG_CARTSLOT_LOAD(pcjr_state,pcjr_cartridge)
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("640K")
/* Software lists */
MCFG_SOFTWARE_LIST_ADD("cart_list","ibmpcjr_cart")
MCFG_SOFTWARE_LIST_ADD("flop_list","ibmpcjr_flop")
MACHINE_CONFIG_END
static GFXDECODE_START( ibmpcjx )
GFXDECODE_ENTRY( "gfx1", 0x0000, pc_8_charlayout, 3, 1 )
GFXDECODE_ENTRY( "kanji", 0x0000, kanji_layout, 3, 1 )
GFXDECODE_END
static MACHINE_CONFIG_DERIVED( ibmpcjx, ibmpcjr )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(ibmpcjx_map)
MCFG_CPU_IO_MAP(ibmpcjx_io)
MCFG_DEVICE_REMOVE("fdc:0");
MCFG_FLOPPY_DRIVE_ADD("fdc:0", pcjr_floppies, "35dd", isa8_fdc_device::floppy_formats)
MCFG_SLOT_FIXED(true)
MCFG_FLOPPY_DRIVE_ADD("fdc:1", pcjr_floppies, "35dd", isa8_fdc_device::floppy_formats)
MCFG_SLOT_FIXED(true)
MCFG_GFXDECODE_MODIFY("gfxdecode", ibmpcjx)
MACHINE_CONFIG_END
ROM_START( ibmpcjr )
ROM_REGION(0x100000,"maincpu", 0)
ROM_LOAD("bios.rom", 0xf0000, 0x10000,CRC(31e3a7aa) SHA1(1f5f7013f18c08ff50d7942e76c4fbd782412414))
ROM_REGION(0x08100,"gfx1", 0)
ROM_LOAD("cga.chr", 0x00000, 0x01000, CRC(42009069) SHA1(ed08559ce2d7f97f68b9f540bddad5b6295294dd)) // from an unknown clone cga card
ROM_END
ROM_START( ibmpcjx )
ROM_REGION(0x100000,"maincpu", ROMREGION_ERASEFF)
ROM_DEFAULT_BIOS("unk")
ROM_SYSTEM_BIOS( 0, "5601jda", "5601jda" )
ROMX_LOAD("5601jda.bin", 0xf0000, 0x10000, CRC(b1e12366) SHA1(751feb16b985aa4f1ec1437493ff77e2ebd5e6a6), ROM_BIOS(1))
ROMX_LOAD("basicjx.rom", 0xe8000, 0x08000, NO_DUMP, ROM_BIOS(1)) // boot fails due of this.
ROM_SYSTEM_BIOS( 1, "unk", "unk" )
ROMX_LOAD("ipljx.rom", 0xe0000, 0x20000, CRC(36a7b2de) SHA1(777db50c617725e149bca9b18cf51ce78f6dc548), ROM_BIOS(2))
ROM_REGION(0x08100,"gfx1", 0) //TODO: needs a different charset
ROM_LOAD("cga.chr", 0x00000, 0x01000, BAD_DUMP CRC(42009069) SHA1(ed08559ce2d7f97f68b9f540bddad5b6295294dd)) // from an unknown clone cga card
ROM_REGION(0x38000,"kanji", 0)
ROM_LOAD("kanji.rom", 0x00000, 0x38000, BAD_DUMP CRC(eaa6e3c3) SHA1(35554587d02d947fae8446964b1886fff5c9d67f)) // hand-made rom
ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */
// pcjr
COMP( 1983, ibmpcjr, ibm5150, 0, ibmpcjr, ibmpcjr, pcjr_state, pcjr, "International Business Machines", "IBM PC Jr", GAME_IMPERFECT_COLORS )
COMP( 1985, ibmpcjx, ibm5150, 0, ibmpcjx, ibmpcjr, pcjr_state, pcjr, "International Business Machines", "IBM PC JX", GAME_IMPERFECT_COLORS | GAME_NOT_WORKING)

View File

@ -17,37 +17,6 @@ Driver file for IBM PC, IBM PC XT, and related machines.
F0000-FDFFF NOP or ROM Basic + other Extensions
FE000-FFFFF ROM
Tandy 1000
==========
Tandy 1000 machines are similar to the IBM 5160s with CGA graphics. Tandy
added some additional graphic capabilities similar, but not equal, to
those added for the IBM PC Jr.
Tandy 1000 (8088) variations:
1000 128KB-640KB RAM 4.77 MHz v01.00.00, v01.01.00
1000A/1000HD 128KB-640KB RAM 4.77 MHz v01.01.00
1000SX/1000AX 384KB-640KB RAM 7.16/4.77 MHz v01.02.00
1000EX 256KB-640KB RAM 7.16/4.77 MHz v01.02.00
1000HX 256KB-640KB RAM 7.16/4.77 MHz v02.00.00
Tandy 1000 (8086) variations:
1000RL/1000RL-HD 512KB-768KB RAM 9.44/4.77 MHz v02.00.00, v02.00.01
1000SL/1000PC 384KB-640KB RAM 8.0/4.77 MHz v01.04.00, v01.04.01, v01.04.02, v02.00.01
1000SL/2 512KB-640KB RAM 8.0/4.77 MHz v01.04.04
Tandy 1000 (80286) variations:
1000TX 640KB-768KB RAM 8.0/4.77 MHz v01.03.00
1000TL 640KB-768KB RAM 8.0/4.77 MHz v01.04.00, v01.04.01, v01.04.02
1000TL/2 640KB-768KB RAM 8.0/4.77 MHz v02.00.00
1000TL/3 640KB-768KB RAM 10.0/5.0 MHz v02.00.00
1000RLX 512KB-1024KB RAM 10.0/5.0 MHz v02.00.00
1000RLX-HD 1024MB RAM 10.0/5.0 MHz v02.00.00
Tandy 1000 (80386) variations:
1000RSX/1000RSX-HD 1M-9M RAM 25.0/8.0 MHz v01.10.00
IBM5550
=======
Information can be found at http://homepage3.nifty.com/ibm5550/index-e.html
@ -73,7 +42,6 @@ video HW too.
#include "machine/pit8253.h"
#include "bus/isa/isa.h"
#include "bus/isa/isa_cards.h"
#include "video/pc_t1t.h"
#include "machine/pc_fdc.h"
#include "bus/pc_joy/pc_joy.h"
@ -81,7 +49,6 @@ video HW too.
#include "machine/pc_lpt.h"
#include "includes/europc.h"
#include "includes/tandy1t.h"
#include "includes/pc.h"
@ -269,142 +236,6 @@ static ADDRESS_MAP_START(europc_io, AS_IO, 8, europc_pc_state )
ADDRESS_MAP_END
static ADDRESS_MAP_START(tandy1000_map, AS_PROGRAM, 8, tandy_pc_state )
AM_RANGE(0x00000, 0x9ffff) AM_RAMBANK("bank10")
AM_RANGE(0xa0000, 0xaffff) AM_RAM
AM_RANGE(0xb0000, 0xb7fff) AM_NOP
AM_RANGE(0xb8000, 0xbffff) AM_DEVREADWRITE("pcvideo_t1000", pcvideo_t1000_device, videoram_r, videoram_w);
AM_RANGE(0xc0000, 0xc7fff) AM_NOP
AM_RANGE(0xc8000, 0xc9fff) AM_ROM
AM_RANGE(0xca000, 0xcffff) AM_NOP
AM_RANGE(0xd0000, 0xeffff) AM_NOP
AM_RANGE(0xf0000, 0xfffff) AM_ROM
ADDRESS_MAP_END
static ADDRESS_MAP_START(tandy1000_io, AS_IO, 8, tandy_pc_state )
AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE("dma8237", am9517a_device, read, write)
AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE("pic8259", pic8259_device, read, write)
AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE("pit8253", pit8253_device, read, write)
AM_RANGE(0x0060, 0x0063) AM_READWRITE(tandy1000_pio_r, tandy1000_pio_w)
AM_RANGE(0x0080, 0x0087) AM_READWRITE(pc_page_r, pc_page_w)
AM_RANGE(0x00c0, 0x00c0) AM_DEVWRITE("sn76496", ncr7496_device, write)
AM_RANGE(0x0200, 0x0207) AM_DEVREADWRITE("pc_joy", pc_joy_device, joy_port_r, joy_port_w)
AM_RANGE(0x02f8, 0x02ff) AM_DEVREADWRITE("ins8250_1", ins8250_device, ins8250_r, ins8250_w)
AM_RANGE(0x0378, 0x037f) AM_READWRITE(pc_t1t_p37x_r, pc_t1t_p37x_w)
AM_RANGE(0x03bc, 0x03be) AM_DEVREADWRITE("lpt_0", pc_lpt_device, read, write)
AM_RANGE(0x03d0, 0x03df) AM_DEVREADWRITE("pcvideo_t1000", pcvideo_t1000_device, read, write)
AM_RANGE(0x03f0, 0x03f7) AM_DEVICE("fdc", pc_fdc_interface, map)
AM_RANGE(0x03f8, 0x03ff) AM_DEVREADWRITE("ins8250_0", ins8250_device, ins8250_r, ins8250_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START(tandy1000_16_map, AS_PROGRAM, 16, pc_state )
AM_RANGE(0x00000, 0x9ffff) AM_RAMBANK("bank10")
AM_RANGE(0xa0000, 0xaffff) AM_RAM
AM_RANGE(0xb0000, 0xb7fff) AM_NOP
AM_RANGE(0xb8000, 0xbffff) AM_DEVREADWRITE8("pcvideo_t1000", pcvideo_t1000_device, videoram_r, videoram_w, 0xffff)
AM_RANGE(0xc0000, 0xc7fff) AM_NOP
AM_RANGE(0xc8000, 0xc9fff) AM_ROM
AM_RANGE(0xca000, 0xcffff) AM_NOP
AM_RANGE(0xe0000, 0xeffff) AM_ROMBANK("biosbank") /* Banked part of the BIOS */
AM_RANGE(0xf0000, 0xfffff) AM_ROM AM_REGION( "romcs0", 0x70000 )
ADDRESS_MAP_END
static ADDRESS_MAP_START(tandy1000_16_io, AS_IO, 16, tandy_pc_state )
AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff)
AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8("pic8259", pic8259_device, read, write, 0xffff)
AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xffff)
AM_RANGE(0x0060, 0x0063) AM_READWRITE8(tandy1000_pio_r, tandy1000_pio_w, 0xffff)
AM_RANGE(0x0080, 0x0087) AM_READWRITE8(pc_page_r, pc_page_w, 0xffff)
AM_RANGE(0x00c0, 0x00c1) AM_DEVWRITE8("sn76496", ncr7496_device, write, 0xffff)
AM_RANGE(0x0200, 0x0207) AM_DEVREADWRITE8("pc_joy", pc_joy_device, joy_port_r, joy_port_w, 0xffff)
AM_RANGE(0x02f8, 0x02ff) AM_DEVREADWRITE8("ins8250_1", ins8250_device, ins8250_r, ins8250_w, 0xffff)
AM_RANGE(0x0378, 0x037f) AM_READWRITE8(pc_t1t_p37x_r, pc_t1t_p37x_w, 0xffff)
AM_RANGE(0x03bc, 0x03bf) AM_DEVREADWRITE8("lpt_0", pc_lpt_device, read, write, 0xffff)
AM_RANGE(0x03d0, 0x03df) AM_DEVREADWRITE8("pcvideo_t1000", pcvideo_t1000_device, read, write, 0xffff)
AM_RANGE(0x03f0, 0x03f7) AM_DEVICE8("fdc", pc_fdc_interface, map, 0xffff)
AM_RANGE(0x03f8, 0x03ff) AM_DEVREADWRITE8("ins8250_0", ins8250_device, ins8250_r, ins8250_w, 0xffff)
AM_RANGE(0xffea, 0xffeb) AM_READWRITE8(tandy1000_bank_r, tandy1000_bank_w, 0xffff)
ADDRESS_MAP_END
static ADDRESS_MAP_START(tandy1000_286_map, AS_PROGRAM, 16, tandy_pc_state )
ADDRESS_MAP_GLOBAL_MASK(0x000fffff)
AM_RANGE(0x00000, 0x9ffff) AM_RAMBANK("bank10")
AM_RANGE(0xa0000, 0xaffff) AM_RAM
AM_RANGE(0xb0000, 0xb7fff) AM_NOP
AM_RANGE(0xb8000, 0xbffff) AM_DEVREADWRITE8("pcvideo_t1000", pcvideo_t1000_device, videoram_r, videoram_w, 0xffff)
AM_RANGE(0xc0000, 0xc7fff) AM_NOP
AM_RANGE(0xc8000, 0xc9fff) AM_ROM
AM_RANGE(0xca000, 0xcffff) AM_NOP
AM_RANGE(0xe0000, 0xeffff) AM_NOP
AM_RANGE(0xf8000, 0xfffff) AM_ROM
ADDRESS_MAP_END
static ADDRESS_MAP_START(tandy1000_286_io, AS_IO, 16, tandy_pc_state )
AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff)
AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8("pic8259", pic8259_device, read, write, 0xffff)
AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xffff)
AM_RANGE(0x0060, 0x0063) AM_READWRITE8(tandy1000_pio_r, tandy1000_pio_w, 0xffff)
AM_RANGE(0x0080, 0x0087) AM_READWRITE8(pc_page_r, pc_page_w, 0xffff)
AM_RANGE(0x00c0, 0x00c1) AM_DEVWRITE8("sn76496", ncr7496_device, write, 0xffff)
AM_RANGE(0x0200, 0x0207) AM_DEVREADWRITE8("pc_joy", pc_joy_device, joy_port_r, joy_port_w, 0xffff)
AM_RANGE(0x02f8, 0x02ff) AM_DEVREADWRITE8("ins8250_1", ins8250_device, ins8250_r, ins8250_w, 0xffff)
AM_RANGE(0x0378, 0x037f) AM_READWRITE8(pc_t1t_p37x_r, pc_t1t_p37x_w, 0xffff)
AM_RANGE(0x03bc, 0x03bf) AM_DEVREADWRITE8("lpt_0", pc_lpt_device, read, write, 0xffff)
AM_RANGE(0x03d0, 0x03df) AM_DEVREADWRITE8("pcvideo_t1000", pcvideo_t1000_device, read, write, 0xffff)
AM_RANGE(0x03f0, 0x03f7) AM_DEVICE8("fdc", pc_fdc_interface, map, 0xffff)
AM_RANGE(0x03f8, 0x03ff) AM_DEVREADWRITE8("ins8250_0", ins8250_device, ins8250_r, ins8250_w, 0xffff)
ADDRESS_MAP_END
static ADDRESS_MAP_START(ibmpcjr_map, AS_PROGRAM, 8, tandy_pc_state )
AM_RANGE(0x00000, 0x9ffff) AM_RAMBANK("bank10")
AM_RANGE(0xa0000, 0xaffff) AM_RAM
AM_RANGE(0xb0000, 0xb7fff) AM_NOP
AM_RANGE(0xb8000, 0xbffff) AM_RAMBANK("bank14")
AM_RANGE(0xc0000, 0xc7fff) AM_NOP
AM_RANGE(0xc8000, 0xc9fff) AM_ROM
AM_RANGE(0xca000, 0xcffff) AM_NOP
AM_RANGE(0xd0000, 0xdffff) AM_ROM
AM_RANGE(0xe0000, 0xeffff) AM_ROM
AM_RANGE(0xf0000, 0xfffff) AM_ROM
ADDRESS_MAP_END
static ADDRESS_MAP_START(ibmpcjr_io, AS_IO, 8, tandy_pc_state )
AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE("pic8259", pic8259_device, read, write)
AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE("pit8253", pit8253_device, read, write)
AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE("ppi8255", i8255_device, read, write)
AM_RANGE(0x00a0, 0x00a0) AM_READWRITE(pcjr_nmi_enable_r, pc_nmi_enable_w )
AM_RANGE(0x00c0, 0x00c0) AM_DEVWRITE("sn76496", sn76496_device, write)
AM_RANGE(0x00f2, 0x00f2) AM_WRITE(pcjr_fdc_dor_w)
AM_RANGE(0x00f4, 0x00f5) AM_DEVICE("upd765", upd765a_device, map)
AM_RANGE(0x0200, 0x0207) AM_DEVREADWRITE("pc_joy", pc_joy_device, joy_port_r, joy_port_w)
AM_RANGE(0x02f8, 0x02ff) AM_DEVREADWRITE("ins8250_1", ins8250_device, ins8250_r, ins8250_w)
AM_RANGE(0x0378, 0x037b) AM_DEVREADWRITE("lpt_0", pc_lpt_device, read, write)
AM_RANGE(0x03d0, 0x03df) AM_DEVREADWRITE("pcvideo_pcjr", pcvideo_pcjr_device, read, write)
ADDRESS_MAP_END
static ADDRESS_MAP_START(ibmpcjx_map, AS_PROGRAM, 8, pc_state )
AM_RANGE(0x80000, 0xb7fff) AM_ROM AM_REGION("kanji",0)
AM_IMPORT_FROM( ibmpcjr_map )
ADDRESS_MAP_END
static ADDRESS_MAP_START(ibmpcjx_io, AS_IO, 8, pc_state )
AM_RANGE(0x01ff, 0x01ff) AM_READWRITE(pcjx_port_1ff_r, pcjx_port_1ff_w)
AM_IMPORT_FROM( ibmpcjr_io )
ADDRESS_MAP_END
static INPUT_PORTS_START( pccga )
PORT_START("DSW0") /* IN1 */
PORT_DIPNAME( 0xc0, 0x40, "Number of floppy drives")
@ -635,56 +466,6 @@ static INPUT_PORTS_START( bondwell )
// PORT_INCLUDE( at_keyboard ) /* IN4 - IN11 */
INPUT_PORTS_END
static INPUT_PORTS_START( tandy1t )
PORT_START("IN0") /* IN0 */
PORT_BIT ( 0xf0, 0xf0, IPT_UNUSED )
PORT_BIT ( 0x08, 0x08, IPT_CUSTOM ) PORT_VBLANK("pcvideo_t1000:screen")
PORT_BIT ( 0x07, 0x07, IPT_UNUSED )
PORT_START("DSW0") /* IN1 */
PORT_BIT ( 0xff, 0xff, IPT_UNUSED )
PORT_START("DSW1") /* IN2 */
PORT_DIPNAME( 0x80, 0x80, "COM1: enable")
PORT_DIPSETTING( 0x00, DEF_STR( No ) )
PORT_DIPSETTING( 0x80, DEF_STR( Yes ) )
PORT_DIPNAME( 0x40, 0x40, "COM2: enable")
PORT_DIPSETTING( 0x00, DEF_STR( No ) )
PORT_DIPSETTING( 0x40, DEF_STR( Yes ) )
PORT_BIT ( 0x30, 0x00, IPT_UNUSED )
PORT_DIPNAME( 0x08, 0x08, "LPT1: enable")
PORT_DIPSETTING( 0x00, DEF_STR( No ) )
PORT_DIPSETTING( 0x08, DEF_STR( Yes ) )
PORT_BIT ( 0x06, 0x00, IPT_UNUSED )
PORT_DIPNAME( 0x01, 0x00, "Game port enable")
PORT_DIPSETTING( 0x00, DEF_STR( No ) )
PORT_DIPSETTING( 0x01, DEF_STR( Yes ) )
PORT_START("DSW2") /* IN3 */
PORT_DIPNAME( 0x08, 0x08, "HDC1 (C800:0 port 320-323)")
PORT_DIPSETTING( 0x00, DEF_STR( No ) )
PORT_DIPSETTING( 0x08, DEF_STR( Yes ) )
PORT_DIPNAME( 0x04, 0x04, "HDC2 (CA00:0 port 324-327)")
PORT_DIPSETTING( 0x00, DEF_STR( No ) )
PORT_DIPSETTING( 0x04, DEF_STR( Yes ) )
PORT_BIT( 0x02, 0x02, IPT_UNUSED ) /* no turbo switch */
PORT_BIT( 0x01, 0x01, IPT_UNUSED )
PORT_INCLUDE( t1000_keyboard )
INPUT_PORTS_END
static INPUT_PORTS_START( ibmpcjr )
PORT_INCLUDE( tandy1t )
PORT_MODIFY("pc_keyboard_3")
PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Caps") PORT_CODE(KEYCODE_CAPSLOCK)
PORT_MODIFY("pc_keyboard_4")
PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("NumLock") PORT_CODE(KEYCODE_NUMLOCK)
PORT_MODIFY("IN0")
PORT_BIT ( 0x08, 0x08, IPT_CUSTOM ) PORT_VBLANK("pcvideo_pcjr:screen")
INPUT_PORTS_END
FLOPPY_FORMATS_MEMBER( pc_state::floppy_formats )
FLOPPY_PC_FORMAT,
FLOPPY_NASLITE_FORMAT
@ -715,33 +496,6 @@ SLOT_INTERFACE_END
MCFG_TIMER_DRIVER_ADD_PERIODIC("scantimer", pc_state, vblankfunc, attotime::from_hz(60))
static const gfx_layout pc_8_charlayout =
{
8, 8, /* 8 x 8 characters */
512, /* 512 characters */
1, /* 1 bits per pixel */
{ 0 }, /* no bitplanes */
/* x offsets */
{ 0, 1, 2, 3, 4, 5, 6, 7 },
/* y offsets */
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
8*8 /* every char takes 8 bytes */
};
static const gfx_layout kanji_layout =
{
16, 16, /* 8 x 8 characters */
RGN_FRAC(1,1), /* 512 characters */
1, /* 1 bits per pixel */
{ 0 }, /* no bitplanes */
/* x offsets */
{ STEP16(0,1) },
/* y offsets */
{ STEP16(0,16) },
16*16 /* every char takes 8 bytes */
};
static const pc_kbdc_interface pc_kbdc_intf =
{
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, pc_state, keyboard_clock_w),
@ -972,265 +726,6 @@ static MACHINE_CONFIG_START( europc, europc_pc_state )
MCFG_RAM_DEFAULT_SIZE("640K")
MACHINE_CONFIG_END
static const gfx_layout t1000_charlayout =
{
8, 16,
256,
1,
{ 0 },
{ 0, 1, 2, 3, 4, 5, 6, 7 },
{ 0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480, 22528, 24576, 26624, 28672, 30720 },
8
};
static GFXDECODE_START( t1000 )
GFXDECODE_ENTRY( "gfx1", 0x0000, t1000_charlayout, 3, 1 )
GFXDECODE_END
static MACHINE_CONFIG_START( t1000hx, tandy_pc_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8088, 8000000) \
MCFG_CPU_PROGRAM_MAP(tandy1000_map) \
MCFG_CPU_IO_MAP(tandy1000_io) \
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", pc_state, pc_frame_interrupt, "pcvideo_t1000:screen", 0, 1) //with this line commented out, it boots further though keyboard doesn't work, obviously
MCFG_MACHINE_START_OVERRIDE(tandy_pc_state,pc)
MCFG_MACHINE_RESET_OVERRIDE(pc_state,pc)
MCFG_DEVICE_ADD("pit8253", PIT8253, 0)
MCFG_PIT8253_CLK0(XTAL_14_31818MHz/12) /* heartbeat IRQ */
MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("pic8259", pic8259_device, ir0_w))
MCFG_PIT8253_CLK1(XTAL_14_31818MHz/12) /* dram refresh */
MCFG_PIT8253_OUT1_HANDLER(WRITELINE(pc_state, ibm5150_pit8253_out1_changed))
MCFG_PIT8253_CLK2(XTAL_14_31818MHz/12) /* pio port c pin 4, and speaker polling enough */
MCFG_PIT8253_OUT2_HANDLER(WRITELINE(pc_state, ibm5150_pit8253_out2_changed))
MCFG_I8237_ADD( "dma8237", XTAL_14_31818MHz/3, ibm5150_dma8237_config )
MCFG_PIC8259_ADD( "pic8259", INPUTLINE("maincpu", 0), VCC, NULL )
MCFG_I8255_ADD( "ppi8255", pc_ppi8255_interface )
MCFG_INS8250_ADD( "ins8250_0", ibm5150_com_interface[0], XTAL_1_8432MHz ) /* TODO: Verify model */
MCFG_INS8250_ADD( "ins8250_1", ibm5150_com_interface[1], XTAL_1_8432MHz ) /* TODO: Verify model */
MCFG_RS232_PORT_ADD( "serport0", ibm5150_com, NULL )
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, rx_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, dcd_w))
MCFG_RS232_DSR_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, dsr_w))
MCFG_RS232_RI_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, ri_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, cts_w))
MCFG_RS232_PORT_ADD( "serport1", ibm5150_com, NULL )
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, rx_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, dcd_w))
MCFG_RS232_DSR_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, dsr_w))
MCFG_RS232_RI_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, ri_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, cts_w))
/* video hardware */
MCFG_PCVIDEO_T1000_ADD("pcvideo_t1000")
MCFG_GFXDECODE_ADD("gfxdecode", "pcvideo_t1000:palette", t1000)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
MCFG_SOUND_ADD("sn76496", NCR7496, XTAL_14_31818MHz/4)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
MCFG_NVRAM_HANDLER( tandy1000 )
/* printer */
MCFG_DEVICE_ADD("lpt_0", PC_LPT, 0)
MCFG_PC_LPT_IRQ_HANDLER(DEVWRITELINE("pic8259", pic8259_device, ir7_w))
MCFG_PC_JOY_ADD("pc_joy")
MCFG_PC_FDC_XT_ADD("fdc")
MCFG_PC_FDC_INTRQ_CALLBACK(WRITELINE(pc_state, fdc_interrupt))
MCFG_PC_FDC_DRQ_CALLBACK(DEVWRITELINE("dma8237", am9517a_device, dreq2_w))
MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "35dd", pc_state::floppy_formats)
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("640K")
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( t1000sx, t1000hx )
MCFG_DEVICE_REMOVE("fdc:0")
MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "525dd", pc_state::floppy_formats)
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( t1000_16, tandy_pc_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8086, XTAL_28_63636MHz / 3) \
MCFG_CPU_PROGRAM_MAP(tandy1000_16_map) \
MCFG_CPU_IO_MAP(tandy1000_16_io) \
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", pc_state, pc_frame_interrupt, "pcvideo_t1000:screen", 0, 1)
MCFG_MACHINE_START_OVERRIDE(tandy_pc_state,pc)
MCFG_MACHINE_RESET_OVERRIDE(tandy_pc_state,tandy1000rl)
MCFG_DEVICE_ADD("pit8253", PIT8253, 0)
MCFG_PIT8253_CLK0(XTAL_14_31818MHz/12) /* heartbeat IRQ */
MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("pic8259", pic8259_device, ir0_w))
MCFG_PIT8253_CLK1(XTAL_14_31818MHz/12) /* dram refresh */
MCFG_PIT8253_OUT1_HANDLER(WRITELINE(pc_state, ibm5150_pit8253_out1_changed))
MCFG_PIT8253_CLK2(XTAL_14_31818MHz/12) /* pio port c pin 4, and speaker polling enough */
MCFG_PIT8253_OUT2_HANDLER(WRITELINE(pc_state, ibm5150_pit8253_out2_changed))
MCFG_I8237_ADD( "dma8237", XTAL_14_31818MHz/3, ibm5150_dma8237_config )
MCFG_PIC8259_ADD( "pic8259", INPUTLINE("maincpu", 0), VCC, NULL )
MCFG_I8255_ADD( "ppi8255", pc_ppi8255_interface )
MCFG_INS8250_ADD( "ins8250_0", ibm5150_com_interface[0], XTAL_1_8432MHz ) /* TODO: Verify model */
MCFG_INS8250_ADD( "ins8250_1", ibm5150_com_interface[1], XTAL_1_8432MHz ) /* TODO: Verify model */
MCFG_RS232_PORT_ADD( "serport0", ibm5150_com, NULL )
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, rx_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, dcd_w))
MCFG_RS232_DSR_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, dsr_w))
MCFG_RS232_RI_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, ri_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, cts_w))
MCFG_RS232_PORT_ADD( "serport1", ibm5150_com, NULL )
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, rx_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, dcd_w))
MCFG_RS232_DSR_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, dsr_w))
MCFG_RS232_RI_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, ri_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, cts_w))
/* video hardware */
MCFG_PCVIDEO_T1000_ADD("pcvideo_t1000")
MCFG_GFXDECODE_ADD("gfxdecode", "pcvideo_t1000:palette", t1000)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
MCFG_SOUND_ADD("sn76496", NCR7496, XTAL_14_31818MHz/4)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
MCFG_NVRAM_HANDLER( tandy1000 )
/* printer */
MCFG_DEVICE_ADD("lpt_0", PC_LPT, 0)
MCFG_PC_LPT_IRQ_HANDLER(DEVWRITELINE("pic8259", pic8259_device, ir7_w))
MCFG_PC_JOY_ADD("pc_joy")
MCFG_PC_FDC_XT_ADD("fdc")
MCFG_PC_FDC_INTRQ_CALLBACK(WRITELINE(pc_state, fdc_interrupt))
MCFG_PC_FDC_DRQ_CALLBACK(DEVWRITELINE("dma8237", am9517a_device, dreq2_w))
MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "35dd", pc_state::floppy_formats)
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("640K")
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( t1000_16_8, t1000_16 )
MCFG_CPU_MODIFY( "maincpu" )
MCFG_CPU_CLOCK( XTAL_24MHz / 3 )
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( t1000_286, tandy_pc_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I80286, XTAL_28_63636MHz / 2) \
MCFG_CPU_PROGRAM_MAP(tandy1000_286_map) \
MCFG_CPU_IO_MAP(tandy1000_286_io) \
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", pc_state, pc_frame_interrupt, "pcvideo_t1000:screen", 0, 1)
MCFG_MACHINE_START_OVERRIDE(pc_state,pc)
MCFG_MACHINE_RESET_OVERRIDE(pc_state,pc)
MCFG_DEVICE_ADD("pit8253", PIT8253, 0)
MCFG_PIT8253_CLK0(XTAL_14_31818MHz/12) /* heartbeat IRQ */
MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("pic8259", pic8259_device, ir0_w))
MCFG_PIT8253_CLK1(XTAL_14_31818MHz/12) /* dram refresh */
MCFG_PIT8253_OUT1_HANDLER(WRITELINE(pc_state, ibm5150_pit8253_out1_changed))
MCFG_PIT8253_CLK2(XTAL_14_31818MHz/12) /* pio port c pin 4, and speaker polling enough */
MCFG_PIT8253_OUT2_HANDLER(WRITELINE(pc_state, ibm5150_pit8253_out2_changed))
MCFG_I8237_ADD( "dma8237", XTAL_14_31818MHz/3, ibm5150_dma8237_config )
MCFG_PIC8259_ADD( "pic8259", INPUTLINE("maincpu", 0), VCC, NULL )
MCFG_I8255_ADD( "ppi8255", pc_ppi8255_interface )
MCFG_INS8250_ADD( "ins8250_0", ibm5150_com_interface[0], XTAL_1_8432MHz ) /* TODO: Verify model */
MCFG_INS8250_ADD( "ins8250_1", ibm5150_com_interface[1], XTAL_1_8432MHz ) /* TODO: Verify model */
MCFG_RS232_PORT_ADD( "serport0", ibm5150_com, NULL )
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, rx_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, dcd_w))
MCFG_RS232_DSR_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, dsr_w))
MCFG_RS232_RI_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, ri_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("ins8250_0", ins8250_uart_device, cts_w))
MCFG_RS232_PORT_ADD( "serport1", ibm5150_com, NULL )
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, rx_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, dcd_w))
MCFG_RS232_DSR_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, dsr_w))
MCFG_RS232_RI_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, ri_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, cts_w))
/* video hardware */
MCFG_PCVIDEO_T1000_ADD("pcvideo_t1000")
MCFG_GFXDECODE_ADD("gfxdecode", "pcvideo_t1000:palette", t1000)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
MCFG_SOUND_ADD("sn76496", NCR7496, XTAL_14_31818MHz/4)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
MCFG_NVRAM_HANDLER( tandy1000 )
/* printer */
MCFG_DEVICE_ADD("lpt_0", PC_LPT, 0)
MCFG_PC_LPT_IRQ_HANDLER(DEVWRITELINE("pic8259", pic8259_device, ir7_w))
MCFG_PC_JOY_ADD("pc_joy")
MCFG_PC_FDC_XT_ADD("fdc")
MCFG_PC_FDC_INTRQ_CALLBACK(WRITELINE(pc_state, fdc_interrupt))
MCFG_PC_FDC_DRQ_CALLBACK(DEVWRITELINE("dma8237", am9517a_device, dreq2_w))
MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "35dd", pc_state::floppy_formats)
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("640K")
MACHINE_CONFIG_END
static GFXDECODE_START( ibmpcjr )
GFXDECODE_ENTRY( "gfx1", 0x0000, pc_8_charlayout, 3, 1 )
GFXDECODE_END
static const cassette_interface ibm5150_cassette_interface =
{
cassette_default_formats,
NULL,
(cassette_state)(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED),
NULL,
NULL
};
static const cassette_interface mc1502_cassette_interface =
{
cassette_default_formats,
@ -1240,108 +735,6 @@ static const cassette_interface mc1502_cassette_interface =
NULL
};
static MACHINE_CONFIG_START( ibmpcjr, tandy_pc_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8088, 4900000) \
MCFG_CPU_PROGRAM_MAP(ibmpcjr_map) \
MCFG_CPU_IO_MAP(ibmpcjr_io) \
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", pc_state, pcjr_frame_interrupt, "pcvideo_pcjr:screen", 0, 1) //with this line commented out, it boots further though keyboard doesn't work, obviously
MCFG_MACHINE_START_OVERRIDE(pc_state,pcjr)
MCFG_MACHINE_RESET_OVERRIDE(pc_state,pcjr)
/*
On the PC Jr the input for clock 1 seems to be selectable
based on bit 4(/5?) written to output port A0h. This is not
supported yet.
*/
MCFG_DEVICE_ADD("pit8253", PIT8253, 0)
MCFG_PIT8253_CLK0(XTAL_14_31818MHz/12)
MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("pic8259", pic8259_device, ir0_w))
MCFG_PIT8253_CLK1(XTAL_14_31818MHz/12)
MCFG_PIT8253_CLK2(XTAL_14_31818MHz/12)
MCFG_PIT8253_OUT2_HANDLER(WRITELINE(pc_state, ibm5150_pit8253_out2_changed))
MCFG_PIC8259_ADD( "pic8259", WRITELINE(pc_state,pcjr_pic8259_set_int_line), VCC, NULL )
MCFG_I8255_ADD( "ppi8255", pcjr_ppi8255_interface )
MCFG_INS8250_ADD( "ins8250_1", ibm5150_com_interface[1], XTAL_1_8432MHz ) /* TODO: Verify model */
MCFG_RS232_PORT_ADD( "serport1", ibm5150_com, NULL )
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, rx_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, dcd_w))
MCFG_RS232_DSR_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, dsr_w))
MCFG_RS232_RI_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, ri_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("ins8250_1", ins8250_uart_device, cts_w))
/* video hardware */
MCFG_PCVIDEO_PCJR_ADD("pcvideo_pcjr")
MCFG_GFXDECODE_ADD("gfxdecode", "pcvideo_pcjr:palette", ibmpcjr)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
MCFG_SOUND_ADD("sn76496", SN76496, XTAL_14_31818MHz/4)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
MCFG_NVRAM_HANDLER( tandy1000 )
/* printer */
MCFG_DEVICE_ADD("lpt_0", PC_LPT, 0)
MCFG_PC_LPT_IRQ_HANDLER(DEVWRITELINE("pic8259", pic8259_device, ir7_w))
MCFG_PC_JOY_ADD("pc_joy")
/* cassette */
MCFG_CASSETTE_ADD( "cassette", ibm5150_cassette_interface )
MCFG_UPD765A_ADD("upd765", false, false)
MCFG_FLOPPY_DRIVE_ADD("upd765:0", ibmpc_floppies, "525dd", pc_state::floppy_formats)
/* cartridge */
MCFG_CARTSLOT_ADD("cart1")
MCFG_CARTSLOT_INTERFACE("ibmpcjr_cart")
MCFG_CARTSLOT_EXTENSION_LIST("jrc")
MCFG_CARTSLOT_NOT_MANDATORY
MCFG_CARTSLOT_LOAD(pc_state,pcjr_cartridge)
MCFG_CARTSLOT_ADD("cart2")
MCFG_CARTSLOT_INTERFACE("ibmpcjr_cart")
MCFG_CARTSLOT_EXTENSION_LIST("jrc")
MCFG_CARTSLOT_NOT_MANDATORY
MCFG_CARTSLOT_LOAD(pc_state,pcjr_cartridge)
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("640K")
/* Software lists */
MCFG_SOFTWARE_LIST_ADD("cart_list","ibmpcjr_cart")
MCFG_SOFTWARE_LIST_ADD("flop_list","ibmpcjr_flop")
MACHINE_CONFIG_END
static GFXDECODE_START( ibmpcjx )
GFXDECODE_ENTRY( "gfx1", 0x0000, pc_8_charlayout, 3, 1 )
GFXDECODE_ENTRY( "kanji", 0x0000, kanji_layout, 3, 1 )
GFXDECODE_END
static MACHINE_CONFIG_DERIVED( ibmpcjx, ibmpcjr )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(ibmpcjx_map)
MCFG_CPU_IO_MAP(ibmpcjx_io)
MCFG_DEVICE_REMOVE("upd765:0");
MCFG_FLOPPY_DRIVE_ADD("upd765:0", ibmpc_floppies, "35dd", pc_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("upd765:1", ibmpc_floppies, "35dd", pc_state::floppy_formats)
MCFG_GFXDECODE_MODIFY("gfxdecode", ibmpcjx)
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( asst128, pc_state )
/* basic machine hardware */
MCFG_CPU_PC(asst128, asst128, I8086, 4772720, pc_frame_interrupt)
@ -1833,7 +1226,6 @@ MACHINE_CONFIG_END
ROM_LOAD("xthdd.rom", 0xc8000, 0x02000, CRC(a96317da))
#endif
ROM_START( bw230 )
ROM_REGION(0x100000,"maincpu", 0)
ROM_LOAD("bondwell.bin", 0xfe000, 0x2000, CRC(d435a405) SHA1(a57c705d1144c7b61940b6f5c05d785c272fc9bb))
@ -1854,199 +1246,6 @@ ROM_START( europc )
ROM_END
ROM_START( ibmpcjr )
ROM_REGION(0x100000,"maincpu", 0)
ROM_LOAD("bios.rom", 0xf0000, 0x10000,CRC(31e3a7aa) SHA1(1f5f7013f18c08ff50d7942e76c4fbd782412414))
ROM_REGION(0x08100,"gfx1", 0)
ROM_LOAD("cga.chr", 0x00000, 0x01000, CRC(42009069) SHA1(ed08559ce2d7f97f68b9f540bddad5b6295294dd)) // from an unknown clone cga card
ROM_END
ROM_START( ibmpcjx )
ROM_REGION(0x100000,"maincpu", ROMREGION_ERASEFF)
ROM_DEFAULT_BIOS("unk")
ROM_SYSTEM_BIOS( 0, "5601jda", "5601jda" )
ROMX_LOAD("5601jda.bin", 0xf0000, 0x10000, CRC(b1e12366) SHA1(751feb16b985aa4f1ec1437493ff77e2ebd5e6a6), ROM_BIOS(1))
ROMX_LOAD("basicjx.rom", 0xe8000, 0x08000, NO_DUMP, ROM_BIOS(1)) // boot fails due of this.
ROM_SYSTEM_BIOS( 1, "unk", "unk" )
ROMX_LOAD("ipljx.rom", 0xe0000, 0x20000, CRC(36a7b2de) SHA1(777db50c617725e149bca9b18cf51ce78f6dc548), ROM_BIOS(2))
ROM_REGION(0x08100,"gfx1", 0) //TODO: needs a different charset
ROM_LOAD("cga.chr", 0x00000, 0x01000, BAD_DUMP CRC(42009069) SHA1(ed08559ce2d7f97f68b9f540bddad5b6295294dd)) // from an unknown clone cga card
ROM_REGION(0x38000,"kanji", 0)
ROM_LOAD("kanji.rom", 0x00000, 0x38000, BAD_DUMP CRC(eaa6e3c3) SHA1(35554587d02d947fae8446964b1886fff5c9d67f)) // hand-made rom
ROM_END
#ifdef UNUSED_DEFINITION
ROM_START( t1000 )
// Schematics displays 2 32KB ROMs at U9 and U10
ROM_REGION(0x100000,"maincpu", 0)
ROM_SYSTEM_BIOS( 0, "v010000", "v010000" )
ROMX_LOAD("v010000.f0", 0xf0000, 0x10000, NO_DUMP, ROM_BIOS(1))
ROM_SYSTEM_BIOS( 1, "v010100", "v010100" )
ROMX_LOAD("v010100.f0", 0xf0000, 0x10000, CRC(b6760881) SHA1(8275e4c48ac09cf36685db227434ca438aebe0b9), ROM_BIOS(2))
// Part of video array at u76?
ROM_REGION(0x08000,"gfx1", 0)
ROM_LOAD("8079027.u76", 0x00000, 0x04000, CRC(33d64a11) SHA1(b63da2a656b6c0a8a32f2be8bdcb51aed983a450)) // TODO: Verify location
ROM_END
ROM_START( t1000a )
ROM_REGION(0x100000,"maincpu", 0)
// partlist says it has 1 128kbyte rom
ROM_LOAD("t1000hx.e0", 0xe0000, 0x10000, CRC(61dbf242) SHA1(555b58d8aa8e0b0839259621c44b832d993beaef)) // not sure about this one
ROM_LOAD("v010100.f0", 0xf0000, 0x10000, CRC(b6760881) SHA1(8275e4c48ac09cf36685db227434ca438aebe0b9))
ROM_REGION(0x08000,"gfx1", 0)
ROM_LOAD("8079027.u25", 0x00000, 0x04000, CRC(33d64a11) SHA1(b63da2a656b6c0a8a32f2be8bdcb51aed983a450)) // TODO: Verify location
ROM_END
ROM_START( t1000ex )
ROM_REGION(0x100000,"maincpu", 0)
// partlist says it has 1 128kb rom, schematics list a 32k x 8 rom
// "8040328.u17"
ROM_LOAD("t1000hx.e0", 0xe0000, 0x10000, CRC(61dbf242) SHA1(555b58d8aa8e0b0839259621c44b832d993beaef)) // not sure about this one
ROM_LOAD("v010200.f0", 0xf0000, 0x10000, CRC(0e016ecf) SHA1(2f5ac8921b7cba56b02122ef772f5f11bbf6d8a2))
// TODO: Add dump of the 8048 at u8 if it ever gets dumped
ROM_REGION(0x400, "kbdc", 0)
ROM_LOAD("8048.u8", 0x000, 0x400, NO_DUMP)
// Most likely part of big blue at u28
ROM_REGION(0x08000,"gfx1", 0)
ROM_LOAD("8079027.u28", 0x00000, 0x04000, CRC(33d64a11) SHA1(b63da2a656b6c0a8a32f2be8bdcb51aed983a450)) // TODO: Verify location
ROM_END
#endif
ROM_START( t1000hx )
ROM_REGION(0x100000,"maincpu", 0)
ROM_LOAD("v020000.u12", 0xe0000, 0x20000, CRC(6f3acd80) SHA1(976af8c04c3f6fde14d7047f6521d302bdc2d017)) // TODO: Rom label
// TODO: Add dump of the 8048 at u9 if it ever gets dumped
ROM_REGION(0x400, "kbdc", 0)
ROM_LOAD("8048.u9", 0x000, 0x400, NO_DUMP)
ROM_REGION(0x08000,"gfx1", 0)
ROM_LOAD("8079027.u31", 0x00000, 0x04000, CRC(33d64a11) SHA1(b63da2a656b6c0a8a32f2be8bdcb51aed983a450)) // TODO: Verify location, probably internal to "big blue" at u31
ROM_END
#ifdef UNUSED_DEFINITION
// The T1000SL and T1000SL/2 only differ in amount of RAM installed and BIOS version (SL/2 has v01.04.04)
ROM_START( t1000sl )
ROM_REGION(0x100000,"maincpu", 0)
// 8076312.hu1 - most likely v01.04.00
// 8075312.hu2
// partlist says it has 1 128kbyte rom
ROM_LOAD("t1000hx.e0", 0xe0000, 0x10000, CRC(61dbf242) SHA1(555b58d8aa8e0b0839259621c44b832d993beaef)) // not sure about this one
ROM_SYSTEM_BIOS( 0, "v010400", "v010400" )
ROMX_LOAD("v010400.f0", 0xf0000, 0x10000, NO_DUMP, ROM_BIOS(1) )
ROM_SYSTEM_BIOS( 1, "v010401", "v010401" )
ROMX_LOAD("v010401.f0", 0xf0000, 0x10000, NO_DUMP, ROM_BIOS(2) )
ROM_SYSTEM_BIOS( 2, "v010402", "v010402" )
ROMX_LOAD("v010402.f0", 0xf0000, 0x10000, NO_DUMP, ROM_BIOS(3) )
ROM_SYSTEM_BIOS( 3, "v020001", "v020001" )
ROMX_LOAD("v020001.f0", 0xf0000, 0x10000, NO_DUMP, ROM_BIOS(4) )
ROM_REGION(0x08000,"gfx1", 0)
ROM_LOAD("8079027.u25", 0x00000, 0x04000, CRC(33d64a11) SHA1(b63da2a656b6c0a8a32f2be8bdcb51aed983a450))
ROM_END
ROM_START( t1000tl )
ROM_REGIoN(0x100000, "maincpu", ROMREGION_ERASE00)
ROM_REGION(0x80000, "romcs0", 0)
// These 2 sets most likely have the same contents
// v01.04.00
// 8076323.u55 - Sharp - 256KB
// 8075323.u57 - Sharp - 256KB
// v01.04.00
// 8079025.u54 - Hitachi - 256KB
// 8079026.u56 - Hitachi - 256KB
ROM_REGION(0x80000, "romcs1", 0)
// 2x 128x8 eeprom?? @ u58 and u59 - not mentioned in parts list
ROM_REGION(0x80, "eeprom", 0)
ROM_LOAD("8040346_9346.u12", xxx ) // 64x16 eeprom
ROM_REGION(0x08000, "gfx1", 0)
ROM_LOAD("8079027.u24", 0x00000, 0x04000, CRC(33d64a11) SHA1(b63da2a656b6c0a8a32f2be8bdcb51aed983a450))
ROM_END
#endif
ROM_START( t1000sx )
ROM_REGION(0x100000,"maincpu", 0)
ROM_LOAD("8040328.u41", 0xf8000, 0x8000, CRC(4e2b9f0b) SHA1(e79a9ed9e885736e30d9b135557f0e596ce5a70b))
// No character rom is listed in the schematics?
// But disabling it results in no text being printed
// Part of bigblue at u30??
ROM_REGION(0x08000,"gfx1", 0)
ROM_LOAD("8079027.u30", 0x00000, 0x04000, CRC(33d64a11) SHA1(b63da2a656b6c0a8a32f2be8bdcb51aed983a450)) // TODO: Verify location
ROM_END
ROM_START( t1000tx )
ROM_REGION(0x100000,"maincpu", 0)
// There should be 2 32KBx8 ROMs, one for odd at u38, one for even at u39
// The machine already boots up with just this one rom
ROM_LOAD("t1000tx.bin", 0xf8000, 0x8000, BAD_DUMP CRC(9b34765c) SHA1(0b07e87f6843393f7d4ca4634b832b0c0bec304e))
// No character rom is listed in the schematics?
// It is most likely part of the big blue chip at u36
ROM_REGION(0x08000,"gfx1", 0)
ROM_LOAD("8079027.u36", 0x00000, 0x04000, CRC(33d64a11) SHA1(b63da2a656b6c0a8a32f2be8bdcb51aed983a450)) // TODO: Verify location
ROM_END
ROM_START( t1000rl )
ROM_REGION(0x100000,"maincpu", ROMREGION_ERASE00)
// bankable ROM regions
ROM_REGION(0x80000, "romcs0", 0)
/* v2.0.0.1 */
/* Rom is labeled "(C) TANDY CORP. 1990 // 8079073 // LH534G70 JAPAN // 9034 D" */
ROM_LOAD("8079073.u23", 0x00000, 0x80000, CRC(6fab50f7) SHA1(2ccc02bee4c250dc1b7c17faef2590bc158860b0) )
ROM_REGION(0x80000, "romcs1", ROMREGION_ERASEFF)
ROM_REGION(0x08000,"gfx1", 0)
/* Character rom located at U3 w/label "8079027 // NCR // 609-2495004 // F841030 A9025" */
ROM_LOAD("8079027.u3", 0x00000, 0x04000, CRC(33d64a11) SHA1(b63da2a656b6c0a8a32f2be8bdcb51aed983a450)) // TODO: Verify location
ROM_END
ROM_START( t1000sl2 )
ROM_REGION(0x100000,"maincpu", ROMREGION_ERASE00)
// bankable ROM regions
ROM_REGION(0x80000, "romcs0", 0)
// v01.04.04 BIOS
ROM_LOAD16_BYTE("8079047.hu1", 0x00000, 0x40000, CRC(c773ec0e) SHA1(7deb71f14c2c418400b639d60066ab61b7e9df32))
ROM_LOAD16_BYTE("8079048.hu2", 0x00001, 0x40000, CRC(0f3e6586) SHA1(10f1a7204f69b82a18bc94a3010c9660aec0c802))
ROM_REGION(0x80000, "romcs1", ROMREGION_ERASEFF)
ROM_REGION(0x08000,"gfx1", 0)
ROM_LOAD("8079027.u25", 0x00000, 0x04000, CRC(33d64a11) SHA1(b63da2a656b6c0a8a32f2be8bdcb51aed983a450))
ROM_REGION(0x80, "nmc9246n", 0)
ROM_LOAD("seeprom.bin", 0, 0x80, CRC(4fff41df) SHA1(41a7009694550c017996932beade608cff968f4a))
ROM_END
ROM_START( t1000tl2 )
ROM_REGION(0x100000, "maincpu", 0)
ROM_LOAD( "t10000tl2.bin", 0xf0000, 0x10000, CRC(e288f12c) SHA1(9d54ccf773cd7202c9906323f1b5a68b1b3a3a67))
ROM_REGION(0x08000,"gfx1", 0)
ROM_LOAD("8079027.u24", 0x00000, 0x04000, CRC(33d64a11) SHA1(b63da2a656b6c0a8a32f2be8bdcb51aed983a450)) // TODO: Verify location
ROM_END
ROM_START( dgone )
ROM_REGION(0x100000,"maincpu", 0)
@ -2239,18 +1438,6 @@ COMP( 1988, europc, ibm5150, 0, europc, europc, europc_pc_st
COMP( 1984, compc1, ibm5150, 0, pccga, pccga, pc_state, pccga, "Commodore Business Machines", "Commodore PC-1" , GAME_NOT_WORKING)
COMP( 1987, pc10iii, ibm5150, 0, pc10iii, pccga, pc_state, pccga, "Commodore Business Machines", "Commodore PC-10 III" , GAME_NOT_WORKING)
// pcjr (better graphics, better sound)
COMP( 1983, ibmpcjr, ibm5150, 0, ibmpcjr, ibmpcjr, pc_state, pcjr, "International Business Machines", "IBM PC Jr", GAME_IMPERFECT_COLORS )
COMP( 1985, ibmpcjx, ibm5150, 0, ibmpcjx, ibmpcjr, pc_state, pcjr, "International Business Machines", "IBM PC JX", GAME_IMPERFECT_COLORS | GAME_NOT_WORKING)
// tandy 1000
COMP( 1987, t1000hx, ibm5150, 0, t1000hx, tandy1t, tandy_pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 HX", 0)
COMP( 1987, t1000sx, ibm5150, 0, t1000sx, tandy1t, tandy_pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 SX", GAME_NOT_WORKING)
COMP( 1987, t1000tx, ibm5150, 0, t1000_286, tandy1t, tandy_pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 TX", 0)
COMP( 1989, t1000rl, ibm5150, 0, t1000_16, tandy1t, tandy_pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 RL", 0)
COMP( 1989, t1000tl2, ibm5150, 0, t1000_286, tandy1t, tandy_pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 TL/2", 0)
COMP( 1988, t1000sl2, ibm5150, 0, t1000_16_8, tandy1t, tandy_pc_state, t1000sl, "Tandy Radio Shack", "Tandy 1000 SL/2", GAME_NOT_WORKING)
COMP( 1992, iskr3104, ibm5150, 0, iskr3104, pcega, pc_state, pccga, "Schetmash", "Iskra 3104", GAME_NOT_WORKING)
COMP( 198?, asst128, ibm5150, 0, asst128, pccga, pc_state, pccga, "Schetmash", "Assistent 128", GAME_NOT_WORKING)
COMP( 1989, mk88, ibm5150, 0, iskr3104, pccga, pc_state, pccga, "<unknown>", "MK-88", GAME_NOT_WORKING)
@ -2259,7 +1446,6 @@ COMP( 1990, mc1702, ibm5150, 0, pccga, pccga, pc_state,
COMP( 1987, zdsupers, ibm5150, 0, zenith, pccga, pc_state, pccga, "Zenith Data Systems", "SuperSport", 0)
COMP( 1983, m24, ibm5150, 0, olivetti, pccga, pc_state, pccga, "Olivetti", "M24", GAME_NOT_WORKING)
COMP( 1987, m240, ibm5150, 0, olivetti, pccga, pc_state, pccga, "Olivetti", "M240", GAME_NOT_WORKING)
COMP( 198?, olivm15, ibm5150, 0, olivm15, 0, driver_device, 0, "Olivetti", "M15", GAME_NOT_WORKING | GAME_NO_SOUND)

1047
src/mess/drivers/tandy1t.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -53,12 +53,6 @@ public:
int m_cur_eop;
UINT8 m_pc_spkrdata;
UINT8 m_pit_out2;
UINT8 m_pcjr_dor;
emu_timer *m_pcjr_watchdog;
UINT8 m_pcjx_1ff_count;
UINT8 m_pcjx_1ff_val;
UINT8 m_pcjx_1ff_bankval;
UINT8 m_pcjx_1ff_bank[20][2];
int m_ppi_portc_switch_high;
int m_ppi_speaker;
@ -86,20 +80,13 @@ public:
DECLARE_READ8_MEMBER(pc_EXP_r);
DECLARE_READ8_MEMBER(unk_r);
DECLARE_DRIVER_INIT(bondwell);
DECLARE_DRIVER_INIT(pcjr);
DECLARE_DRIVER_INIT(pccga);
DECLARE_DRIVER_INIT(ibm5150);
DECLARE_DRIVER_INIT(pcmda);
DECLARE_MACHINE_START(pc);
DECLARE_MACHINE_RESET(pc);
DECLARE_MACHINE_START(pcjr);
DECLARE_MACHINE_RESET(pcjr);
TIMER_CALLBACK_MEMBER(pcjr_delayed_pic8259_irq);
TIMER_CALLBACK_MEMBER(pcjr_keyb_signal_callback);
TIMER_CALLBACK_MEMBER(pcjr_fdc_watchdog);
TIMER_CALLBACK_MEMBER(pc_rtc_timer);
TIMER_DEVICE_CALLBACK_MEMBER(pc_frame_interrupt);
TIMER_DEVICE_CALLBACK_MEMBER(pcjr_frame_interrupt);
DECLARE_WRITE_LINE_MEMBER(pc_dma_hrq_changed);
DECLARE_READ8_MEMBER(pc_dma8237_fdc_dack_r);
DECLARE_READ8_MEMBER(pc_dma8237_hdc_dack_r);
@ -121,14 +108,7 @@ public:
DECLARE_WRITE8_MEMBER(ibm5160_ppi_portb_w);
DECLARE_READ8_MEMBER(pc_ppi_porta_r);
DECLARE_WRITE8_MEMBER(pc_ppi_portb_w);
DECLARE_WRITE8_MEMBER(pcjr_ppi_portb_w);
DECLARE_READ8_MEMBER(pcjr_ppi_porta_r);
DECLARE_READ8_MEMBER(pcjr_ppi_portc_r);
DECLARE_WRITE8_MEMBER(pcjr_fdc_dor_w);
DECLARE_READ8_MEMBER(pcjx_port_1ff_r);
DECLARE_WRITE8_MEMBER(pcjx_port_1ff_w);
DECLARE_WRITE8_MEMBER(asst128_fdc_dor_w);
void pcjx_set_bank(int unk1, int unk2, int unk3);
DECLARE_WRITE_LINE_MEMBER(fdc_interrupt);
void pc_select_dma_channel(int channel, bool state);
@ -140,7 +120,6 @@ public:
DECLARE_DEVICE_IMAGE_LOAD_MEMBER( pcjr_cartridge );
UINT8 pc_speaker_get_spk();
void pc_speaker_set_spkrdata(UINT8 data);
void pcjr_keyb_init();
void pc_rtc_init();
// turbo support
@ -164,7 +143,6 @@ public:
int m_pc_keyb_on;
int m_pc_keyb_self_test;
DECLARE_WRITE_LINE_MEMBER(pcjr_set_keyb_int);
DECLARE_WRITE_LINE_MEMBER(pc_set_keyb_int);
};

View File

@ -1,65 +0,0 @@
/*****************************************************************************
*
* includes/tandy1t.h
*
****************************************************************************/
#ifndef TANDY1T_H_
#define TANDY1T_H_
#include "includes/pc.h"
class tandy_pc_state : public pc_state
{
public:
tandy_pc_state(const machine_config &mconfig, device_type type, const char *tag)
: pc_state(mconfig, type, tag)
, m_romcs0(*this, "romcs0")
, m_romcs1(*this, "romcs1")
, m_biosbank(*this, "biosbank")
{ }
DECLARE_WRITE8_MEMBER ( pc_t1t_p37x_w );
DECLARE_READ8_MEMBER ( pc_t1t_p37x_r );
DECLARE_WRITE8_MEMBER ( tandy1000_pio_w );
DECLARE_READ8_MEMBER(tandy1000_pio_r);
DECLARE_READ8_MEMBER( tandy1000_bank_r );
DECLARE_WRITE8_MEMBER( tandy1000_bank_w );
int tandy1000_read_eeprom();
void tandy1000_write_eeprom(UINT8 data);
void tandy1000_set_bios_bank();
DECLARE_DRIVER_INIT(t1000hx);
DECLARE_DRIVER_INIT(t1000sl);
DECLARE_MACHINE_RESET(tandy1000rl);
struct
{
UINT8 low, high;
} m_eeprom_ee[0x40]; /* only 0 to 4 used in hx, addressing seems to allow this */
protected:
int m_eeprom_state;
int m_eeprom_clock;
UINT8 m_eeprom_oper;
UINT16 m_eeprom_data;
UINT8 m_tandy_data[8];
UINT8 m_tandy_bios_bank; /* I/O port FFEAh */
UINT8 m_tandy_ppi_portb, m_tandy_ppi_portc;
// Memory regions for the machines that support rom banking
optional_memory_region m_romcs0;
optional_memory_region m_romcs1;
optional_memory_bank m_biosbank;
};
extern NVRAM_HANDLER( tandy1000 );
INPUT_PORTS_EXTERN( t1000_keyboard );
#endif /* TANDY1T_H_ */

View File

@ -1,6 +1,6 @@
// license:BSD-3-Clause
// Currently only emulates Shugart interface disks (aka ST406)
// Currently only emulates Shugart SA1000 interface disks (aka ST506)
// despite the controller supporting many different disk types (hard sectored, onboard controllers, ANSI X3T9)
// Xenix supports the Quantum Q540 CHS 512,8,9 with 1024B sectors

View File

@ -208,40 +208,7 @@ I8237_INTERFACE( ibm5150_dma8237_config )
};
/*************************************************************
*
* PCJR pic8259 configuration
*
* Part of the PCJR CRT POST test at address F0452/F0454 writes
* to the PIC enabling an IRQ which is then immediately fired,
* however it is expected that the actual IRQ is taken one
* instruction later (the irq bit is reset by the instruction
* at F0454). Delaying taking of an IRQ by one instruction for
* all cases breaks floppy emulation. This seems to be a really
* tight corner case. For now we delay the IRQ by one instruction
* only for the PCJR and only when it's inside the POST checks.
*
*************************************************************/
static emu_timer *pc_int_delay_timer;
TIMER_CALLBACK_MEMBER(pc_state::pcjr_delayed_pic8259_irq)
{
m_maincpu->set_input_line(0, param ? ASSERT_LINE : CLEAR_LINE);
}
WRITE_LINE_MEMBER(pc_state::pcjr_pic8259_set_int_line)
{
UINT32 pc = m_maincpu->pc();
if ( (pc == 0xF0453) || (pc == 0xFF196) )
{
pc_int_delay_timer->adjust( m_maincpu->cycles_to_attotime(20), state );
}
else
{
m_maincpu->set_input_line(0, state ? ASSERT_LINE : CLEAR_LINE);
}
}
/*************************************************************************
*
@ -354,123 +321,6 @@ WRITE8_MEMBER(pc_state::pc_nmi_enable_w)
nmi_enabled = data & 0x80;
}
/*************************************************************
*
* PCJR NMI and raw keybaord handling
*
* raw signals on the keyboard cable:
* ---_-b0b1b2b3b4b5b6b7pa----------------------
* | | | | | | | | | | |
* | | | | | | | | | | *--- 11 stop bits ( -- = 1 stop bit )
* | | | | | | | | | *----- parity bit ( 0 = _-, 1 = -_ )
* | | | | | | | | *------- bit 7 ( 0 = _-, 1 = -_ )
* | | | | | | | *--------- bit 6 ( 0 = _-, 1 = -_ )
* | | | | | | *----------- bit 5 ( 0 = _-, 1 = -_ )
* | | | | | *------------- bit 4 ( 0 = _-, 1 = -_ )
* | | | | *--------------- bit 3 ( 0 = _-, 1 = -_ )
* | | | *----------------- bit 2 ( 0 = _-, 1 = -_ )
* | | *------------------- bit 1 ( 0 = _-, 1 = -_ )
* | *--------------------- bit 0 ( 0 = _-, 1 = -_ )
* *----------------------- start bit (always _- )
*
* An entire bit lasts for 440 uSec, half bit time is 220 uSec.
* Transferring an entire byte takes 21 x 440uSec. The extra
* time of the stop bits is to allow the CPU to do other things
* besides decoding keyboard signals.
*
* These signals get inverted before going to the PCJR
* handling hardware. The sequence for the start then
* becomes:
*
* __-_b0b1.....
* |
* *---- on the 0->1 transition of the start bit a keyboard
* latch signal is set to 1 and an NMI is generated
* when enabled.
* The keyboard latch is reset by reading from the
* NMI enable port (A0h).
*
*************************************************************/
static struct {
UINT8 transferring;
UINT8 latch;
UINT32 raw_keyb_data;
int signal_count;
emu_timer *keyb_signal_timer;
} pcjr_keyb;
READ8_MEMBER(pc_state::pcjr_nmi_enable_r)
{
pcjr_keyb.latch = 0;
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
return nmi_enabled;
}
TIMER_CALLBACK_MEMBER(pc_state::pcjr_keyb_signal_callback)
{
pcjr_keyb.raw_keyb_data = pcjr_keyb.raw_keyb_data >> 1;
pcjr_keyb.signal_count--;
if ( pcjr_keyb.signal_count <= 0 )
{
pcjr_keyb.keyb_signal_timer->adjust( attotime::never, 0, attotime::never );
pcjr_keyb.transferring = 0;
}
}
WRITE_LINE_MEMBER(pc_state::pcjr_set_keyb_int)
{
if ( state )
{
UINT8 data = pc_keyb_read();
UINT8 parity = 0;
int i;
/* Calculate the raw data */
for( i = 0; i < 8; i++ )
{
if ( ( 1 << i ) & data )
{
parity ^= 1;
}
}
pcjr_keyb.raw_keyb_data = 0;
pcjr_keyb.raw_keyb_data = ( pcjr_keyb.raw_keyb_data << 2 ) | ( parity ? 1 : 2 );
for( i = 0; i < 8; i++ )
{
pcjr_keyb.raw_keyb_data = ( pcjr_keyb.raw_keyb_data << 2 ) | ( ( data & 0x80 ) ? 1 : 2 );
data <<= 1;
}
/* Insert start bit */
pcjr_keyb.raw_keyb_data = ( pcjr_keyb.raw_keyb_data << 2 ) | 1;
pcjr_keyb.signal_count = 20 + 22;
/* we are now transferring a byte of keyboard data */
pcjr_keyb.transferring = 1;
/* Set timer */
pcjr_keyb.keyb_signal_timer->adjust( attotime::from_usec(220), 0, attotime::from_usec(220) );
pcjr_keyb.latch = 1;
}
m_maincpu->set_input_line(INPUT_LINE_NMI, pcjr_keyb.latch && nmi_enabled);
}
void pc_state::pcjr_keyb_init()
{
pcjr_keyb.transferring = 0;
pcjr_keyb.latch = 0;
pcjr_keyb.raw_keyb_data = 0;
pc_keyb_set_clock( 1 );
}
/**********************************************************
*
* PPI8255 interface
@ -708,87 +558,6 @@ I8255_INTERFACE( pc_ppi8255_interface )
};
WRITE8_MEMBER(pc_state::pcjr_ppi_portb_w)
{
/* KB controller port B */
m_ppi_portb = data;
m_ppi_portc_switch_high = data & 0x08;
m_pit8253->write_gate2(BIT(data, 0));
pc_speaker_set_spkrdata( data & 0x02 );
m_cassette->change_state(( data & 0x08 ) ? CASSETTE_MOTOR_DISABLED : CASSETTE_MOTOR_ENABLED,CASSETTE_MASK_MOTOR);
}
/*
* On a PCJR none of the port A bits are connected.
*/
READ8_MEMBER(pc_state::pcjr_ppi_porta_r)
{
int data;
data = 0xff;
PIO_LOG(1,"PIO_A_r",("$%02x\n", data));
return data;
}
/*
* Port C connections on a PCJR (notes from schematics):
* PC0 - KYBD LATCH
* PC1 - MODEM CD INSTALLED
* PC2 - DISKETTE CD INSTALLED
* PC3 - ATR CD IN
* PC4 - cassette audio
* PC5 - OUT2 from 8253
* PC6 - KYBD IN
* PC7 - (keyboard) CABLE CONNECTED
*/
READ8_MEMBER(pc_state::pcjr_ppi_portc_r)
{
int data=0xff;
data&=~0x80;
data &= ~0x04; /* floppy drive installed */
if ( m_ram->size() > 64 * 1024 ) /* more than 64KB ram installed */
data &= ~0x08;
data = ( data & ~0x01 ) | ( pcjr_keyb.latch ? 0x01: 0x00 );
if ( ! ( m_ppi_portb & 0x08 ) )
{
double tap_val = m_cassette->input();
if ( tap_val < 0 )
{
data &= ~0x10;
}
else
{
data |= 0x10;
}
}
else
{
if ( m_ppi_portb & 0x01 )
{
data = ( data & ~0x10 ) | ( m_pit_out2 ? 0x10 : 0x00 );
}
}
data = ( data & ~0x20 ) | ( m_pit_out2 ? 0x20 : 0x00 );
data = ( data & ~0x40 ) | ( ( pcjr_keyb.raw_keyb_data & 0x01 ) ? 0x40 : 0x00 );
return data;
}
I8255_INTERFACE( pcjr_ppi8255_interface )
{
DEVCB_DRIVER_MEMBER(pc_state,pcjr_ppi_porta_r),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_MEMBER(pc_state,pcjr_ppi_portb_w),
DEVCB_DRIVER_MEMBER(pc_state,pcjr_ppi_portc_r),
DEVCB_NULL
};
/**********************************************************
@ -810,86 +579,6 @@ WRITE_LINE_MEMBER( pc_state::pc_set_keyb_int)
m_pic8259->ir1_w(state);
}
TIMER_CALLBACK_MEMBER(pc_state::pcjr_fdc_watchdog)
{
if(m_pcjr_dor & 0x20)
fdc_interrupt(1);
else
fdc_interrupt(0);
}
WRITE8_MEMBER(pc_state::pcjr_fdc_dor_w)
{
logerror("fdc: dor = %02x\n", data);
UINT8 pdor = m_pcjr_dor;
upd765a_device *fdc = machine().device<upd765a_device>("upd765");
floppy_image_device *floppy0 = fdc->subdevice<floppy_connector>("0")->get_device();
floppy_image_device *floppy1 = NULL;
if(fdc->subdevice("1"))
floppy1 = fdc->subdevice<floppy_connector>("1")->get_device();
m_pcjr_dor = data;
if(floppy0)
floppy0->mon_w(!(m_pcjr_dor & 1));
if(floppy1)
floppy1->mon_w(!(m_pcjr_dor & 2));
if(m_pcjr_dor & 1)
fdc->set_floppy(floppy0);
else if(m_pcjr_dor & 2)
fdc->set_floppy(floppy1);
else
fdc->set_floppy(NULL);
if((pdor^m_pcjr_dor) & 0x80)
fdc->reset();
if(m_pcjr_dor & 0x20) {
if((pdor & 0x40) && !(m_pcjr_dor & 0x40))
m_pcjr_watchdog->adjust(attotime::from_seconds(3));
} else {
m_pcjr_watchdog->adjust(attotime::never);
fdc_interrupt(0);
}
}
// pcjx port 0x1ff, some info from Toshiya Takeda
void pc_state::pcjx_set_bank(int unk1, int unk2, int unk3)
{
logerror("pcjx: 0x1ff 0:%02x 1:%02x 2:%02x\n", unk1, unk2, unk3);
}
WRITE8_MEMBER(pc_state::pcjx_port_1ff_w)
{
switch(m_pcjx_1ff_count) {
case 0:
m_pcjx_1ff_bankval = data;
m_pcjx_1ff_count++;
break;
case 1:
m_pcjx_1ff_bank[m_pcjx_1ff_bankval & 0x1f][0] = data;
m_pcjx_1ff_count++;
break;
case 2:
m_pcjx_1ff_bank[m_pcjx_1ff_bankval & 0x1f][1] = data;
m_pcjx_1ff_count = 0;
pcjx_set_bank(m_pcjx_1ff_bankval, m_pcjx_1ff_bank[m_pcjx_1ff_bankval & 0x1f][0], data);
break;
}
}
READ8_MEMBER(pc_state::pcjx_port_1ff_r)
{
if(m_pcjx_1ff_count == 2)
pcjx_set_bank(m_pcjx_1ff_bankval, m_pcjx_1ff_bank[m_pcjx_1ff_bankval & 0x1f][0], m_pcjx_1ff_bank[m_pcjx_1ff_bankval & 0x1f][1]);
m_pcjx_1ff_count = 0;
return 0x60; // expansion?
}
WRITE8_MEMBER(pc_state::asst128_fdc_dor_w)
{
pc_fdc_xt_device *fdc = machine().device<pc_fdc_xt_device>("fdc");
@ -1016,12 +705,6 @@ DRIVER_INIT_MEMBER(pc_state,pcmda)
init_pc_common(write_line_delegate(FUNC(pc_state::pc_set_keyb_int),this));
}
DRIVER_INIT_MEMBER(pc_state,pcjr)
{
init_pc_common(write_line_delegate(FUNC(pc_state::pcjr_set_keyb_int),this));
}
IRQ_CALLBACK_MEMBER(pc_state::pc_irq_callback)
{
return m_pic8259->acknowledge();
@ -1057,129 +740,6 @@ MACHINE_RESET_MEMBER(pc_state,pc)
}
MACHINE_START_MEMBER(pc_state,pcjr)
{
pc_int_delay_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pc_state::pcjr_delayed_pic8259_irq),this));
m_pcjr_watchdog = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pc_state::pcjr_fdc_watchdog),this));
pcjr_keyb.keyb_signal_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pc_state::pcjr_keyb_signal_callback),this));
m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(pc_state::pc_irq_callback),this));
machine().device<upd765a_device>("upd765")->set_ready_line_connected(false);
}
MACHINE_RESET_MEMBER(pc_state,pcjr)
{
m_u73_q2 = 0;
m_out1 = 0;
m_pc_spkrdata = 0;
m_pit_out2 = 1;
m_dma_channel = -1;
memset(m_dma_offset,0,sizeof(m_dma_offset));
m_ppi_portc_switch_high = 0;
m_ppi_speaker = 0;
m_ppi_keyboard_clear = 0;
m_ppi_keyb_clock = 0;
m_ppi_portb = 0;
m_ppi_clock_signal = 0;
m_ppi_data_signal = 0;
m_ppi_shift_register = 0;
m_ppi_shift_enable = 0;
m_pcjr_dor = 0;
m_speaker->level_w(0);
m_pcjx_1ff_count = 0;
m_pcjx_1ff_val = 0;
m_pcjx_1ff_bankval = 0;
memset(m_pcjx_1ff_bank, 0, sizeof(m_pcjx_1ff_bank));
pcjr_keyb_init();
}
DEVICE_IMAGE_LOAD_MEMBER( pc_state, pcjr_cartridge )
{
UINT32 address;
UINT32 size;
address = (!strcmp(":cart2", image.device().tag())) ? 0xd0000 : 0xe0000;
if ( image.software_entry() )
{
UINT8 *cart = image.get_software_region( "rom" );
size = image.get_software_region_length("rom" );
memcpy( memregion("maincpu")->base() + address, cart, size );
}
else
{
UINT8 header[0x200];
unsigned header_size = 0;
unsigned image_size = image.length();
bool imagic_hack = false;
/* Check for supported header sizes */
switch( image_size & 0x3ff )
{
case 0x80:
header_size = 0x80;
break;
case 0x200:
header_size = 0x200;
break;
default:
image.seterror(IMAGE_ERROR_UNSUPPORTED, "Invalid header size" );
return IMAGE_INIT_FAIL;
}
/* Check for supported image sizes */
switch( image_size - header_size )
{
case 0xa000:
imagic_hack = true;
case 0x2000:
case 0x4000:
case 0x8000:
case 0x10000:
break;
default:
image.seterror(IMAGE_ERROR_UNSUPPORTED, "Invalid rom file size" );
return IMAGE_INIT_FAIL;
}
/* Read and verify the header */
if ( header_size != image.fread( header, header_size ) )
{
image.seterror(IMAGE_ERROR_UNSUPPORTED, "Unable to read header" );
return IMAGE_INIT_FAIL;
}
/* Read the cartridge contents */
if ( ( image_size - header_size ) != image.fread(memregion("maincpu")->base() + address, image_size - header_size ) )
{
image.seterror(IMAGE_ERROR_UNSUPPORTED, "Unable to read cartridge contents" );
return IMAGE_INIT_FAIL;
}
if (imagic_hack)
{
UINT8 *cart_area = memregion("maincpu")->base() + address;
memcpy( cart_area + 0xe000, cart_area + 0x2000, 0x2000 );
memcpy( cart_area + 0xc000, cart_area + 0x2000, 0x2000 );
memcpy( cart_area + 0xa000, cart_area + 0x2000, 0x2000 );
memcpy( cart_area + 0x8000, cart_area + 0x2000, 0x2000 );
memcpy( cart_area + 0x6000, cart_area, 0x2000 );
memcpy( cart_area + 0x4000, cart_area, 0x2000 );
memcpy( cart_area + 0x2000, cart_area, 0x2000 );
}
}
return IMAGE_INIT_PASS;
}
/**************************************************************************
*
* Interrupt handlers.
@ -1194,14 +754,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(pc_state::pc_frame_interrupt)
pc_keyboard();
}
TIMER_DEVICE_CALLBACK_MEMBER(pc_state::pcjr_frame_interrupt)
{
int scanline = param;
if((scanline % 64) == 0 && pcjr_keyb.transferring == 0 )
pc_keyboard();
}
/*
ibm xt bios
-----------

View File

@ -1,442 +0,0 @@
#include "emu.h"
#include "machine/pckeybrd.h"
#include "includes/pc.h"
#include "machine/pit8253.h"
#include "includes/tandy1t.h"
/* tandy 1000 eeprom
hx and later
clock, and data out lines at 0x37c
data in at 0x62 bit 4 (0x10)
8x read 16 bit word at x
30 cx 30 4x 16bit 00 write 16bit at x
*/
NVRAM_HANDLER( tandy1000 )
{
tandy_pc_state *state = machine.driver_data<tandy_pc_state>();
if (file==NULL)
{
// init only
}
else if (read_or_write)
{
file->write(state->m_eeprom_ee, sizeof(state->m_eeprom_ee));
}
else
{
file->read(state->m_eeprom_ee, sizeof(state->m_eeprom_ee));
}
}
int tandy_pc_state::tandy1000_read_eeprom()
{
if ((m_eeprom_state>=100)&&(m_eeprom_state<=199))
return m_eeprom_data&0x8000;
return 1;
}
void tandy_pc_state::tandy1000_write_eeprom(UINT8 data)
{
if (!m_eeprom_clock && (data&4) )
{
// logerror("!!!tandy1000 eeprom %.2x %.2x\n",m_eeprom_state, data);
switch (m_eeprom_state)
{
case 0:
if ((data&3)==0) m_eeprom_state++;
break;
case 1:
if ((data&3)==2) m_eeprom_state++;
break;
case 2:
if ((data&3)==3) m_eeprom_state++;
break;
case 3:
m_eeprom_oper=data&1;
m_eeprom_state++;
break;
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
m_eeprom_oper=(m_eeprom_oper<<1)|(data&1);
m_eeprom_state++;
break;
case 10:
m_eeprom_oper=(m_eeprom_oper<<1)|(data&1);
logerror("!!!tandy1000 eeprom %.2x\n",m_eeprom_oper);
if ((m_eeprom_oper&0xc0)==0x80)
{
m_eeprom_state=100;
m_eeprom_data=m_eeprom_ee[m_eeprom_oper&0x3f].low
|(m_eeprom_ee[m_eeprom_oper&0x3f].high<<8);
logerror("!!!tandy1000 eeprom read %.2x,%.4x\n",m_eeprom_oper,m_eeprom_data);
}
else if ((m_eeprom_oper&0xc0)==0x40)
{
m_eeprom_state=200;
}
else
m_eeprom_state=0;
break;
/* read 16 bit */
case 100:
m_eeprom_state++;
break;
case 101:
case 102:
case 103:
case 104:
case 105:
case 106:
case 107:
case 108:
case 109:
case 110:
case 111:
case 112:
case 113:
case 114:
case 115:
m_eeprom_data<<=1;
m_eeprom_state++;
break;
case 116:
m_eeprom_data<<=1;
m_eeprom_state=0;
break;
/* write 16 bit */
case 200:
case 201:
case 202:
case 203:
case 204:
case 205:
case 206:
case 207:
case 208:
case 209:
case 210:
case 211:
case 212:
case 213:
case 214:
m_eeprom_data=(m_eeprom_data<<1)|(data&1);
m_eeprom_state++;
break;
case 215:
m_eeprom_data=(m_eeprom_data<<1)|(data&1);
logerror("tandy1000 %.2x %.4x written\n",m_eeprom_oper,m_eeprom_data);
m_eeprom_ee[m_eeprom_oper&0x3f].low=m_eeprom_data&0xff;
m_eeprom_ee[m_eeprom_oper&0x3f].high=m_eeprom_data>>8;
m_eeprom_state=0;
break;
}
}
m_eeprom_clock=data&4;
}
WRITE8_MEMBER( tandy_pc_state::pc_t1t_p37x_w )
{
// DBG_LOG(2,"T1T_p37x_w",("%.5x #%d $%02x\n", space.device().safe_pc( ),offset, data));
if (offset!=4)
logerror("T1T_p37x_w %.5x #%d $%02x\n", space.device().safe_pc( ),offset, data);
m_tandy_data[offset]=data;
switch( offset )
{
case 4:
tandy1000_write_eeprom(data);
break;
}
}
READ8_MEMBER( tandy_pc_state::pc_t1t_p37x_r )
{
int data = m_tandy_data[offset];
// DBG_LOG(1,"T1T_p37x_r",("%.5x #%d $%02x\n", space.device().safe_pc( ), offset, data));
return data;
}
/* this is for tandy1000hx
hopefully this works for all x models
must not be a ppi8255 chip
(think custom chip)
port c:
bit 4 input eeprom data in
bit 3 output turbo mode
*/
WRITE8_MEMBER( tandy_pc_state::tandy1000_pio_w )
{
switch (offset)
{
case 1:
m_tandy_ppi_portb = data;
m_pit8253->write_gate2(BIT(data, 0));
pc_speaker_set_spkrdata( data & 0x02 );
// sx enables keyboard from bit 3, others bit 6, hopefully theres no conflict
pc_keyb_set_clock(data&0x48);
if ( data & 0x80 )
{
pc_keyb_clear();
}
break;
case 2:
m_tandy_ppi_portc = data;
if (data & 8)
m_maincpu->set_clock_scale(1);
else
m_maincpu->set_clock_scale(4.77/8);
break;
}
}
READ8_MEMBER(tandy_pc_state::tandy1000_pio_r)
{
int data=0xff;
switch (offset)
{
case 0:
data = pc_keyb_read();
break;
case 1:
data=m_tandy_ppi_portb;
break;
case 2:
// if (tandy1000hx) {
// data=m_tandy_ppi_portc; // causes problems (setuphx)
if (!tandy1000_read_eeprom()) data&=~0x10;
// }
break;
}
return data;
}
void tandy_pc_state::tandy1000_set_bios_bank()
{
UINT8 *p = NULL;
assert( m_romcs0 != NULL );
assert( m_romcs1 != NULL );
assert( m_biosbank != NULL );
if ( m_tandy_bios_bank & 0x10 )
{
if ( m_tandy_bios_bank & 0x04 )
{
p = m_romcs0->base() + ( m_tandy_bios_bank & 0x03 ) * 0x10000;
}
else
{
p = m_romcs1->base() + ( m_tandy_bios_bank & 0x03 ) * 0x10000;
}
}
else
{
if ( m_tandy_bios_bank & 0x08 )
{
p = m_romcs0->base() + ( m_tandy_bios_bank & 0x07 ) * 0x10000;
}
else
{
p = m_romcs1->base() + ( m_tandy_bios_bank & 0x07 ) * 0x10000;
}
}
m_biosbank->set_base( p );
}
MACHINE_RESET_MEMBER(tandy_pc_state,tandy1000rl)
{
MACHINE_RESET_CALL_MEMBER( pc );
m_tandy_bios_bank = 6;
tandy1000_set_bios_bank();
}
DRIVER_INIT_MEMBER(tandy_pc_state,t1000hx)
{
init_pc_common(write_line_delegate(FUNC(tandy_pc_state::pc_set_keyb_int),this));
pc_turbo_setup(4.77/12, 1);
}
DRIVER_INIT_MEMBER(tandy_pc_state,t1000sl)
{
// Fix up memory region (highest address bit flipped??)
UINT8 *rom = memregion("romcs0")->base();
for( int i = 0; i < 0x40000; i++ )
{
UINT8 d = rom[0x40000 + i];
rom[0x40000 + i] = rom[i];
rom[i] = d;
}
DRIVER_INIT_NAME(t1000hx)();
}
READ8_MEMBER( tandy_pc_state::tandy1000_bank_r )
{
UINT8 data = 0xFF;
logerror( "%s: tandy1000_bank_r: offset = %x\n", space.machine().describe_context(), offset );
switch( offset )
{
case 0x00: /* FFEA */
data = m_tandy_bios_bank ^ 0x10; // Bit 4 is read back inverted
break;
}
return data;
}
WRITE8_MEMBER( tandy_pc_state::tandy1000_bank_w )
{
logerror( "%s: tandy1000_bank_w: offset = %x, data = %02x\n", space.machine().describe_context(), offset, data );
switch( offset )
{
case 0x00: /* FFEA */
m_tandy_bios_bank = data;
tandy1000_set_bios_bank();
break;
// UART clock, joystick, and sound enable
// bit 0 - 0 = Clock divided by 13
// 1 = Clock divided by 1
// bit 1 - 0 = Disable joystick
// 1 = Enable joystick
// bit 2 - 0 = Disable Sound Chip
// 1 = Enable Sound Chip
case 0x01:
break;
}
}
INPUT_PORTS_START( t1000_keyboard )
PORT_START("pc_keyboard_0")
PORT_BIT ( 0x0001, 0x0000, IPT_UNUSED ) /* unused scancode 0 */
PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) /* Esc 01 81 */
PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1 !") PORT_CODE(KEYCODE_1) /* 1 02 82 */
PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2 @") PORT_CODE(KEYCODE_2) /* 2 03 83 */
PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3 #") PORT_CODE(KEYCODE_3) /* 3 04 84 */
PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4 $") PORT_CODE(KEYCODE_4) /* 4 05 85 */
PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5 %") PORT_CODE(KEYCODE_5) /* 5 06 86 */
PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6 ^") PORT_CODE(KEYCODE_6) /* 6 07 87 */
PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7 &") PORT_CODE(KEYCODE_7) /* 7 08 88 */
PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8 *") PORT_CODE(KEYCODE_8) /* 8 09 89 */
PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9 (") PORT_CODE(KEYCODE_9) /* 9 0A 8A */
PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0 )") PORT_CODE(KEYCODE_0) /* 0 0B 8B */
PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("- _") PORT_CODE(KEYCODE_MINUS) /* - 0C 8C */
PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("= +") PORT_CODE(KEYCODE_EQUALS) /* = 0D 8D */
PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("<--") PORT_CODE(KEYCODE_BACKSPACE) /* Backspace 0E 8E */
PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) /* Tab 0F 8F */
PORT_START("pc_keyboard_1")
PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) /* Q 10 90 */
PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) /* W 11 91 */
PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) /* E 12 92 */
PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) /* R 13 93 */
PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) /* T 14 94 */
PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) /* Y 15 95 */
PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) /* U 16 96 */
PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) /* I 17 97 */
PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) /* O 18 98 */
PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) /* P 19 99 */
PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("[ {") PORT_CODE(KEYCODE_OPENBRACE) /* [ 1A 9A */
PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("] }") PORT_CODE(KEYCODE_CLOSEBRACE) /* ] 1B 9B */
PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) /* Enter 1C 9C */
PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L-Ctrl") PORT_CODE(KEYCODE_LCONTROL) /* Left Ctrl 1D 9D */
PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) /* A 1E 9E */
PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) /* S 1F 9F */
PORT_START("pc_keyboard_2")
PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) /* D 20 A0 */
PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) /* F 21 A1 */
PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) /* G 22 A2 */
PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) /* H 23 A3 */
PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) /* J 24 A4 */
PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) /* K 25 A5 */
PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) /* L 26 A6 */
PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("; :") PORT_CODE(KEYCODE_COLON) /* ; 27 A7 */
PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("' \"") PORT_CODE(KEYCODE_QUOTE) /* ' 28 A8 */
PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Cursor Up") PORT_CODE(KEYCODE_UP) /* 29 A9 */
PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L-Shift") PORT_CODE(KEYCODE_LSHIFT) /* Left Shift 2A AA */
PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Cursor Left") PORT_CODE(KEYCODE_LEFT) /* 2B AB */
PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) /* Z 2C AC */
PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) /* X 2D AD */
PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) /* C 2E AE */
PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) /* V 2F AF */
PORT_START("pc_keyboard_3")
PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) /* B 30 B0 */
PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) /* N 31 B1 */
PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) /* M 32 B2 */
PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(", <") PORT_CODE(KEYCODE_COMMA) /* , 33 B3 */
PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) /* . 34 B4 */
PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) /* / 35 B5 */
PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("R-Shift") PORT_CODE(KEYCODE_RSHIFT) /* Right Shift 36 B6 */
PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Print") /* 37 B7 */
PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Alt") PORT_CODE(KEYCODE_LALT) /* Left Alt 38 B8 */
PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) /* Space 39 B9 */
PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Caps") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE /* Caps Lock 3A BA */
PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) /* F1 3B BB */
PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) /* F2 3C BC */
PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) /* F3 3D BD */
PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) /* F4 3E BE */
PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) /* F5 3F BF */
PORT_START("pc_keyboard_4")
PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) /* F6 40 C0 */
PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) /* F7 41 C1 */
PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) /* F8 42 C2 */
PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F9") PORT_CODE(KEYCODE_F9) /* F9 43 C3 */
PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F10") PORT_CODE(KEYCODE_F10) /* F10 44 C4 */
PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("NumLock") PORT_CODE(KEYCODE_NUMLOCK) PORT_TOGGLE /* Num Lock 45 C5 */
PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Hold") PORT_CODE(KEYCODE_SCRLOCK) /* 46 C6 */
PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 7 \\") PORT_CODE(KEYCODE_7_PAD) /* Keypad 7 47 C7 */
PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 8 ~") PORT_CODE(KEYCODE_8_PAD) /* Keypad 8 48 C8 */
PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 9 (PgUp)") PORT_CODE(KEYCODE_9_PAD) /* Keypad 9 (PgUp) 49 C9 */
PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Cursor Down") PORT_CODE(KEYCODE_DOWN) /* 4A CA */
PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 4 |") PORT_CODE(KEYCODE_4_PAD) /* Keypad 4 4B CB */
PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 5") PORT_CODE(KEYCODE_5_PAD) /* Keypad 5 4C CC */
PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 6") PORT_CODE(KEYCODE_6_PAD) /* Keypad 6 4D CD */
PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Cursor Right") PORT_CODE(KEYCODE_RIGHT) /* 4E CE */
PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 1 (End)") PORT_CODE(KEYCODE_1_PAD) /* Keypad 1 (End) 4F CF */
PORT_START("pc_keyboard_5")
PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 2 `") PORT_CODE(KEYCODE_2_PAD) /* Keypad 2 50 D0 */
PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 3 (PgDn)") PORT_CODE(KEYCODE_3_PAD) /* Keypad 3 (PgDn) 51 D1 */
PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 0") PORT_CODE(KEYCODE_0_PAD) /* Keypad 0 52 D2 */
PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP - (Del)") PORT_CODE(KEYCODE_MINUS_PAD) /* - Delete 53 D3 */
PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_STOP) /* Break 54 D4 */
PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("+ Insert") PORT_CODE(KEYCODE_PLUS_PAD) /* + Insert 55 D5 */
PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_DEL_PAD) /* . 56 D6 */
PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER_PAD) /* Enter 57 D7 */
PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Home") PORT_CODE(KEYCODE_HOME) /* HOME 58 D8 */
PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F11") PORT_CODE(KEYCODE_F11) /* F11 59 D9 */
PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F12") PORT_CODE(KEYCODE_F12) /* F12 5a Da */
PORT_START("pc_keyboard_6")
PORT_BIT ( 0xffff, 0x0000, IPT_UNUSED )
PORT_START("pc_keyboard_7")
PORT_BIT ( 0xffff, 0x0000, IPT_UNUSED )
INPUT_PORTS_END

View File

@ -1552,7 +1552,8 @@ $(MESSOBJ)/pitronic.a: \
$(MESS_DRIVERS)/beta.o \
$(MESSOBJ)/pc.a: \
$(MESS_MACHINE)/tandy1t.o \
$(MESS_DRIVERS)/tandy1t.o \
$(MESS_DRIVERS)/ibmpcjr.o \
$(MESS_MACHINE)/europc.o \
$(MESS_MACHINE)/pc.o \
$(MESS_DRIVERS)/pc.o \