summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <lordkale4@gmail.com>2019-08-14 17:31:38 +0200
committer angelosa <lordkale4@gmail.com>2019-08-14 17:31:38 +0200
commit597c4e2f8eda7f9b1d17dec5f0bf9619e66500fe (patch)
tree287a53836c31075878ba3b9b9496dabb65289809
parent696e7bd942ceee0147aafe1690d2837f25b356c3 (diff)
pc9801.cpp: proper support for MEMSW device [Angelo Salese]
-rw-r--r--hash/pc98.xml1
-rw-r--r--scripts/target/mame/mess.lua2
-rw-r--r--src/mame/drivers/pc9801.cpp14
-rw-r--r--src/mame/includes/pc9801.h3
-rw-r--r--src/mame/machine/pc9801_memsw.cpp166
-rw-r--r--src/mame/machine/pc9801_memsw.h56
-rw-r--r--src/mame/video/pc9801.cpp9
7 files changed, 237 insertions, 14 deletions
diff --git a/hash/pc98.xml b/hash/pc98.xml
index 03da4af5ef6..bfd6233aa06 100644
--- a/hash/pc98.xml
+++ b/hash/pc98.xml
@@ -27815,6 +27815,7 @@ only have some part of Windows file and a Video driver(CLGD?).
<publisher>ナツメ (Natsume)</publisher>
<info name="alt_title" value="魔浄理子 淫靡界 インビゾーン" />
<info name="release" value="198907xx" />
+ <info name="usage" value="Set MEMSW4 to $08 otherwise sound fails to detect during boot" />
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A"/>
<dataarea name="flop" size="1265664">
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 1f8d1690d7c..197f39efe71 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -2752,6 +2752,8 @@ files {
MAME_DIR .. "src/mame/machine/pc9801_kbd.h",
MAME_DIR .. "src/mame/machine/pc9801_cd.cpp",
MAME_DIR .. "src/mame/machine/pc9801_cd.h",
+ MAME_DIR .. "src/mame/machine/pc9801_memsw.cpp",
+ MAME_DIR .. "src/mame/machine/pc9801_memsw.h",
MAME_DIR .. "src/mame/drivers/tk80bs.cpp",
}
diff --git a/src/mame/drivers/pc9801.cpp b/src/mame/drivers/pc9801.cpp
index d11579a3793..2062916680d 100644
--- a/src/mame/drivers/pc9801.cpp
+++ b/src/mame/drivers/pc9801.cpp
@@ -2131,18 +2131,6 @@ MACHINE_START_MEMBER(pc9801_state,pc9821ap2)
MACHINE_RESET_MEMBER(pc9801_state,pc9801_common)
{
memset(m_tvram.get(), 0, sizeof(uint16_t) * 0x2000);
- /* this looks like to be some kind of backup ram, system will boot with green colors otherwise */
- {
- int i;
- static const uint8_t default_memsw_data[0x10] =
- {
- 0xe1, 0x48, 0xe1, 0x05, 0xe1, 0x04, 0xe1, 0x00, 0xe1, 0x01, 0xe1, 0x00, 0xe1, 0x00, 0xe1, 0x6e
-// 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff
- };
-
- for(i=0;i<0x10;i++)
- m_tvram[(0x3fe0>>1)+i] = default_memsw_data[i];
- }
m_beeper->set_state(0);
@@ -2382,6 +2370,8 @@ void pc9801_state::pc9801_common(machine_config &config)
I8251(config, m_sio, 0);
+ PC9801_MEMSW(config, m_memsw, 0);
+
UPD765A(config, m_fdc_2hd, 8'000'000, true, true);
m_fdc_2hd->intrq_wr_callback().set(m_pic2, FUNC(pic8259_device::ir3_w));
m_fdc_2hd->drq_wr_callback().set(m_dmac, FUNC(am9517a_device::dreq2_w)).invert();
diff --git a/src/mame/includes/pc9801.h b/src/mame/includes/pc9801.h
index d348b8f0ad1..5ffd9430979 100644
--- a/src/mame/includes/pc9801.h
+++ b/src/mame/includes/pc9801.h
@@ -22,6 +22,7 @@
#include "machine/ram.h"
#include "machine/timer.h"
#include "machine/upd1990a.h"
+#include "machine/pc9801_memsw.h"
#include "machine/upd765.h"
#include "bus/scsi/pc9801_sasi.h"
@@ -90,6 +91,7 @@ public:
m_fdc_2hd(*this, "upd765_2hd"),
m_fdc_2dd(*this, "upd765_2dd"),
m_rtc(*this, UPD1990A_TAG),
+ m_memsw(*this, "memsw"),
m_keyb(*this, "keyb"),
m_sio(*this, UPD8251_TAG),
m_hgdc1(*this, "upd7220_chr"),
@@ -140,6 +142,7 @@ private:
required_device<upd765a_device> m_fdc_2hd;
optional_device<upd765a_device> m_fdc_2dd;
required_device<upd1990a_device> m_rtc;
+ required_device<pc9801_memsw_device> m_memsw;
required_device<pc9801_kbd_device> m_keyb;
required_device<i8251_device> m_sio;
required_device<upd7220_device> m_hgdc1;
diff --git a/src/mame/machine/pc9801_memsw.cpp b/src/mame/machine/pc9801_memsw.cpp
new file mode 100644
index 00000000000..33fb382fd08
--- /dev/null
+++ b/src/mame/machine/pc9801_memsw.cpp
@@ -0,0 +1,166 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/***************************************************************************
+
+ PC-9801 MEMSW interface
+
+ A CMOS-like interface that maps in the TVRAM area
+
+ Reference URL:
+ http://ohta.music.coocan.jp/packen/board/memsw.htm
+ Running the MON command under BASIC allows the user to change these
+ settings.
+ ssw -> for displaying current settings on screen;
+ ssw# -> to change the given #
+
+ List of settings, parenthesis for default if not zero
+ SW1 $A3FE2
+ xx-- ---- stop bit length (01)
+ --x- ---- parity specification
+ ---x ---- parity check
+ ---- xx-- data bit length (10)
+ ---- --x- communication method
+ ---- ---x X parameter
+
+ SW2 $A3FE6
+ x--- ---- S parameter
+ -x-- ---- line feed code when sending
+ --x- ---- line feed code when receiving
+ ---x ---- Japanese shift code
+ ---- xxxx transfer speed (0101)
+
+ SW3 $A3FEA
+ x--- ---- Operation when DEL code is received (input / output mode)
+ x--- ---- Operation when DEL code is received (terminal mode)
+ -x-- ---- Text screen color
+ --x- ---- Maximum operating frequency for V30 coprocessor
+ ---x ---- With or without V30 coprocessor
+ ---- x--- Coprocessor for 80286,386
+ ---- -xxx Conventional memory size (100)
+
+ SW4 $A3FEE
+ x--- ---- Expansion ROM CE000-CFFFF
+ -x-- ---- Expansion ROM CA000-CBFFF
+ --x- ---- Expansion ROM D4000-D5FFF
+ ---x ---- Expansion ROM D0000-D3FFF
+ ---- x--- Expansion ROM CC000-CFFFF
+ ---- -x-- Expansion ROM C8000-C9FFF
+ ---- --xx (Unused)
+
+ SW5 $A3FF2
+ xxxx ---- Select boot device (0000)
+ 1100 ---- SCSI HDD #1
+ 1011 ---- HDD #2
+ 1010 ---- HDD #1
+ 1000 ---- ROM BASIC
+ 0110 ---- MO disk
+ 0100 ---- 1MB FDD
+ 0010 ---- 640K FDD
+ 0000 ---- standard
+ ???? ---- ROM BASIC
+ ---- x--- Screen Hard copy color
+ ---- -x-- Use HDD user ID
+ ---- --x- Prioritize HDD with device name
+ ---- ---x PC-PR201 series used (1)
+
+ SW5 $A3FF6
+ --x- ---- Use modem-NCU control function
+ ---x ---- Extended screen hard copy function
+ ---- x--- Use monitor mode (Use extended monitor mode)
+ xx-- -xxx (Unused)
+
+
+ TODO:
+ - Is the mapping truly aligned to 2 bytes? Looks more like 4, needs real
+ HW verification.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "pc9801_memsw.h"
+#include "coreutil.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+// device type definition
+DEFINE_DEVICE_TYPE(PC9801_MEMSW, pc9801_memsw_device, "pc9801_memsw", "NEC PC-9801 Memory Switch device")
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// pc9801_memsw_device - constructor
+//-------------------------------------------------
+
+pc9801_memsw_device::pc9801_memsw_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, PC9801_MEMSW, tag, owner, clock),
+ device_nvram_interface(mconfig, *this)
+{
+}
+
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void pc9801_memsw_device::device_start()
+{
+ save_pointer(NAME(m_bram), m_bram_size);
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void pc9801_memsw_device::device_reset()
+{
+}
+
+
+void pc9801_memsw_device::nvram_default()
+{
+ system_time systime;
+
+ const uint8_t default_memsw_data[0x10] =
+ {
+ 0xe1, 0x48, 0xe1, 0x05,
+ 0xe1, 0x04, 0xe1, 0x00,
+ 0xe1, 0x01, 0xe1, 0x00,
+ 0xe1, 0x00, 0xe1, 0x00
+ };
+
+ memcpy(m_bram, default_memsw_data, m_bram_size);
+
+ machine().current_datetime(systime);
+ m_bram[0xf] = dec_2_bcd(systime.local_time.year - 2000) & 0xff;
+}
+
+void pc9801_memsw_device::nvram_read(emu_file &file)
+{
+ file.read(m_bram, m_bram_size);
+}
+
+void pc9801_memsw_device::nvram_write(emu_file &file)
+{
+ file.write(m_bram, m_bram_size);
+}
+
+//**************************************************************************
+// READ/WRITE HANDLERS
+//**************************************************************************
+
+uint8_t pc9801_memsw_device::read(uint8_t offset)
+{
+ return m_bram[offset];
+}
+
+void pc9801_memsw_device::write( uint8_t offset, uint8_t data )
+{
+ m_bram[offset] = data;
+}
diff --git a/src/mame/machine/pc9801_memsw.h b/src/mame/machine/pc9801_memsw.h
new file mode 100644
index 00000000000..22d4d568108
--- /dev/null
+++ b/src/mame/machine/pc9801_memsw.h
@@ -0,0 +1,56 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/***************************************************************************
+
+Template for skeleton device
+
+***************************************************************************/
+
+#ifndef MAME_MACHINE_PC9801_MEMSW_H
+#define MAME_MACHINE_PC9801_MEMSW_H
+
+#pragma once
+
+#include "machine/nvram.h"
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> pc9801_memsw_device
+
+class pc9801_memsw_device : public device_t,
+ public device_nvram_interface
+{
+public:
+ // construction/destruction
+ pc9801_memsw_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ uint8_t read(uint8_t offset);
+ void write(uint8_t offset, uint8_t data);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void nvram_default() override;
+ virtual void nvram_read(emu_file &file) override;
+ virtual void nvram_write(emu_file &file) override;
+
+private:
+ uint8_t m_bram[0x10];
+ const uint8_t m_bram_size = 0x10;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(PC9801_MEMSW, pc9801_memsw_device)
+
+#endif // MAME_MACHINE_PC9801_MEMSW_H
diff --git a/src/mame/video/pc9801.cpp b/src/mame/video/pc9801.cpp
index c6fee1e569d..421bb6fc530 100644
--- a/src/mame/video/pc9801.cpp
+++ b/src/mame/video/pc9801.cpp
@@ -448,15 +448,20 @@ READ16_MEMBER(pc9801_state::tvram_r)
if((offset & 0x1000) && (mem_mask == 0xff00))
return 0xffff;
- res = m_tvram[offset];
+ if(offset < (0x3fe0>>1))
+ res = m_tvram[offset];
+ else
+ res = m_memsw->read(offset & 0xf);
return res;
}
WRITE16_MEMBER(pc9801_state::tvram_w)
{
- if(offset < (0x3fe2>>1) || m_video_ff[MEMSW_REG])
+ if(offset < (0x3fe0>>1))
COMBINE_DATA(&m_tvram[offset]);
+ else if(m_video_ff[MEMSW_REG])
+ m_memsw->write(offset & 0x0f, data);
COMBINE_DATA(&m_video_ram_1[offset]); //TODO: check me
}