// 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; }