mirror of
https://github.com/holub/mame
synced 2025-06-06 21:03:47 +03:00
(mess) pc: split tandy 1000 and pcjr from pc.c (nw)
This commit is contained in:
parent
2026fc5a9d
commit
8d2db3434a
4
.gitattributes
vendored
4
.gitattributes
vendored
@ -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
754
src/mess/drivers/ibmpcjr.c
Normal 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)
|
@ -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
1047
src/mess/drivers/tandy1t.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -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);
|
||||
};
|
||||
|
||||
|
@ -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_ */
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
-----------
|
||||
|
@ -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
|
@ -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 \
|
||||
|
Loading…
Reference in New Issue
Block a user