diff --git a/src/emu/bus/bus.mak b/src/emu/bus/bus.mak index 152ffa26890..ca6ba23e92a 100644 --- a/src/emu/bus/bus.mak +++ b/src/emu/bus/bus.mak @@ -1453,6 +1453,7 @@ BUSOBJS += $(BUSOBJ)/scsi/d9060hd.o BUSOBJS += $(BUSOBJ)/scsi/sa1403d.o BUSOBJS += $(BUSOBJ)/scsi/s1410.o BUSOBJS += $(BUSOBJ)/scsi/pc9801_sasi.o +BUSOBJS += $(BUSOBJ)/scsi/omti5100.o endif #------------------------------------------------- diff --git a/src/emu/bus/scsi/omti5100.c b/src/emu/bus/scsi/omti5100.c new file mode 100644 index 00000000000..a3f00560f73 --- /dev/null +++ b/src/emu/bus/scsi/omti5100.c @@ -0,0 +1,92 @@ +#include "omti5100.h" + +#define OMTI_STATUS_NOT_READY 0x04 +#define OMTI_READ_DATA_BUFFER 0xec +#define OMTI_ASSIGN_DISK_PARAM 0xc2 + +const device_type OMTI5100 = &device_creator; + +#if 0 +ROM_START( omti5100 ) + ROM_REGION(0x1000, "mcu", 0) // Hitachi Z8 + ROM_LOAD("100240-N.7a", 0x0000, 0x1000, CRC(d227d6cb) SHA1(3d6140764d3d043428c941826370ebf1597c63bd)) +ROM_END + +const rom_entry *omti5100_device::device_rom_region() const +{ + return ROM_NAME( omti5100 ); +} +#endif + +omti5100_device::omti5100_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : scsihd_device(mconfig, OMTI5100, "OMTI 5100", tag, owner, clock, "omti5100", __FILE__), + m_image0(*this, "image0"), + m_image1(*this, "image1") +{ +} + +void omti5100_device::device_start() +{ + m_image = m_image0; + scsihle_device::device_start(); +} + +void omti5100_device::ExecCommand() +{ + harddisk_image_device *image = ((command[1] >> 5) & 1) ? m_image1 : m_image0; + switch(command[0]) + { + case OMTI_READ_DATA_BUFFER: + m_phase = SCSI_PHASE_DATAIN; + m_status_code = SCSI_STATUS_CODE_GOOD; + m_transfer_length = 512; + break; + case OMTI_ASSIGN_DISK_PARAM: + m_phase = SCSI_PHASE_DATAOUT; + m_status_code = SCSI_STATUS_CODE_GOOD; + m_transfer_length = 10; + break; + default: + if(!image) + { + m_phase = SCSI_PHASE_STATUS; + m_status_code = SCSI_STATUS_CODE_CHECK_CONDITION; + m_sense_asc = OMTI_STATUS_NOT_READY; + m_transfer_length = 0; + } + else + { + SetDevice(image); + scsihd_device::ExecCommand(); + } + break; + } +} + +void omti5100_device::ReadData( UINT8 *data, int dataLength ) +{ + switch( command[ 0 ] ) + { + case OMTI_READ_DATA_BUFFER: + data[0] = '5'; + data[1] = '1'; + data[2] = '0'; + data[3] = '0'; + break; + + default: + scsihd_device::ReadData( data, dataLength ); + break; + } +} + +static MACHINE_CONFIG_FRAGMENT( omti5100 ) + MCFG_HARDDISK_ADD("image0") + MCFG_HARDDISK_ADD("image1") +MACHINE_CONFIG_END + + +machine_config_constructor omti5100_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( omti5100 ); +} diff --git a/src/emu/bus/scsi/omti5100.h b/src/emu/bus/scsi/omti5100.h new file mode 100644 index 00000000000..8fcb50bf72d --- /dev/null +++ b/src/emu/bus/scsi/omti5100.h @@ -0,0 +1,28 @@ +#ifndef OMTI5100_H_ +#define OMTI5100_H_ + +#include "emu.h" +#include "scsi.h" +#include "scsihd.h" +#include "imagedev/harddriv.h" + +class omti5100_device : public scsihd_device +{ +public: + omti5100_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + virtual machine_config_constructor device_mconfig_additions() const; + //virtual const rom_entry *device_rom_region() const; + + virtual void ExecCommand(); + virtual void ReadData( UINT8 *data, int dataLength ); + void device_start(); + +private: + required_device m_image0; + required_device m_image1; +}; + +extern const device_type OMTI5100; + +#endif /* OMTI5100_H_ */ diff --git a/src/emu/machine/machine.mak b/src/emu/machine/machine.mak index f7c194186dc..327e9ff739a 100644 --- a/src/emu/machine/machine.mak +++ b/src/emu/machine/machine.mak @@ -1219,15 +1219,6 @@ MACHINEOBJS += $(MACHINEOBJ)/nscsi_hd.o MACHINEOBJS += $(MACHINEOBJ)/nscsi_s1410.o endif -#------------------------------------------------- -# -#@src/emu/machine/omti5100.h,MACHINES += OMTI5100 -#------------------------------------------------- - -ifneq ($(filter OMTI5100,$(MACHINES)),) -MACHINEOBJS += $(MACHINEOBJ)/omti5100.o -endif - #------------------------------------------------- # #@src/emu/machine/pcf8593.h,MACHINES += PCF8593 diff --git a/src/emu/machine/omti5100.c b/src/emu/machine/omti5100.c deleted file mode 100644 index 8e4e8fcfa53..00000000000 --- a/src/emu/machine/omti5100.c +++ /dev/null @@ -1,153 +0,0 @@ -/*************************************************************************** - - SMS OMTI 5100 - - license: MAME, GPL-2.0+ - copyright-holders: Dirk Best - - SCSI/SASI Intelligent Data Controller - - Note: - Skeleton device - - Supports up to two ST-506/412 hard drives - - Z8681 (Z8) - - 8 KB RAM - - 2 KB Buffer RAM - -***************************************************************************/ - -#include "omti5100.h" - - -//************************************************************************** -// CONSTANTS -//************************************************************************** - -#define VERBOSE 1 - - -//************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type OMTI5100 = &device_creator; - -//------------------------------------------------- -// rom_region - device-specific ROM region -//------------------------------------------------- - -ROM_START( omti5100_firmware ) - ROM_REGION(0x2000, "firmware", 0) - ROM_LOAD("1002401-n.7a", 0x0000, 0x2000, CRC(d531e25c) SHA1(22e4762a70841b80e843a5d76175c1fdb6838e18)) -ROM_END - -const rom_entry *omti5100_device::device_rom_region() const -{ - return ROM_NAME( omti5100_firmware ); -} - -//------------------------------------------------- -// machine_config_additions - device-specific -// machine configurations -//------------------------------------------------- - -static MACHINE_CONFIG_FRAGMENT( omti5100_z8 ) -// MCFG_CPU_ADD("z8", Z8681, XTAL_20MHz / 3 /* ??? */) -MACHINE_CONFIG_END - -machine_config_constructor omti5100_device::device_mconfig_additions() const -{ - return MACHINE_CONFIG_NAME( omti5100_z8 ); -} - - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// omti5100_device - constructor -//------------------------------------------------- - -omti5100_device::omti5100_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : - device_t(mconfig, OMTI5100, "OMTI 5100 SCSI/SASI Controller", tag, owner, clock, "omti5100", __FILE__), -// m_cpu(*this, "z8"), - m_bsy_w(*this), - m_cd_w(*this), - m_io_w(*this), - m_req_w(*this), - m_msg_w(*this) -{ -} - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void omti5100_device::device_start() -{ - // resolve callbacks - m_bsy_w.resolve_safe(); - m_cd_w.resolve_safe(); - m_io_w.resolve_safe(); - m_req_w.resolve_safe(); - m_msg_w.resolve_safe(); -} - -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void omti5100_device::device_reset() -{ -} - - -//************************************************************************** -// IMPLEMENTATION -//************************************************************************** - -READ8_MEMBER( omti5100_device::data_r ) -{ - if (VERBOSE) - logerror("%s: data_r\n", tag()); - - return 0xff; -} - -WRITE8_MEMBER( omti5100_device::data_w ) -{ - if (VERBOSE) - logerror("%s: rst_w: %02x\n", tag(), data); -} - -READ_LINE_MEMBER( omti5100_device::parity_r ) -{ - if (VERBOSE) - logerror("%s: parity_r\n", tag()); - - return 1; -} - -WRITE_LINE_MEMBER( omti5100_device::parity_w ) -{ - if (VERBOSE) - logerror("%s: parity_w: %d\n", tag(), state); -} - -WRITE_LINE_MEMBER( omti5100_device::rst_w ) -{ - if (VERBOSE) - logerror("%s: rst_w: %d\n", tag(), state); -} - -WRITE_LINE_MEMBER( omti5100_device::sel_w ) -{ - if (VERBOSE) - logerror("%s: sel_w: %d\n", tag(), state); -} - -WRITE_LINE_MEMBER( omti5100_device::ack_w ) -{ - if (VERBOSE) - logerror("%s: ack_w: %d\n", tag(), state); -} diff --git a/src/emu/machine/omti5100.h b/src/emu/machine/omti5100.h deleted file mode 100644 index ecb8d460d2c..00000000000 --- a/src/emu/machine/omti5100.h +++ /dev/null @@ -1,103 +0,0 @@ -/*************************************************************************** - - SMS OMTI 5100 - - license: MAME, GPL-2.0+ - copyright-holders: Dirk Best - - SCSI/SASI Intelligent Data Controller - -***************************************************************************/ - -#pragma once - -#ifndef __OMTI5100_H__ -#define __OMTI5100_H__ - -#include "emu.h" -#include "cpu/z8/z8.h" - - -//************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_OMTI5100_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, OMTI5100, 0) - -#define MCFG_OMTI5100_BSY_HANDLER(_devcb) \ - devcb = &omti5100_device::set_bsy_handler(*device, DEVCB_##_devcb); - -#define MCFG_OMTI5100_CD_HANDLER(_devcb) \ - devcb = &omti5100_device::set_cd_handler(*device, DEVCB_##_devcb); - -#define MCFG_OMTI5100_IO_HANDLER(_devcb) \ - devcb = &omti5100_device::set_io_handler(*device, DEVCB_##_devcb); - -#define MCFG_OMTI5100_REQ_HANDLER(_devcb) \ - devcb = &omti5100_device::set_req_handler(*device, DEVCB_##_devcb); - -#define MCFG_OMTI5100_MSG_HANDLER(_devcb) \ - devcb = &omti5100_device::set_msg_handler(*device, DEVCB_##_devcb); - - -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> omti5100_device - -class omti5100_device : public device_t -{ -public: - // construction/destruction - omti5100_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - - // callbacks - template static devcb_base &set_bsy_handler(device_t &device, _Object object) - { return downcast(device).m_bsy_w.set_callback(object); } - - template static devcb_base &set_cd_handler(device_t &device, _Object object) - { return downcast(device).m_cd_w.set_callback(object); } - - template static devcb_base &set_io_handler(device_t &device, _Object object) - { return downcast(device).m_io_w.set_callback(object); } - - template static devcb_base &set_req_handler(device_t &device, _Object object) - { return downcast(device).m_req_w.set_callback(object); } - - template static devcb_base &set_msg_handler(device_t &device, _Object object) - { return downcast(device).m_msg_w.set_callback(object); } - - // data - DECLARE_READ8_MEMBER( data_r ); - DECLARE_WRITE8_MEMBER( data_w ); - DECLARE_READ_LINE_MEMBER( parity_r ); - DECLARE_WRITE_LINE_MEMBER( parity_w ); - - // control - DECLARE_WRITE_LINE_MEMBER( rst_w ); - DECLARE_WRITE_LINE_MEMBER( sel_w ); - DECLARE_WRITE_LINE_MEMBER( ack_w ); - -protected: - // device_t overrides - virtual const rom_entry *device_rom_region() const; - virtual machine_config_constructor device_mconfig_additions() const; - virtual void device_start(); - virtual void device_reset(); - -private: -// required_device m_cpu; - - devcb_write_line m_bsy_w; - devcb_write_line m_cd_w; - devcb_write_line m_io_w; - devcb_write_line m_req_w; - devcb_write_line m_msg_w; -}; - -// device type definition -extern const device_type OMTI5100; - -#endif // __OMTI5100_H__ diff --git a/src/emu/machine/pic8259.c b/src/emu/machine/pic8259.c index ea91fa1240b..6d404d654c5 100644 --- a/src/emu/machine/pic8259.c +++ b/src/emu/machine/pic8259.c @@ -44,20 +44,14 @@ void pic8259_device::device_timer(emu_timer &timer, device_timer_id id, int para { logerror("pic8259_timerproc() %s: PIC triggering IRQ #%d\n", tag(), irq); } - if (!BIT(m_ocw3, 2)) - { - m_out_int_func(1); - } + m_out_int_func(1); return; } // if sfnm and in-service don't continue if((m_isr & mask) && m_master && m_cascade && m_nested && (m_slave & mask)) break; } - if (!BIT(m_ocw3, 2)) - { - m_out_int_func(0); - } + m_out_int_func(0); } diff --git a/src/emu/machine/wd_fdc.c b/src/emu/machine/wd_fdc.c index 111d8fd2db0..ced6475e82d 100644 --- a/src/emu/machine/wd_fdc.c +++ b/src/emu/machine/wd_fdc.c @@ -273,7 +273,8 @@ void wd_fdc_t::seek_continue() } if(main_state == SEEK && track == data) { - sub_state = SEEK_DONE; + sub_state = SEEK_WAIT_STABILIZATION_TIME; + delay_cycles(t_gen, 30000); } if(sub_state == SPINUP_DONE) { diff --git a/src/mess/drivers/pcd.c b/src/mess/drivers/pcd.c index 0aa0322358e..ea291b161f6 100644 --- a/src/mess/drivers/pcd.c +++ b/src/mess/drivers/pcd.c @@ -15,12 +15,13 @@ #include "machine/nvram.h" #include "machine/pic8259.h" #include "machine/mc2661.h" -#include "machine/omti5100.h" #include "machine/wd_fdc.h" #include "machine/mc146818.h" +#include "machine/pcd_kbd.h" #include "sound/speaker.h" #include "video/scn2674.h" #include "formats/pc_dsk.h" +#include "bus/scsi/omti5100.h" //************************************************************************** // TYPE DEFINITIONS @@ -35,12 +36,14 @@ public: m_pic1(*this, "pic1"), m_pic2(*this, "pic2"), m_speaker(*this, "speaker"), - m_sasi(*this, "sasi"), m_fdc(*this, "fdc"), m_rtc(*this, "rtc"), m_crtc(*this, "crtc"), m_palette(*this, "palette"), m_gfxdecode(*this, "gfxdecode"), + m_scsi(*this, "scsi"), + m_scsi_data_out(*this, "scsi_data_out"), + m_scsi_data_in(*this, "scsi_data_in"), m_vram(*this, "vram"), m_charram(8*1024) { } @@ -59,35 +62,47 @@ public: DECLARE_WRITE8_MEMBER( led_w ); DECLARE_READ8_MEMBER( detect_r ); DECLARE_WRITE8_MEMBER( detect_w ); - DECLARE_READ8_MEMBER( dskctl_r ); - DECLARE_WRITE8_MEMBER( dskctl_w ); + DECLARE_READ16_MEMBER( dskctl_r ); + DECLARE_WRITE16_MEMBER( dskctl_w ); DECLARE_READ8_MEMBER( mcu_r ); DECLARE_WRITE8_MEMBER( mcu_w ); + DECLARE_READ8_MEMBER( scsi_r ); + DECLARE_WRITE8_MEMBER( scsi_w ); DECLARE_WRITE8_MEMBER( vram_sw_w ); - DECLARE_READ16_MEMBER( vram_r ); DECLARE_WRITE16_MEMBER( vram_w ); SCN2674_DRAW_CHARACTER_MEMBER(display_pixels); DECLARE_FLOPPY_FORMATS( floppy_formats ); + DECLARE_WRITE_LINE_MEMBER(write_scsi_bsy); + DECLARE_WRITE_LINE_MEMBER(write_scsi_cd); + DECLARE_WRITE_LINE_MEMBER(write_scsi_io); + DECLARE_WRITE_LINE_MEMBER(write_scsi_msg); + DECLARE_WRITE_LINE_MEMBER(write_scsi_req); protected: // driver_device overrides virtual void machine_start(); virtual void machine_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); private: required_device m_maincpu; required_device m_pic1; required_device m_pic2; required_device m_speaker; - required_device m_sasi; required_device m_fdc; required_device m_rtc; required_device m_crtc; required_device m_palette; required_device m_gfxdecode; + required_device m_scsi; + required_device m_scsi_data_out; + required_device m_scsi_data_in; required_shared_ptr m_vram; dynamic_buffer m_charram; - UINT8 m_stat, m_led, m_dskctl, m_vram_sw; + UINT8 m_stat, m_led, m_vram_sw; + int m_msg, m_bsy, m_io, m_cd, m_req, m_rst; + emu_timer *m_req_hack; + UINT16 m_dskctl; }; @@ -107,9 +122,18 @@ static const gfx_layout pcd_charlayout = { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8 }, 8*16 }; + +void pcd_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + // TODO: remove this hack + if(m_req) + m_maincpu->drq0_w(1); +} + void pcd_state::machine_start() { m_gfxdecode->set_gfx(0, global_alloc(gfx_element(machine().device("palette"), pcd_charlayout, m_charram, 0, 1, 0))); + m_req_hack = timer_alloc(); } void pcd_state::machine_reset() @@ -118,6 +142,7 @@ void pcd_state::machine_reset() m_led = 0; m_dskctl = 0; m_vram_sw = 1; + m_rst = 0; } READ8_MEMBER( pcd_state::irq_callback ) @@ -136,11 +161,6 @@ WRITE_LINE_MEMBER( pcd_state::i186_timer1_w ) m_speaker->level_w(state); } -READ16_MEMBER( pcd_state::vram_r ) -{ - return m_vram[offset]; -} - WRITE16_MEMBER( pcd_state::vram_w ) { if(m_vram_sw) @@ -216,30 +236,31 @@ WRITE8_MEMBER( pcd_state::mcu_w ) { } -READ8_MEMBER( pcd_state::dskctl_r ) +READ16_MEMBER( pcd_state::dskctl_r ) { return m_dskctl; } -WRITE8_MEMBER( pcd_state::dskctl_w ) +WRITE16_MEMBER( pcd_state::dskctl_w ) { floppy_image_device *floppy0 = m_fdc->subdevice("0")->get_device(); floppy_image_device *floppy1 = m_fdc->subdevice("1")->get_device(); - if((data & 1) && floppy0) + COMBINE_DATA(&m_dskctl); + + if((m_dskctl & 1) && floppy0) m_fdc->set_floppy(floppy0); if(floppy0) { - floppy0->mon_w(!(data & 4)); - floppy0->ss_w((data & 8) != 0); + floppy0->mon_w(!(m_dskctl & 4)); + floppy0->ss_w((m_dskctl & 8) != 0); } if(floppy1) { - floppy1->mon_w(!(data & 4)); - floppy1->ss_w((data & 8) != 0); + floppy1->mon_w(!(m_dskctl & 4)); + floppy1->ss_w((m_dskctl & 8) != 0); } - m_dskctl = data; } READ8_MEMBER( pcd_state::led_r ) @@ -266,23 +287,118 @@ SCN2674_DRAW_CHARACTER_MEMBER(pcd_state::display_pixels) UINT16 data = m_vram[address]; data = (data >> 8) | (data << 8); for(int i = 0; i < 16; i++) - bitmap.pix32(y, x + i) = m_palette->pen((data & (1 << (16 - i))) ? 1 : 0); + bitmap.pix32(y, x + i) = m_palette->pen((data & (1 << (15 - i))) ? 1 : 0); } else { UINT8 data = m_charram[(m_vram[address] & 0xff) * 16 + linecount]; for(int i = 0; i < 8; i++) - bitmap.pix32(y, x + i) = m_palette->pen((data & (1 << (8 - i))) ? 1 : 0); + bitmap.pix32(y, x + i) = m_palette->pen((data & (1 << (7 - i))) ? 1 : 0); } } +READ8_MEMBER(pcd_state::scsi_r) +{ + UINT8 ret = 0; + + switch(offset) + { + case 0: + case 2: + ret = m_scsi_data_in->read(); + m_scsi->write_ack(1); + if(!offset) + m_maincpu->drq0_w(0); + break; + + case 1: + ret = (m_cd << 7) | (m_req << 5) | (m_bsy << 4); + break; + } + + return ret; +} + +WRITE8_MEMBER(pcd_state::scsi_w) +{ + switch(offset) + { + case 0: + m_scsi_data_out->write(data); + m_scsi->write_ack(1); + if(m_cd) + { + m_maincpu->drq0_w(0); + m_req_hack->adjust(attotime::never); + } + break; + case 1: + if(data & 4) + { + m_rst = 1; + m_scsi->write_rst(1); + break; + } + if(m_rst) + { + m_rst = 0; + m_scsi->write_rst(0); + break; + } + + if(!m_bsy) + { + m_scsi_data_out->write(0); + m_scsi->write_sel(1); + } + break; + } +} + +WRITE_LINE_MEMBER(pcd_state::write_scsi_bsy) +{ + m_bsy = state ? 1 : 0; + m_scsi->write_sel(0); +} +WRITE_LINE_MEMBER(pcd_state::write_scsi_cd) +{ + m_cd = state ? 1 : 0; +} +WRITE_LINE_MEMBER(pcd_state::write_scsi_io) +{ + m_io = state ? 1 : 0; +} +WRITE_LINE_MEMBER(pcd_state::write_scsi_msg) +{ + m_msg = state ? 1 : 0; +} + +WRITE_LINE_MEMBER(pcd_state::write_scsi_req) +{ + m_req = state ? 1 : 0; + if(state) + { + if(!m_cd) + { + m_maincpu->drq0_w(1); + m_req_hack->adjust(attotime::from_msec(10)); // poke the dmac + } + else if(m_msg) + { + m_scsi_data_in->read(); + m_scsi->write_ack(1); + } + } + else + m_scsi->write_ack(0); +} //************************************************************************** // ADDRESS MAPS //************************************************************************** static ADDRESS_MAP_START( pcd_map, AS_PROGRAM, 16, pcd_state ) AM_RANGE(0x00000, 0x3ffff) AM_RAM // fixed 256k for now - AM_RANGE(0xf0000, 0xf7fff) AM_READWRITE(vram_r, vram_w) AM_SHARE("vram") + AM_RANGE(0xf0000, 0xf7fff) AM_READONLY AM_WRITE(vram_w) AM_SHARE("vram") AM_RANGE(0xfc000, 0xfffff) AM_ROM AM_REGION("bios", 0) AM_RANGE(0x00000, 0xfffff) AM_READWRITE8(nmi_io_r, nmi_io_w, 0xffff) ADDRESS_MAP_END @@ -297,8 +413,8 @@ static ADDRESS_MAP_START( pcd_io, AS_IO, 16, pcd_state ) AM_RANGE(0xf840, 0xf841) AM_READWRITE8(led_r, led_w, 0xff00) AM_RANGE(0xf880, 0xf8bf) AM_READWRITE8(rtc_r, rtc_w, 0xffff) AM_RANGE(0xf900, 0xf903) AM_DEVREADWRITE8("fdc", wd2793_t, read, write, 0xffff) - AM_RANGE(0xf904, 0xf905) AM_READWRITE8(dskctl_r, dskctl_w, 0x00ff) - //AM_RANGE(0xf940, 0xf943) scsi + AM_RANGE(0xf904, 0xf905) AM_READWRITE(dskctl_r, dskctl_w) + AM_RANGE(0xf940, 0xf943) AM_READWRITE8(scsi_r, scsi_w, 0xffff) AM_RANGE(0xf980, 0xf98f) AM_DEVWRITE8("crtc", scn2674_device, write, 0x00ff) AM_RANGE(0xf980, 0xf98f) AM_DEVREAD8("crtc", scn2674_device, read, 0xff00) AM_RANGE(0xf9a0, 0xf9a1) AM_WRITE8(vram_sw_w, 0x00ff) @@ -347,9 +463,6 @@ static MACHINE_CONFIG_START( pcd, pcd_state ) // nvram MCFG_NVRAM_ADD_1FILL("nvram") - // sasi controller - MCFG_OMTI5100_ADD("sasi") - // floppy disk controller MCFG_WD2793x_ADD("fdc", XTAL_16MHz/8/2) MCFG_WD_FDC_INTRQ_CALLBACK(DEVWRITELINE("pic1", pic8259_device, ir6_w)) @@ -361,11 +474,15 @@ static MACHINE_CONFIG_START( pcd, pcd_state ) // usart MCFG_DEVICE_ADD("usart1", MC2661, XTAL_4_9152MHz) - MCFG_MC2661_TXEMT_DSCHG_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir2_w)) + MCFG_MC2661_RXRDY_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir3_w)) + MCFG_MC2661_TXRDY_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir3_w)) MCFG_DEVICE_ADD("usart2", MC2661, XTAL_4_9152MHz) - MCFG_MC2661_TXEMT_DSCHG_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir3_w)) + MCFG_MC2661_RXRDY_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir2_w)) + //MCFG_MC2661_TXRDY_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir2_w)) // this gets stuck high causing the keyboard to not work + MCFG_MC2661_TXD_HANDLER(DEVWRITELINE("keyboard", pcd_keyboard_device, t0_w)) MCFG_DEVICE_ADD("usart3", MC2661, XTAL_4_9152MHz) - MCFG_MC2661_TXEMT_DSCHG_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir4_w)) + MCFG_MC2661_RXRDY_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir4_w)) + MCFG_MC2661_TXRDY_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir4_w)) // sound hardware MCFG_SPEAKER_STANDARD_MONO("mono") @@ -390,6 +507,21 @@ static MACHINE_CONFIG_START( pcd, pcd_state ) // rtc MCFG_MC146818_ADD("rtc", XTAL_32_768kHz) MCFG_MC146818_IRQ_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir7_w)) + + MCFG_DEVICE_ADD("keyboard", PCD_KEYBOARD, 0) + MCFG_PCD_KEYBOARD_OUT_TX_HANDLER(DEVWRITELINE("usart2", mc2661_device, rx_w)) + + MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) + MCFG_SCSI_DATA_INPUT_BUFFER("scsi_data_in") + MCFG_SCSI_MSG_HANDLER(WRITELINE(pcd_state, write_scsi_msg)) + MCFG_SCSI_BSY_HANDLER(WRITELINE(pcd_state, write_scsi_bsy)) + MCFG_SCSI_IO_HANDLER(WRITELINE(pcd_state, write_scsi_io)) + MCFG_SCSI_CD_HANDLER(WRITELINE(pcd_state, write_scsi_cd)) + MCFG_SCSI_REQ_HANDLER(WRITELINE(pcd_state, write_scsi_req)) + + MCFG_SCSI_OUTPUT_LATCH_ADD("scsi_data_out", "scsi") + MCFG_DEVICE_ADD("scsi_data_in", INPUT_BUFFER, 0) + MCFG_SCSIDEV_ADD("scsi:1", "harddisk", OMTI5100, SCSI_ID_0) MACHINE_CONFIG_END @@ -411,10 +543,6 @@ ROM_START( pcd ) // gfx card (scn2674 with 8741), to be moved ROM_REGION(0x400, "graphics", 0) ROM_LOAD("s36361-d321-v1.bin", 0x000, 0x400, CRC(69baeb2a) SHA1(98b9cd0f38c51b4988a3aed0efcf004bedd115ff)) - - // keyboard (8035), to be moved - ROM_REGION(0x1000, "keyboard", 0) - ROM_LOAD("pcd_keyboard.bin", 0x0000, 0x1000, CRC(d227d6cb) SHA1(3d6140764d3d043428c941826370ebf1597c63bd)) ROM_END diff --git a/src/mess/drivers/tispeak.c b/src/mess/drivers/tispeak.c index fa0dde7fee3..755e4132b36 100644 --- a/src/mess/drivers/tispeak.c +++ b/src/mess/drivers/tispeak.c @@ -68,26 +68,26 @@ above expectations. TI continued to manufacture many products for this line. - notes: this one has a dedicated voice actor Speak & Spell (France) "La Dictee Magique", 1980 - - MCU: CD2702* + - MCU: CD2702** - TMS51xx: 16KB CD2352 Speak & Spell (Germany) "Buddy", 1980 - - MCU: CD2702* (same as French 1980 version) + - MCU: CD2702** (same as French 1980 version) - TMS51xx(1/2): 16KB CD2345* - TMS51xx(2/2): 16KB CD2346* Speak & Spell (Italy) "Grillo Parlante", 1982 - - MCU: CD2702* (same as French 1980 version) - - TMS51xx: 16KB? CD62190* + - MCU: CD2702** (same as French 1980 version) + - TMS51xx: 16KB? CD62190** Speak & Spell Compact (US), 1981 - - MCU: CD8011* + - MCU: CD8011** - TMS51xx: 16KB CD2354 - TMS51xx: 16KB CD2354A (rev.A) - notes: no display, MCU is TMS1100 instead of TMS0270 Speak & Spell Compact (UK) "Speak & Write", 1981 - - MCU: CD8011* (same as US 1981 version) + - MCU: CD8011** (same as US 1981 version) - TMS51xx: 16KB CD62174 (rev.A) - notes: anecdotes from the developer, the same person working on the original UK version: "We included a pencil and writing pad - it was now about 'writing'.", @@ -169,7 +169,7 @@ Speak & Read modules: Touch & Tell: Touch & Tell (US), 1981 - - MCU: CD8012* + - MCU: CD8012** - TMS51xx: 4KB CD2610 - notes: MCU is TMS1100 instead of TMS0270. CD8010 is seen in some devices too, maybe an earlier version? @@ -242,7 +242,7 @@ Language Tutor modules: Other devices: Vocaid (US), 1982 - - MCU: CD8012* + - MCU: CD8012** - CD2802: 16KB CD2357 - notes: MCU is the same as in Touch & Tell, but instead of a toddler's toy, you get a serious medical aid device for the voice-impaired. diff --git a/src/mess/machine/pcd_kbd.c b/src/mess/machine/pcd_kbd.c new file mode 100644 index 00000000000..34729180816 --- /dev/null +++ b/src/mess/machine/pcd_kbd.c @@ -0,0 +1,260 @@ +#include "pcd_kbd.h" + +const device_type PCD_KEYBOARD = &device_creator; + +ROM_START( pcd_keyboard ) + ROM_REGION(0x1000, "mcu", 0) + ROM_LOAD("pcd_keyboard.bin", 0x0000, 0x1000, CRC(d227d6cb) SHA1(3d6140764d3d043428c941826370ebf1597c63bd)) +ROM_END + + +const rom_entry *pcd_keyboard_device::device_rom_region() const +{ + return ROM_NAME( pcd_keyboard ); +} + +static ADDRESS_MAP_START( pcd_keyboard_map, AS_PROGRAM, 8, pcd_keyboard_device ) + AM_RANGE(0x000, 0xfff) AM_ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( pcd_keyboard_io, AS_IO, 8, pcd_keyboard_device ) + AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_READ(bus_r) + AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(p1_r, p1_w) + AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(t0_r) +ADDRESS_MAP_END + +static MACHINE_CONFIG_FRAGMENT( pcd_keyboard ) + MCFG_CPU_ADD("mcu", I8035, 5760000*2) // FIXME: the mc2661 baud rate calculation + MCFG_CPU_PROGRAM_MAP(pcd_keyboard_map) + MCFG_CPU_IO_MAP(pcd_keyboard_io) + + // sound hardware + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_CONFIG_END + +machine_config_constructor pcd_keyboard_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( pcd_keyboard ); +} + +INPUT_PORTS_START( pcd_keyboard ) + PORT_START("ROW.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LALT) PORT_CHAR('<') PORT_CHAR('>') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ROW.1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x79") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ROW.2") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') // shifted is U+00A7 section sign + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad " UTF8_PLUSMINUS) + + PORT_START("ROW.3") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x7C") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad =") PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) + + PORT_START("ROW.4") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x7A") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x60") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x1F") + + PORT_START("ROW.5") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x65") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) + + PORT_START("ROW.6") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('/') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SEITE") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x06") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x1D") + + PORT_START("ROW.7") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("DRUCK") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x18") + + PORT_START("ROW.8") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR(';') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("L" O_UMLAUT "CHEN") PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x05") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("EINF" U_UMLAUT "GEN") PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(INSERT)) + + PORT_START("ROW.9") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('=') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("{") PORT_CODE(KEYCODE_COLON) PORT_CHAR('{') PORT_CHAR(0x00D6) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR(':') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x78") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad +") PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x11") + + PORT_START("ROW.10") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x6A") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("?") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('?') PORT_CHAR('~') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("[") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR(0x00DC) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("}") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('}') PORT_CHAR(0x00C4) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("-") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('-') PORT_CHAR('_') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("D2") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) + + PORT_START("ROW.11") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x6F") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad ,") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CE") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x70") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad -") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("ZEILE") + + PORT_START("ROW.12") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x10") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("HILFE") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x77") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad " UTF8_MULTIPLY) PORT_CODE(KEYCODE_ASTERISK) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RALT) + + PORT_START("ROW.13") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("TABL") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("UP/LEFT") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x12") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) + + PORT_START("ROW.14") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR('\r') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("TABR") PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x71") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x04") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad " UTF8_DIVIDE) PORT_CODE(KEYCODE_SLASH_PAD) + + PORT_START("ROW.15") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("'") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('\'') PORT_CHAR('`') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("]") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('*') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("#") PORT_CHAR('#') PORT_CHAR('^') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("D1") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x0C") + + PORT_START("ROW.16") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("PAUSE") PORT_CODE(KEYCODE_PAUSE) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("LOCK") PORT_CODE(KEYCODE_CAPSLOCK) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x3C") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x7E") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + + +ioport_constructor pcd_keyboard_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( pcd_keyboard ); +} + +pcd_keyboard_device::pcd_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, PCD_KEYBOARD, "PC-D Keyboard", tag, owner, clock, "pcd_kbd", __FILE__), + m_rows(*this, "ROW"), + m_data(0), + m_p1(0), + m_out_tx_handler(*this) +{ +} + +void pcd_keyboard_device::device_start() +{ + m_out_tx_handler.resolve_safe(); + m_out_tx_handler(1); +} + +READ8_MEMBER( pcd_keyboard_device::bus_r ) +{ + if(m_p1 & 0x10) + return m_rows[16]->read(); + return m_rows[m_p1 & 0xf]->read(); +} + +READ8_MEMBER( pcd_keyboard_device::p1_r ) +{ + return m_p1; +} + +WRITE8_MEMBER( pcd_keyboard_device::p1_w ) +{ + m_p1 = data; + m_out_tx_handler(BIT(data, 5)); +} + +READ8_MEMBER( pcd_keyboard_device::t0_r ) +{ + return m_t0; +} + +WRITE_LINE_MEMBER( pcd_keyboard_device::t0_w ) +{ + m_t0 = state; +} diff --git a/src/mess/machine/pcd_kbd.h b/src/mess/machine/pcd_kbd.h new file mode 100644 index 00000000000..e8a5e419f8b --- /dev/null +++ b/src/mess/machine/pcd_kbd.h @@ -0,0 +1,38 @@ +#ifndef PCD_KBD_H_ +#define PCD_KBD_H_ + +#include "emu.h" +#include "cpu/mcs48/mcs48.h" +#include "sound/speaker.h" + +#define MCFG_PCD_KEYBOARD_OUT_TX_HANDLER(_devcb) \ + devcb = &pcd_keyboard_device::set_out_tx_handler(*device, DEVCB_##_devcb); + +class pcd_keyboard_device : public device_t +{ +public: + pcd_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + template static devcb_base &set_out_tx_handler(device_t &device, _Object object) { return downcast(device).m_out_tx_handler.set_callback(object); } + + virtual const rom_entry *device_rom_region() const; + virtual machine_config_constructor device_mconfig_additions() const; + virtual ioport_constructor device_input_ports() const; + + void device_start(); + + DECLARE_READ8_MEMBER( bus_r ); + DECLARE_READ8_MEMBER( p1_r ); + DECLARE_WRITE8_MEMBER( p1_w ); + DECLARE_READ8_MEMBER( t0_r ); + DECLARE_WRITE_LINE_MEMBER( t0_w ); +private: + required_ioport_array<17> m_rows; + UINT8 m_data, m_p1; + bool m_t0; + devcb_write_line m_out_tx_handler; +}; + +extern const device_type PCD_KEYBOARD; + +#endif /* PCD_KBD_H_ */ diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 3c798d539ef..22dc0040838 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -1661,6 +1661,7 @@ $(MESSOBJ)/sinclair.a: \ $(MESSOBJ)/siemens.a: \ $(MESS_DRIVERS)/pcd.o \ + $(MESS_MACHINE)/pcd_kbd.o \ $(MESSOBJ)/slicer.a: \ $(MESS_DRIVERS)/slicer.o \ diff --git a/src/osd/windows/windows.mak b/src/osd/windows/windows.mak index d25c7d4e490..548e4ffc002 100644 --- a/src/osd/windows/windows.mak +++ b/src/osd/windows/windows.mak @@ -477,24 +477,24 @@ $(OSDOBJ)/%.moc.c: $(OSDSRC)/%.h $(MOC) $(INCPATH) $< -o $@ OSDOBJS += \ - $(OSDOBJ)/modules/debugger/qt/debugqtview.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtwindow.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtlogwindow.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtdasmwindow.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtmainwindow.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtmemorywindow.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtbreakpointswindow.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtdeviceswindow.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtdeviceinformationwindow.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtview.moc.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtwindow.moc.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtlogwindow.moc.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtdasmwindow.moc.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtmainwindow.moc.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtmemorywindow.moc.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtbreakpointswindow.moc.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtdeviceswindow.moc.o \ - $(OSDOBJ)/modules/debugger/qt/debugqtdeviceinformationwindow.moc.o + $(OSDOBJ)/modules/debugger/qt/debuggerview.o \ + $(OSDOBJ)/modules/debugger/qt/windowqt.o \ + $(OSDOBJ)/modules/debugger/qt/logwindow.o \ + $(OSDOBJ)/modules/debugger/qt/dasmwindow.o \ + $(OSDOBJ)/modules/debugger/qt/mainwindow.o \ + $(OSDOBJ)/modules/debugger/qt/memorywindow.o \ + $(OSDOBJ)/modules/debugger/qt/breakpointswindow.o \ + $(OSDOBJ)/modules/debugger/qt/deviceswindow.o \ + $(OSDOBJ)/modules/debugger/qt/deviceinformationwindow.o \ + $(OSDOBJ)/modules/debugger/qt/debuggerview.moc.o \ + $(OSDOBJ)/modules/debugger/qt/windowqt.moc.o \ + $(OSDOBJ)/modules/debugger/qt/logwindow.moc.o \ + $(OSDOBJ)/modules/debugger/qt/dasmwindow.moc.o \ + $(OSDOBJ)/modules/debugger/qt/mainwindow.moc.o \ + $(OSDOBJ)/modules/debugger/qt/memorywindow.moc.o \ + $(OSDOBJ)/modules/debugger/qt/breakpointswindow.moc.o \ + $(OSDOBJ)/modules/debugger/qt/deviceswindow.moc.o \ + $(OSDOBJ)/modules/debugger/qt/deviceinformationwindow.moc.o endif #-------------------------------------------------