diff --git a/.gitattributes b/.gitattributes index 7cad1c4226d..ddd736edcc2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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 diff --git a/src/mess/drivers/ibmpcjr.c b/src/mess/drivers/ibmpcjr.c new file mode 100644 index 00000000000..6a35439348c --- /dev/null +++ b/src/mess/drivers/ibmpcjr.c @@ -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 m_maincpu; + required_device m_pic8259; + required_device m_pit8253; + required_device m_speaker; + required_device m_cassette; + required_device m_ram; + required_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("0")->get_device(); + floppy_image_device *floppy1 = NULL; + + if(m_fdc->subdevice("1")) + floppy1 = m_fdc->subdevice("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) diff --git a/src/mess/drivers/pc.c b/src/mess/drivers/pc.c index 2862c45da78..1133c598f19 100644 --- a/src/mess/drivers/pc.c +++ b/src/mess/drivers/pc.c @@ -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, "", "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) diff --git a/src/mess/drivers/tandy1t.c b/src/mess/drivers/tandy1t.c new file mode 100644 index 00000000000..5803ae4a2fd --- /dev/null +++ b/src/mess/drivers/tandy1t.c @@ -0,0 +1,1047 @@ +/* +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 */ + +#include "emu.h" +#include "includes/genpc.h" +#include "machine/pckeybrd.h" +#include "machine/nvram.h" +#include "machine/pc_fdc.h" +#include "video/pc_t1t.h" +#include "sound/sn76496.h" +#include "cpu/i86/i86.h" +#include "cpu/i86/i286.h" +#include "bus/isa/isa.h" +#include "bus/isa/isa_cards.h" + +class tandy1000_mb_device : public ibm5160_mb_device +{ +public: + // construction/destruction + tandy1000_mb_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : ibm5160_mb_device(mconfig, tag, owner, clock) { } + +protected: + // device-level overrides + void device_start(); +}; + +void tandy1000_mb_device::device_start() +{ + install_device(0x0000, 0x000f, 0, 0, read8_delegate(FUNC(am9517a_device::read), (am9517a_device*)m_dma8237), write8_delegate(FUNC(am9517a_device::write), (am9517a_device*)m_dma8237) ); + install_device(0x0020, 0x0021, 0, 0, read8_delegate(FUNC(pic8259_device::read), (pic8259_device*)m_pic8259), write8_delegate(FUNC(pic8259_device::write), (pic8259_device*)m_pic8259) ); + install_device(0x0040, 0x0043, 0, 0, read8_delegate(FUNC(pit8253_device::read), (pit8253_device*)m_pit8253), write8_delegate(FUNC(pit8253_device::write), (pit8253_device*)m_pit8253) ); + install_device(0x0080, 0x0087, 0, 0, read8_delegate(FUNC(ibm5160_mb_device::pc_page_r), this), write8_delegate(FUNC(ibm5160_mb_device::pc_page_w),this) ); + install_device(0x00a0, 0x00a1, 0, 0, read8_delegate(), write8_delegate(FUNC(ibm5160_mb_device::nmi_enable_w),this)); + /* MESS managed RAM */ + if ( m_ram->pointer() ) + membank( "bank10" )->set_base( m_ram->pointer() ); +} + +const device_type TANDY1000_MOTHERBOARD = &device_creator; + +static SLOT_INTERFACE_START( pc_dd_floppies ) + SLOT_INTERFACE( "525dd", FLOPPY_525_DD ) + SLOT_INTERFACE( "35dd", FLOPPY_35_DD ) +SLOT_INTERFACE_END + +static MACHINE_CONFIG_FRAGMENT( cfg_fdc_35 ) + MCFG_PC_FDC_XT_ADD("fdc") + MCFG_PC_FDC_INTRQ_CALLBACK(WRITELINE(isa8_fdc_device, irq_w)) + MCFG_PC_FDC_DRQ_CALLBACK(WRITELINE(isa8_fdc_device, drq_w)) + MCFG_FLOPPY_DRIVE_ADD("fdc:0", pc_dd_floppies, "35dd", isa8_fdc_device::floppy_formats) + MCFG_SLOT_FIXED(true) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_FRAGMENT( cfg_fdc_525 ) + MCFG_PC_FDC_XT_ADD("fdc") + MCFG_PC_FDC_INTRQ_CALLBACK(WRITELINE(isa8_fdc_device, irq_w)) + MCFG_PC_FDC_DRQ_CALLBACK(WRITELINE(isa8_fdc_device, drq_w)) + MCFG_FLOPPY_DRIVE_ADD("fdc:0", pc_dd_floppies, "525dd", isa8_fdc_device::floppy_formats) + MCFG_SLOT_FIXED(true) +MACHINE_CONFIG_END + + +class isa8_fdc_xt35_device : public isa8_fdc_device { +public: + isa8_fdc_xt35_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual machine_config_constructor device_mconfig_additions() const { return MACHINE_CONFIG_NAME(cfg_fdc_35); } +}; + +const device_type ISA8_FDC_XT_35 = &device_creator; + +isa8_fdc_xt35_device::isa8_fdc_xt35_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + isa8_fdc_device(mconfig, ISA8_FDC_XT_35, "ISA 8bits XT FDC 3.5 hookup", tag, owner, clock, "isa8_fdc_xt35", __FILE__) { } + +class isa8_fdc_xt525_device : public isa8_fdc_device { +public: + isa8_fdc_xt525_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual machine_config_constructor device_mconfig_additions() const { return MACHINE_CONFIG_NAME(cfg_fdc_525); } +}; + +const device_type ISA8_FDC_XT_525 = &device_creator; + +isa8_fdc_xt525_device::isa8_fdc_xt525_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + isa8_fdc_device(mconfig, ISA8_FDC_XT_525, "ISA 8bits XT FDC 5.25 hookup", tag, owner, clock, "isa8_fdc_xt525", __FILE__) { } + +class tandy1000_state : public driver_device +{ +public: + tandy1000_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_romcs0(*this, "romcs0") + , m_romcs1(*this, "romcs1") + , m_biosbank(*this, "biosbank") + , m_mb(*this, "mb") { } + + required_device m_maincpu; + +// Memory regions for the machines that support rom banking + optional_memory_region m_romcs0; + optional_memory_region m_romcs1; + optional_memory_bank m_biosbank; + + required_device m_mb; + + 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); + + void machine_start(); + DECLARE_MACHINE_RESET(tandy1000rl); + TIMER_DEVICE_CALLBACK_MEMBER(pc_frame_interrupt); + + struct + { + UINT8 low, high; + } m_eeprom_ee[0x40]; /* only 0 to 4 used in hx, addressing seems to allow this */ + + 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; + + void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + emu_timer* m_keyboard_timer; + + enum + { + TIMER_KEYBOARD + }; + + void pc_keyboard(); + void pc_keyb_set_clock(bool on); + void pc_keyb_clear(); + + bool m_pc_keyb_self_test; + bool m_pc_keyb_on; + UINT8 m_pc_keyb_data; +}; + +void tandy1000_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch(id) + { + case TIMER_KEYBOARD: + if ( m_pc_keyb_on ) { + pc_keyboard(); + } else { + /* Clock has been low for more than 5 msec, start diagnostic test */ + at_keyboard_reset(machine()); + m_pc_keyb_self_test = 1; + } + break; + } +} + +/* 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 +*/ + +int tandy1000_state::tandy1000_read_eeprom() +{ + if ((m_eeprom_state>=100)&&(m_eeprom_state<=199)) + return m_eeprom_data&0x8000; + return 1; +} + +void tandy1000_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( tandy1000_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( tandy1000_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( tandy1000_state::tandy1000_pio_w ) +{ + switch (offset) + { + case 1: + m_tandy_ppi_portb = data; + m_mb->m_pit8253->write_gate2(BIT(data, 0)); + m_mb->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) ? true : false); + 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(tandy1000_state::tandy1000_pio_r) +{ + int data=0xff; + switch (offset) + { + case 0: + data = m_pc_keyb_data; + 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 tandy1000_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 ); +} + +void tandy1000_state::machine_start() +{ + machine().device("nvram")->set_base(m_eeprom_ee, sizeof(m_eeprom_ee)); +} + +MACHINE_RESET_MEMBER(tandy1000_state, tandy1000rl) +{ + m_tandy_bios_bank = 6; + tandy1000_set_bios_bank(); +} + +DRIVER_INIT_MEMBER(tandy1000_state,t1000hx) +{ + at_keyboard_init(machine(), AT_KEYBOARD_TYPE_PC); + at_keyboard_set_scan_code_set(1); + m_keyboard_timer = timer_alloc(TIMER_KEYBOARD); +} + + +DRIVER_INIT_MEMBER(tandy1000_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( tandy1000_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( tandy1000_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; + } +} + +TIMER_DEVICE_CALLBACK_MEMBER(tandy1000_state::pc_frame_interrupt) +{ + if(!(param % 64)) + pc_keyboard(); +} + +void tandy1000_state::pc_keyb_set_clock(bool on) +{ + if (m_pc_keyb_on != on) + { + if (!on) + m_keyboard_timer->adjust(attotime::from_msec(5)); + else { + if ( m_pc_keyb_self_test ) { + /* The self test of the keyboard takes some time. 2 msec seems to work. */ + /* This still needs to verified against a real keyboard. */ + m_keyboard_timer->adjust(attotime::from_msec( 2 )); + } else { + m_keyboard_timer->reset(); + m_pc_keyb_self_test = 0; + } + } + + m_pc_keyb_on = on; + } +} + +void tandy1000_state::pc_keyb_clear(void) +{ + m_pc_keyb_data = 0; + m_mb->m_pic8259->ir1_w(0); +} + +void tandy1000_state::pc_keyboard(void) +{ + int data; + + at_keyboard_polling(); + + if (m_pc_keyb_on) + { + if ( (data=at_keyboard_read())!=-1) { + m_pc_keyb_data = data; + //DBG_LOG(1,"KB_scancode",("$%02x\n", m_pc_keyb_data)); + m_mb->m_pic8259->ir1_w(1); + m_pc_keyb_self_test = 0; + } + } +} + +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 + +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 ADDRESS_MAP_START(tandy1000_map, AS_PROGRAM, 8, tandy1000_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, tandy1000_state ) + AM_RANGE(0x0060, 0x0063) AM_READWRITE(tandy1000_pio_r, tandy1000_pio_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(0x0378, 0x037f) AM_READWRITE(pc_t1t_p37x_r, pc_t1t_p37x_w) + AM_RANGE(0x03d0, 0x03df) AM_DEVREADWRITE("pcvideo_t1000", pcvideo_t1000_device, read, write) +ADDRESS_MAP_END + +static ADDRESS_MAP_START(tandy1000_16_map, AS_PROGRAM, 16, tandy1000_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, tandy1000_state ) + AM_RANGE(0x0060, 0x0063) AM_READWRITE8(tandy1000_pio_r, tandy1000_pio_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(0x0378, 0x037f) AM_READWRITE8(pc_t1t_p37x_r, pc_t1t_p37x_w, 0xffff) + AM_RANGE(0x03d0, 0x03df) AM_DEVREADWRITE8("pcvideo_t1000", pcvideo_t1000_device, read, write, 0xffff) +ADDRESS_MAP_END + +static ADDRESS_MAP_START(tandy1000_16_bank_io, AS_IO, 16, tandy1000_state ) + AM_IMPORT_FROM(tandy1000_16_io) + 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, tandy1000_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 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 SLOT_INTERFACE_START( tandy1000_drives ) + SLOT_INTERFACE( "fdc_xt_35", ISA8_FDC_XT_35 ) + SLOT_INTERFACE( "fdc_xt_525", ISA8_FDC_XT_525 ) +SLOT_INTERFACE_END + +static GFXDECODE_START( t1000 ) + GFXDECODE_ENTRY( "gfx1", 0x0000, t1000_charlayout, 3, 1 ) +GFXDECODE_END + +static MACHINE_CONFIG_FRAGMENT(tandy1000_common) + MCFG_DEVICE_ADD("mb", TANDY1000_MOTHERBOARD, 0) + tandy1000_mb_device::static_set_cputag(*device, "maincpu"); + + /* 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_ADD_0FILL("nvram"); + + MCFG_ISA8_SLOT_ADD("mb:isa", "isa_fdc", tandy1000_drives, "fdc_xt_35", true) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa_lpt", pc_isa8_cards, "lpt", true) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa_com", pc_isa8_cards, "com", true) + + MCFG_PC_JOY_ADD("pc_joy") + + /* internal ram */ + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("640K") +MACHINE_CONFIG_END + +static MACHINE_CONFIG_START( t1000hx, tandy1000_state ) + MCFG_CPU_ADD("maincpu", I8088, 8000000) + MCFG_CPU_PROGRAM_MAP(tandy1000_map) + MCFG_CPU_IO_MAP(tandy1000_io) + MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", tandy1000_state, pc_frame_interrupt, "pcvideo_t1000:screen", 0, 1) + + MCFG_FRAGMENT_ADD(tandy1000_common) + + // plus cards are isa with a nonstandard conntector + MCFG_ISA8_SLOT_ADD("mb:isa", "plus1", pc_isa8_cards, NULL, false) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( t1000sx, t1000hx ) + MCFG_DEVICE_REMOVE("isa_fdc") + MCFG_ISA8_SLOT_ADD("mb:isa", "isa_fdc", tandy1000_drives, "fdc_xt_525", true) + + MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, NULL, false) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_START( t1000_16, tandy1000_state ) + MCFG_CPU_ADD("maincpu", I8086, XTAL_28_63636MHz / 3) + MCFG_CPU_PROGRAM_MAP(tandy1000_16_map) + MCFG_CPU_IO_MAP(tandy1000_16_bank_io) + MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", tandy1000_state, pc_frame_interrupt, "pcvideo_t1000:screen", 0, 1) + + MCFG_FRAGMENT_ADD(tandy1000_common) + + MCFG_MACHINE_RESET_OVERRIDE(tandy1000_state,tandy1000rl) + +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( t1000_16_8, t1000_16 ) + MCFG_CPU_MODIFY( "maincpu" ) + MCFG_CPU_CLOCK( XTAL_24MHz / 3 ) + + MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, NULL, false) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_START( t1000_286, tandy1000_state ) + MCFG_CPU_ADD("maincpu", I80286, XTAL_28_63636MHz / 2) + MCFG_CPU_PROGRAM_MAP(tandy1000_286_map) + MCFG_CPU_IO_MAP(tandy1000_16_io) + MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", tandy1000_state, pc_frame_interrupt, "pcvideo_t1000:screen", 0, 1) + + MCFG_FRAGMENT_ADD(tandy1000_common) + + MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa5", pc_isa8_cards, NULL, false) +MACHINE_CONFIG_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 + +// 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( 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 + +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 + + +/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ +// tandy 1000 +COMP( 1987, t1000hx, ibm5150, 0, t1000hx, tandy1t, tandy1000_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 HX", 0) +COMP( 1987, t1000sx, ibm5150, 0, t1000sx, tandy1t, tandy1000_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 SX", 0) +COMP( 1987, t1000tx, ibm5150, 0, t1000_286, tandy1t, tandy1000_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 TX", 0) +COMP( 1989, t1000rl, ibm5150, 0, t1000_16, tandy1t, tandy1000_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 RL", 0) +COMP( 1989, t1000tl2, ibm5150, 0, t1000_286, tandy1t, tandy1000_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 TL/2", 0) +COMP( 1988, t1000sl2, ibm5150, 0, t1000_16_8, tandy1t, tandy1000_state, t1000sl, "Tandy Radio Shack", "Tandy 1000 SL/2", 0) + diff --git a/src/mess/includes/pc.h b/src/mess/includes/pc.h index e6ce29315dc..ca1973db44a 100644 --- a/src/mess/includes/pc.h +++ b/src/mess/includes/pc.h @@ -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); }; diff --git a/src/mess/includes/tandy1t.h b/src/mess/includes/tandy1t.h deleted file mode 100644 index c4b6130ca92..00000000000 --- a/src/mess/includes/tandy1t.h +++ /dev/null @@ -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_ */ diff --git a/src/mess/machine/isbc_215g.c b/src/mess/machine/isbc_215g.c index 9dde701022a..5b8b3c751de 100644 --- a/src/mess/machine/isbc_215g.c +++ b/src/mess/machine/isbc_215g.c @@ -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 diff --git a/src/mess/machine/pc.c b/src/mess/machine/pc.c index f6df38574c2..3f37c4e98e7 100644 --- a/src/mess/machine/pc.c +++ b/src/mess/machine/pc.c @@ -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("upd765"); - floppy_image_device *floppy0 = fdc->subdevice("0")->get_device(); - floppy_image_device *floppy1 = NULL; - - if(fdc->subdevice("1")) - floppy1 = fdc->subdevice("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("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("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 ----------- diff --git a/src/mess/machine/tandy1t.c b/src/mess/machine/tandy1t.c deleted file mode 100644 index c09bfd6260a..00000000000 --- a/src/mess/machine/tandy1t.c +++ /dev/null @@ -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(); - - 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 diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 69078cf9baa..f9ebdcece15 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -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 \