mirror of
https://github.com/holub/mame
synced 2025-04-22 08:22:15 +03:00
nec/pc8401a.cpp: cleanups
* remove empty pc8401a romset; * consolidate in single file; * remove i8255 device: eventually belongs to pc80s31k sub-device; * remove 6845 stub device: eventually belongs to option slot; * workaround for system not starting up, keyboard simulation eagerly sending irqs while system is not ready;
This commit is contained in:
parent
346d857f82
commit
d9b2594e62
@ -1,16 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<!--
|
||||
license:CC0-1.0
|
||||
-->
|
||||
<mamelayout version="2">
|
||||
<view name="LCD">
|
||||
<screen index="0">
|
||||
<bounds left="0" top="0" right="~scr0width~" bottom="~scr0height~" />
|
||||
</screen>
|
||||
</view>
|
||||
<view name="PC-8441A CRT">
|
||||
<screen index="1">
|
||||
<bounds left="0" top="0" right="4" bottom="3" />
|
||||
</screen>
|
||||
</view>
|
||||
</mamelayout>
|
@ -33249,7 +33249,6 @@ pc8001mk2 // 1983
|
||||
pc8001mk2sr // 1985
|
||||
|
||||
@source:nec/pc8401a.cpp
|
||||
pc8401a // roms needed
|
||||
pc8500 //
|
||||
|
||||
@source:nec/pc8801.cpp
|
||||
|
@ -200,23 +200,14 @@ uint32_t pc8001_state::screen_update( screen_device &screen, bitmap_rgb32 &bitma
|
||||
|
||||
/* Read/Write Handlers */
|
||||
|
||||
/*
|
||||
* ---- ---x RTC C0
|
||||
* ---- --x- RTC C1
|
||||
* ---- -x-- RTC C2
|
||||
* ---- x--- RTC DATA IN
|
||||
*/
|
||||
void pc8001_base_state::port10_w(uint8_t data)
|
||||
{
|
||||
/*
|
||||
|
||||
bit description
|
||||
|
||||
0 RTC C0
|
||||
1 RTC C1
|
||||
2 RTC C2
|
||||
3 RTC DATA IN
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
|
||||
*/
|
||||
|
||||
// RTC
|
||||
m_rtc->c0_w(BIT(data, 0));
|
||||
m_rtc->c1_w(BIT(data, 1));
|
||||
@ -309,23 +300,15 @@ uint8_t pc8001_state::port40_r()
|
||||
return data;
|
||||
}
|
||||
|
||||
/*
|
||||
* --x- ---- SPEAKER
|
||||
* ---- x--- CRT /CLDS CLK
|
||||
* ---- -x-- RTC CLK
|
||||
* ---- --x- RTC STB
|
||||
* ---- ---x Centronics STROBE
|
||||
*/
|
||||
void pc8001_state::port40_w(uint8_t data)
|
||||
{
|
||||
/*
|
||||
|
||||
bit description
|
||||
|
||||
0 STROBE
|
||||
1 RTC STB
|
||||
2 RTC CLK
|
||||
3 CRT /CLDS CLK
|
||||
4
|
||||
5 SPEAKER
|
||||
6
|
||||
7
|
||||
|
||||
*/
|
||||
|
||||
m_centronics->write_strobe(BIT(data, 0));
|
||||
|
||||
m_rtc->stb_w(BIT(data, 1));
|
||||
|
@ -1,8 +1,5 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Curt Coder
|
||||
#include "emu.h"
|
||||
#include "pc8401a.h"
|
||||
|
||||
/*
|
||||
|
||||
NEC PC-8401A-LS "Starlet"
|
||||
@ -12,22 +9,20 @@
|
||||
|
||||
- keyboard interrupt
|
||||
- RTC TP pulse
|
||||
- clock does not advance in menu
|
||||
- clock does not advance in menu (timer irq?)
|
||||
- modernize memory map
|
||||
- mirror e800-ffff to 6800-7fff
|
||||
- soft power on/off
|
||||
- NVRAM
|
||||
- 8251 USART
|
||||
- 8255 ports
|
||||
- MC6845 palette
|
||||
- MC6845 chargen ROM
|
||||
- MC6845 screen update
|
||||
- Merge keyboard with pc8001 / pc8801 / pc88va (same keys, running on a MCU like VA)
|
||||
- PC-8431A FDC is same family as PC-80S31K, basically the 3.5" version of it.
|
||||
Likely none of the available BIOSes fits here.
|
||||
|
||||
- peripherals
|
||||
* PC-8431A Dual Floppy Drive
|
||||
* PC-8441A CRT / Disk Interface
|
||||
* PC-8441A CRT / Disk Interface (MC6845, monochrome)
|
||||
* PC-8461A 1200 Baud Modem
|
||||
* PC-8407A 128KB RAM Expansion
|
||||
* PC-8508A ROM/RAM Cartridge
|
||||
@ -36,14 +31,132 @@
|
||||
|
||||
*/
|
||||
|
||||
#include "emu.h"
|
||||
#include "bus/rs232/rs232.h"
|
||||
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/i8255.h"
|
||||
#include "machine/i8251.h"
|
||||
#include "machine/ram.h"
|
||||
#include "machine/timer.h"
|
||||
#include "machine/upd1990a.h"
|
||||
#include "video/mc6845.h"
|
||||
#include "video/sed1330.h"
|
||||
|
||||
#include "bus/generic/slot.h"
|
||||
#include "bus/generic/carts.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "utf8.h"
|
||||
|
||||
/* Fake Keyboard */
|
||||
#define SCREEN_TAG "screen"
|
||||
#define CRT_SCREEN_TAG "screen2"
|
||||
|
||||
#define Z80_TAG "z80"
|
||||
#define UPD1990A_TAG "upd1990a"
|
||||
#define AY8910_TAG "ay8910"
|
||||
#define SED1330_TAG "sed1330"
|
||||
#define MC6845_TAG "mc6845"
|
||||
#define I8251_TAG "i8251"
|
||||
#define RS232_TAG "rs232"
|
||||
|
||||
#define PC8401A_CRT_VIDEORAM_SIZE 0x2000
|
||||
|
||||
namespace {
|
||||
|
||||
class pc8401a_state : public driver_device
|
||||
{
|
||||
public:
|
||||
pc8401a_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, Z80_TAG)
|
||||
, m_rtc(*this, UPD1990A_TAG)
|
||||
, m_lcdc(*this, SED1330_TAG)
|
||||
, m_screen(*this, SCREEN_TAG)
|
||||
, m_cart(*this, "cartslot")
|
||||
, m_io_cart(*this, "io_cart")
|
||||
, m_ram(*this, RAM_TAG)
|
||||
, m_rom(*this, Z80_TAG)
|
||||
, m_crt_ram(*this, "crt_ram", PC8401A_CRT_VIDEORAM_SIZE, ENDIANNESS_LITTLE)
|
||||
, m_io_y(*this, "Y.%u", 0)
|
||||
{ }
|
||||
|
||||
void pc8500(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
|
||||
private:
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<upd1990a_device> m_rtc;
|
||||
required_device<sed1330_device> m_lcdc;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<generic_slot_device> m_cart;
|
||||
required_device<generic_slot_device> m_io_cart;
|
||||
required_device<ram_device> m_ram;
|
||||
required_memory_region m_rom;
|
||||
memory_share_creator<uint8_t> m_crt_ram;
|
||||
required_ioport_array<10> m_io_y;
|
||||
|
||||
memory_region *m_cart_rom = nullptr;
|
||||
|
||||
void mmr_w(uint8_t data);
|
||||
uint8_t mmr_r();
|
||||
uint8_t rtc_r();
|
||||
void rtc_cmd_w(uint8_t data);
|
||||
void rtc_ctrl_w(uint8_t data);
|
||||
uint8_t io_rom_data_r();
|
||||
void io_rom_addr_w(offs_t offset, uint8_t data);
|
||||
uint8_t port70_r();
|
||||
uint8_t port71_r();
|
||||
void port70_w(uint8_t data);
|
||||
void port71_w(uint8_t data);
|
||||
void palette_init(palette_device &palette) const;
|
||||
|
||||
void scan_keyboard();
|
||||
void bankswitch(uint8_t data);
|
||||
|
||||
// keyboard state
|
||||
int m_key_strobe = 0; // key pressed
|
||||
|
||||
// memory state
|
||||
uint8_t m_mmr = 0; // memory mapping register
|
||||
uint32_t m_io_addr = 0; // I/O ROM address counter
|
||||
|
||||
uint8_t m_key_latch = 0;
|
||||
bool m_key_irq_enable = false;
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(keyboard_tick);
|
||||
[[maybe_unused]] void pc8401a_lcdc(address_map &map);
|
||||
void pc8401a_mem(address_map &map);
|
||||
void pc8500_io(address_map &map);
|
||||
void pc8500_lcdc(address_map &map);
|
||||
};
|
||||
|
||||
|
||||
void pc8401a_state::palette_init(palette_device &palette) const
|
||||
{
|
||||
palette.set_pen_color(0, rgb_t(39, 108, 51));
|
||||
palette.set_pen_color(1, rgb_t(16, 37, 84));
|
||||
}
|
||||
|
||||
void pc8401a_state::pc8401a_lcdc(address_map &map)
|
||||
{
|
||||
map.global_mask(0x1fff);
|
||||
map(0x0000, 0x1fff).ram();
|
||||
}
|
||||
|
||||
void pc8401a_state::pc8500_lcdc(address_map &map)
|
||||
{
|
||||
map.global_mask(0x3fff);
|
||||
map(0x0000, 0x3fff).ram();
|
||||
}
|
||||
|
||||
void pc8401a_state::scan_keyboard()
|
||||
{
|
||||
if (!m_key_irq_enable)
|
||||
return;
|
||||
int strobe = 0;
|
||||
|
||||
/* scan keyboard */
|
||||
@ -60,20 +173,54 @@ void pc8401a_state::scan_keyboard()
|
||||
|
||||
if (!m_key_strobe && strobe)
|
||||
{
|
||||
/* trigger interrupt */
|
||||
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xef); // Z80 - RST 28h
|
||||
logerror("INTERRUPT\n");
|
||||
}
|
||||
|
||||
if (strobe) m_key_strobe = strobe;
|
||||
}
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(pc8401a_state::pc8401a_keyboard_tick)
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(pc8401a_state::keyboard_tick)
|
||||
{
|
||||
scan_keyboard();
|
||||
}
|
||||
|
||||
/* Read/Write Handlers */
|
||||
/*
|
||||
*
|
||||
* bit description
|
||||
* 0 key pressed
|
||||
* 1
|
||||
* 2
|
||||
* 3
|
||||
* 4 must be 1 or CPU goes to HALT (power switch status?)
|
||||
* 5
|
||||
* 6
|
||||
* 7
|
||||
*
|
||||
*/
|
||||
uint8_t pc8401a_state::port70_r()
|
||||
{
|
||||
return 0x10 | (m_key_strobe & 1);
|
||||
}
|
||||
|
||||
uint8_t pc8401a_state::port71_r()
|
||||
{
|
||||
return m_key_latch;
|
||||
}
|
||||
|
||||
void pc8401a_state::port70_w(uint8_t data)
|
||||
{
|
||||
m_key_strobe = 0;
|
||||
}
|
||||
|
||||
void pc8401a_state::port71_w(uint8_t data)
|
||||
{
|
||||
m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
|
||||
|
||||
// guess: machine starts with a 0x10 -> 0x18 transition -> ei
|
||||
if (data == 0x18 && m_key_latch == 0x10)
|
||||
m_key_irq_enable = true;
|
||||
m_key_latch = data;
|
||||
}
|
||||
|
||||
void pc8401a_state::bankswitch(uint8_t data)
|
||||
{
|
||||
@ -173,23 +320,20 @@ void pc8401a_state::bankswitch(uint8_t data)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* bit description
|
||||
* 0 ROM section bit 0
|
||||
* 1 ROM section bit 1
|
||||
* 2 mapping for CPU addresses 0000H to 7FFFH bit 0
|
||||
* 3 mapping for CPU addresses 0000H to 7FFFH bit 1
|
||||
* 4 mapping for CPU addresses 8000H to BFFFH bit 0
|
||||
* 5 mapping for CPU addresses 8000H to BFFFH bit 1
|
||||
* 6 mapping for CPU addresses C000H to E7FFH
|
||||
* 7
|
||||
*/
|
||||
void pc8401a_state::mmr_w(uint8_t data)
|
||||
{
|
||||
/*
|
||||
|
||||
bit description
|
||||
|
||||
0 ROM section bit 0
|
||||
1 ROM section bit 1
|
||||
2 mapping for CPU addresses 0000H to 7FFFH bit 0
|
||||
3 mapping for CPU addresses 0000H to 7FFFH bit 1
|
||||
4 mapping for CPU addresses 8000H to BFFFH bit 0
|
||||
5 mapping for CPU addresses 8000H to BFFFH bit 1
|
||||
6 mapping for CPU addresses C000H to E7FFH
|
||||
7
|
||||
|
||||
*/
|
||||
|
||||
if (data != m_mmr)
|
||||
{
|
||||
bankswitch(data);
|
||||
@ -203,66 +347,40 @@ uint8_t pc8401a_state::mmr_r()
|
||||
return m_mmr;
|
||||
}
|
||||
|
||||
/*
|
||||
* bit description
|
||||
* 0 RTC TP?
|
||||
* 1 RTC DATA OUT
|
||||
* 2 ?
|
||||
* 3
|
||||
* 4
|
||||
* 5
|
||||
* 6
|
||||
* 7
|
||||
*/
|
||||
uint8_t pc8401a_state::rtc_r()
|
||||
{
|
||||
/*
|
||||
|
||||
bit description
|
||||
|
||||
0 RTC TP?
|
||||
1 RTC DATA OUT
|
||||
2 ?
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
|
||||
*/
|
||||
|
||||
return (m_rtc->data_out_r() << 1) | (m_rtc->tp_r() << 2);
|
||||
}
|
||||
|
||||
// Virtually same as pc8001_state::port10_w
|
||||
void pc8401a_state::rtc_cmd_w(uint8_t data)
|
||||
{
|
||||
/*
|
||||
|
||||
bit description
|
||||
|
||||
0 RTC C0
|
||||
1 RTC C1
|
||||
2 RTC C2
|
||||
3 RTC DATA IN?
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
|
||||
*/
|
||||
|
||||
m_rtc->c0_w(BIT(data, 0));
|
||||
m_rtc->c1_w(BIT(data, 1));
|
||||
m_rtc->c2_w(BIT(data, 2));
|
||||
m_rtc->data_in_w(BIT(data, 3));
|
||||
|
||||
// TODO: centronics port?
|
||||
}
|
||||
|
||||
/*
|
||||
* ---- -x-- RTC CLK
|
||||
* ---- --x- RTC STB
|
||||
* ---- ---x RTC OE?
|
||||
*/
|
||||
void pc8401a_state::rtc_ctrl_w(uint8_t data)
|
||||
{
|
||||
/*
|
||||
|
||||
bit description
|
||||
|
||||
0 RTC OE or CS?
|
||||
1 RTC STB
|
||||
2 RTC CLK
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
|
||||
*/
|
||||
|
||||
m_rtc->oe_w(BIT(data, 0));
|
||||
m_rtc->stb_w(BIT(data, 1));
|
||||
m_rtc->clk_w(BIT(data, 2));
|
||||
@ -296,44 +414,6 @@ void pc8401a_state::io_rom_addr_w(offs_t offset, uint8_t data)
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t pc8401a_state::port70_r()
|
||||
{
|
||||
/*
|
||||
|
||||
bit description
|
||||
|
||||
0 key pressed
|
||||
1
|
||||
2
|
||||
3
|
||||
4 must be 1 or CPU goes to HALT
|
||||
5
|
||||
6
|
||||
7
|
||||
|
||||
*/
|
||||
|
||||
return 0x10 | m_key_strobe;
|
||||
}
|
||||
|
||||
uint8_t pc8401a_state::port71_r()
|
||||
{
|
||||
return m_key_latch;
|
||||
}
|
||||
|
||||
void pc8401a_state::port70_w(uint8_t data)
|
||||
{
|
||||
m_key_strobe = 0;
|
||||
}
|
||||
|
||||
void pc8401a_state::port71_w(uint8_t data)
|
||||
{
|
||||
m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
|
||||
|
||||
m_key_latch = data;
|
||||
}
|
||||
|
||||
/* Memory Maps */
|
||||
|
||||
void pc8401a_state::pc8401a_mem(address_map &map)
|
||||
{
|
||||
@ -344,12 +424,6 @@ void pc8401a_state::pc8401a_mem(address_map &map)
|
||||
map(0xe800, 0xffff).bankrw("bank5");
|
||||
}
|
||||
|
||||
void pc8401a_state::pc8401a_io(address_map &map)
|
||||
{
|
||||
map.unmap_value_high();
|
||||
map.global_mask(0xff);
|
||||
}
|
||||
|
||||
void pc8401a_state::pc8500_io(address_map &map)
|
||||
{
|
||||
map.unmap_value_high();
|
||||
@ -378,17 +452,17 @@ void pc8401a_state::pc8500_io(address_map &map)
|
||||
// map(0x80, 0x80) modem status, set to 0xff to boot
|
||||
// map(0x8b, 0x8b)
|
||||
// map(0x90, 0x93)
|
||||
// map(0x98, 0x98).w(m_crtc, FUNC(mc6845_device::address_w));
|
||||
// map(0x99, 0x99).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w));
|
||||
map(0x98, 0x99).noprw();
|
||||
// map(0xa0, 0xa1)
|
||||
map(0x98, 0x98).w(m_crtc, FUNC(mc6845_device::address_w));
|
||||
map(0x99, 0x99).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w));
|
||||
map(0xb0, 0xb3).w(FUNC(pc8401a_state::io_rom_addr_w));
|
||||
map(0xb3, 0xb3).r(FUNC(pc8401a_state::io_rom_data_r));
|
||||
// map(0xc8, 0xc8)
|
||||
map(0xfc, 0xff).rw(I8255A_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write));
|
||||
// map(0xfc, 0xff).rw(I8255A_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write));
|
||||
map(0xfc, 0xff).noprw();
|
||||
}
|
||||
|
||||
/* Input Ports */
|
||||
|
||||
static INPUT_PORTS_START( pc8401a )
|
||||
PORT_START("Y.0")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("STOP")// PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
|
||||
@ -491,8 +565,6 @@ static INPUT_PORTS_START( pc8401a )
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
|
||||
INPUT_PORTS_END
|
||||
|
||||
/* Machine Initialization */
|
||||
|
||||
void pc8401a_state::machine_start()
|
||||
{
|
||||
std::string region_tag;
|
||||
@ -531,63 +603,21 @@ void pc8401a_state::machine_start()
|
||||
save_item(NAME(m_io_addr));
|
||||
}
|
||||
|
||||
uint8_t pc8401a_state::ppi_pc_r()
|
||||
void pc8401a_state::machine_reset()
|
||||
{
|
||||
/*
|
||||
|
||||
bit signal description
|
||||
|
||||
PC0
|
||||
PC1
|
||||
PC2
|
||||
PC3
|
||||
PC4 PC-8431A DAV data valid
|
||||
PC5 PC-8431A RFD ready for data
|
||||
PC6 PC-8431A DAC data accepted
|
||||
PC7 PC-8431A ATN attention
|
||||
|
||||
*/
|
||||
|
||||
return 0;
|
||||
m_key_irq_enable = false;
|
||||
}
|
||||
|
||||
void pc8401a_state::ppi_pc_w(uint8_t data)
|
||||
void pc8401a_state::pc8500(machine_config &config)
|
||||
{
|
||||
/*
|
||||
|
||||
bit signal description
|
||||
|
||||
PC0
|
||||
PC1
|
||||
PC2
|
||||
PC3
|
||||
PC4 PC-8431A DAV data valid
|
||||
PC5 PC-8431A RFD ready for data
|
||||
PC6 PC-8431A DAC data accepted
|
||||
PC7 PC-8431A ATN attention
|
||||
|
||||
*/
|
||||
}
|
||||
|
||||
/* Machine Drivers */
|
||||
|
||||
void pc8401a_state::pc8401a(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
Z80(config, m_maincpu, 7.987_MHz_XTAL / 2); // NEC uPD70008C
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &pc8401a_state::pc8401a_mem);
|
||||
m_maincpu->set_addrmap(AS_IO, &pc8401a_state::pc8401a_io);
|
||||
m_maincpu->set_addrmap(AS_IO, &pc8401a_state::pc8500_io);
|
||||
|
||||
/* fake keyboard */
|
||||
TIMER(config, "keyboard").configure_periodic(FUNC(pc8401a_state::pc8401a_keyboard_tick), attotime::from_hz(64));
|
||||
TIMER(config, "keyboard").configure_periodic(FUNC(pc8401a_state::keyboard_tick), attotime::from_hz(44));
|
||||
|
||||
/* devices */
|
||||
UPD1990A(config, m_rtc);
|
||||
|
||||
i8255_device &ppi(I8255A(config, I8255A_TAG));
|
||||
ppi.in_pc_callback().set(FUNC(pc8401a_state::ppi_pc_r));
|
||||
ppi.out_pc_callback().set(FUNC(pc8401a_state::ppi_pc_w));
|
||||
|
||||
i8251_device &uart(I8251(config, I8251_TAG, 0));
|
||||
uart.txd_handler().set(RS232_TAG, FUNC(rs232_port_device::write_txd));
|
||||
uart.dtr_handler().set(RS232_TAG, FUNC(rs232_port_device::write_dtr));
|
||||
@ -597,8 +627,19 @@ void pc8401a_state::pc8401a(machine_config &config)
|
||||
rs232.rxd_handler().set(I8251_TAG, FUNC(i8251_device::write_rxd));
|
||||
rs232.dsr_handler().set(I8251_TAG, FUNC(i8251_device::write_dsr));
|
||||
|
||||
/* video hardware */
|
||||
pc8401a_video(config);
|
||||
PALETTE(config, "palette", FUNC(pc8401a_state::palette_init), 2 + 8);
|
||||
|
||||
// pc8401a uses 128 display lines
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_LCD);
|
||||
m_screen->set_refresh_hz(44);
|
||||
m_screen->set_screen_update(SED1330_TAG, FUNC(sed1330_device::screen_update));
|
||||
m_screen->set_size(480, 208);
|
||||
m_screen->set_visarea(0, 480-1, 0, 200-1);
|
||||
m_screen->set_palette("palette");
|
||||
|
||||
SED1330(config, m_lcdc, 7.987_MHz_XTAL);
|
||||
m_lcdc->set_screen(SCREEN_TAG);
|
||||
m_lcdc->set_addrmap(0, &pc8401a_state::pc8500_lcdc);
|
||||
|
||||
/* option ROM cartridge */
|
||||
GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, nullptr, "bin,rom");
|
||||
@ -606,70 +647,26 @@ void pc8401a_state::pc8401a(machine_config &config)
|
||||
/* I/O ROM cartridge */
|
||||
GENERIC_CARTSLOT(config, m_io_cart, generic_linear_slot, nullptr, "bin,rom");
|
||||
|
||||
/* internal ram */
|
||||
RAM(config, RAM_TAG).set_default_size("64K").set_extra_options("96K");
|
||||
}
|
||||
|
||||
void pc8500_state::pc8500(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
Z80(config, m_maincpu, 4000000); // NEC uPD70008C
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &pc8500_state::pc8401a_mem);
|
||||
m_maincpu->set_addrmap(AS_IO, &pc8500_state::pc8500_io);
|
||||
|
||||
/* fake keyboard */
|
||||
TIMER(config, "keyboard").configure_periodic(FUNC(pc8401a_state::pc8401a_keyboard_tick), attotime::from_hz(64));
|
||||
|
||||
/* devices */
|
||||
UPD1990A(config, m_rtc);
|
||||
|
||||
i8255_device &ppi(I8255A(config, I8255A_TAG));
|
||||
ppi.in_pc_callback().set(FUNC(pc8401a_state::ppi_pc_r));
|
||||
ppi.out_pc_callback().set(FUNC(pc8401a_state::ppi_pc_w));
|
||||
|
||||
i8251_device &uart(I8251(config, I8251_TAG, 0));
|
||||
uart.txd_handler().set(RS232_TAG, FUNC(rs232_port_device::write_txd));
|
||||
uart.dtr_handler().set(RS232_TAG, FUNC(rs232_port_device::write_dtr));
|
||||
uart.rts_handler().set(RS232_TAG, FUNC(rs232_port_device::write_rts));
|
||||
|
||||
rs232_port_device &rs232(RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr));
|
||||
rs232.rxd_handler().set(I8251_TAG, FUNC(i8251_device::write_rxd));
|
||||
rs232.dsr_handler().set(I8251_TAG, FUNC(i8251_device::write_dsr));
|
||||
|
||||
/* video hardware */
|
||||
pc8500_video(config);
|
||||
|
||||
/* option ROM cartridge */
|
||||
GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, nullptr, "bin,rom");
|
||||
|
||||
/* I/O ROM cartridge */
|
||||
GENERIC_CARTSLOT(config, m_io_cart, generic_linear_slot, nullptr, "bin,rom");
|
||||
|
||||
/* internal ram */
|
||||
RAM(config, RAM_TAG).set_default_size("64K").set_extra_options("96K");
|
||||
}
|
||||
|
||||
/* ROMs */
|
||||
|
||||
ROM_START( pc8401a )
|
||||
ROM_REGION( 0x20000, Z80_TAG, ROMREGION_ERASEFF )
|
||||
ROM_LOAD( "pc8401a.bin", 0x0000, 0x18000, NO_DUMP )
|
||||
|
||||
ROM_REGION( 0x1000, "chargen", 0 )
|
||||
ROM_LOAD( "pc8441a.bin", 0x0000, 0x1000, NO_DUMP )
|
||||
ROM_END
|
||||
|
||||
ROM_START( pc8500 )
|
||||
ROM_REGION( 0x20000, Z80_TAG, ROMREGION_ERASEFF )
|
||||
ROM_LOAD( "pc8500.bin", 0x0000, 0x10000, CRC(c2749ef0) SHA1(f766afce9fda9ec84ed5b39ebec334806798afb3) )
|
||||
|
||||
ROM_REGION( 0x1000, "chargen", 0 )
|
||||
ROM_LOAD( "pc8441a.bin", 0x0000, 0x1000, NO_DUMP )
|
||||
// TODO: identify this
|
||||
ROM_REGION( 0x1000, "mcu", 0)
|
||||
ROM_LOAD( "kbd.rom", 0x0000, 0x1000, NO_DUMP )
|
||||
|
||||
//ROM_REGION( 0x1000, "chargen", 0 )
|
||||
//ROM_LOAD( "pc8441a.bin", 0x0000, 0x1000, NO_DUMP )
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
/* System Drivers */
|
||||
|
||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
|
||||
COMP( 1984, pc8401a, 0, 0, pc8401a, pc8401a, pc8401a_state, empty_init, "NEC", "PC-8401A-LS", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
|
||||
//COMP( 1984, pc8401a, 0, 0, pc8401a, pc8401a, pc8401a_state, empty_init, "NEC", "PC-8401A-LS", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
|
||||
//COMP( 1984, pc8401bd, pc8401a, 0, pc8401a, pc8401a, pc8401a_state, empty_init, "NEC", "PC-8401BD", MACHINE_NOT_WORKING)
|
||||
COMP( 1985, pc8500, 0, 0, pc8500, pc8401a, pc8500_state, empty_init, "NEC", "PC-8500", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
|
||||
COMP( 1985, pc8500, 0, 0, pc8500, pc8401a, pc8401a_state, empty_init, "NEC", "PC-8500", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
|
||||
|
@ -1,127 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Curt Coder
|
||||
#ifndef MAME_NEC_PC8401A_H
|
||||
#define MAME_NEC_PC8401A_H
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/i8255.h"
|
||||
#include "machine/i8251.h"
|
||||
#include "machine/ram.h"
|
||||
#include "machine/timer.h"
|
||||
#include "machine/upd1990a.h"
|
||||
#include "video/mc6845.h"
|
||||
#include "video/sed1330.h"
|
||||
|
||||
#include "bus/generic/slot.h"
|
||||
#include "bus/generic/carts.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
|
||||
#define SCREEN_TAG "screen"
|
||||
#define CRT_SCREEN_TAG "screen2"
|
||||
|
||||
#define Z80_TAG "z80"
|
||||
#define I8255A_TAG "i8255a"
|
||||
#define UPD1990A_TAG "upd1990a"
|
||||
#define AY8910_TAG "ay8910"
|
||||
#define SED1330_TAG "sed1330"
|
||||
#define MC6845_TAG "mc6845"
|
||||
#define I8251_TAG "i8251"
|
||||
#define RS232_TAG "rs232"
|
||||
|
||||
#define PC8401A_CRT_VIDEORAM_SIZE 0x2000
|
||||
|
||||
class pc8401a_state : public driver_device
|
||||
{
|
||||
public:
|
||||
pc8401a_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, Z80_TAG)
|
||||
, m_rtc(*this, UPD1990A_TAG)
|
||||
, m_lcdc(*this, SED1330_TAG)
|
||||
, m_crtc(*this, MC6845_TAG)
|
||||
, m_screen_lcd(*this, SCREEN_TAG)
|
||||
, m_cart(*this, "cartslot")
|
||||
, m_io_cart(*this, "io_cart")
|
||||
, m_ram(*this, RAM_TAG)
|
||||
, m_rom(*this, Z80_TAG)
|
||||
, m_crt_ram(*this, "crt_ram", PC8401A_CRT_VIDEORAM_SIZE, ENDIANNESS_LITTLE)
|
||||
, m_io_y(*this, "Y.%u", 0)
|
||||
{ }
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<upd1990a_device> m_rtc;
|
||||
required_device<sed1330_device> m_lcdc;
|
||||
optional_device<mc6845_device> m_crtc;
|
||||
required_device<screen_device> m_screen_lcd;
|
||||
required_device<generic_slot_device> m_cart;
|
||||
required_device<generic_slot_device> m_io_cart;
|
||||
required_device<ram_device> m_ram;
|
||||
required_memory_region m_rom;
|
||||
memory_share_creator<uint8_t> m_crt_ram;
|
||||
required_ioport_array<10> m_io_y;
|
||||
|
||||
memory_region *m_cart_rom = nullptr;
|
||||
|
||||
virtual void machine_start() override;
|
||||
virtual void video_start() override;
|
||||
|
||||
void mmr_w(uint8_t data);
|
||||
uint8_t mmr_r();
|
||||
uint8_t rtc_r();
|
||||
void rtc_cmd_w(uint8_t data);
|
||||
void rtc_ctrl_w(uint8_t data);
|
||||
uint8_t io_rom_data_r();
|
||||
void io_rom_addr_w(offs_t offset, uint8_t data);
|
||||
uint8_t port70_r();
|
||||
uint8_t port71_r();
|
||||
void port70_w(uint8_t data);
|
||||
void port71_w(uint8_t data);
|
||||
uint8_t ppi_pc_r();
|
||||
void ppi_pc_w(uint8_t data);
|
||||
void pc8401a_palette(palette_device &palette) const;
|
||||
|
||||
void scan_keyboard();
|
||||
void bankswitch(uint8_t data);
|
||||
|
||||
// keyboard state
|
||||
int m_key_strobe = 0; // key pressed
|
||||
|
||||
// memory state
|
||||
uint8_t m_mmr = 0; // memory mapping register
|
||||
uint32_t m_io_addr = 0; // I/O ROM address counter
|
||||
|
||||
uint8_t m_key_latch = 0;
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(pc8401a_keyboard_tick);
|
||||
void pc8401a(machine_config &config);
|
||||
void pc8401a_video(machine_config &config);
|
||||
void pc8401a_io(address_map &map);
|
||||
void pc8401a_lcdc(address_map &map);
|
||||
void pc8401a_mem(address_map &map);
|
||||
void pc8500_io(address_map &map);
|
||||
void pc8500_lcdc(address_map &map);
|
||||
};
|
||||
|
||||
class pc8500_state : public pc8401a_state
|
||||
{
|
||||
public:
|
||||
pc8500_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: pc8401a_state(mconfig, type, tag)
|
||||
{ }
|
||||
|
||||
void pc8500(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void video_start() override;
|
||||
|
||||
void pc8500_video(machine_config &config);
|
||||
|
||||
private:
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
};
|
||||
|
||||
#endif // MAME_NEC_PC8401A_H
|
@ -1,111 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Curt Coder
|
||||
#include "emu.h"
|
||||
#include "pc8401a.h"
|
||||
|
||||
#include "pc8500.lh"
|
||||
|
||||
/* PC-8401A */
|
||||
|
||||
void pc8401a_state::pc8401a_palette(palette_device &palette) const
|
||||
{
|
||||
palette.set_pen_color(0, rgb_t(39, 108, 51));
|
||||
palette.set_pen_color(1, rgb_t(16, 37, 84));
|
||||
}
|
||||
|
||||
void pc8401a_state::video_start()
|
||||
{
|
||||
}
|
||||
|
||||
/* PC-8500 */
|
||||
|
||||
void pc8500_state::video_start()
|
||||
{
|
||||
}
|
||||
|
||||
uint32_t pc8500_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
// m_lcdc->screen_update(screen, bitmap, cliprect);
|
||||
|
||||
/*
|
||||
if (strcmp(screen.tag(), SCREEN_TAG) == 0)
|
||||
{
|
||||
sed1330_update(m_lcdc, &bitmap, cliprect);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_crtc->update(bitmap, cliprect);
|
||||
}
|
||||
*/
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* SED1330 Interface */
|
||||
|
||||
void pc8401a_state::pc8401a_lcdc(address_map &map)
|
||||
{
|
||||
map.global_mask(0x1fff);
|
||||
map(0x0000, 0x1fff).ram();
|
||||
}
|
||||
|
||||
void pc8401a_state::pc8500_lcdc(address_map &map)
|
||||
{
|
||||
map.global_mask(0x3fff);
|
||||
map(0x0000, 0x3fff).ram();
|
||||
}
|
||||
|
||||
|
||||
/* Machine Drivers */
|
||||
|
||||
void pc8401a_state::pc8401a_video(machine_config &config)
|
||||
{
|
||||
// config.set_default_layout(layout_pc8401a);
|
||||
|
||||
PALETTE(config, "palette", FUNC(pc8401a_state::pc8401a_palette), 2);
|
||||
|
||||
/* LCD */
|
||||
SCREEN(config, m_screen_lcd, SCREEN_TYPE_LCD);
|
||||
m_screen_lcd->set_refresh_hz(44);
|
||||
m_screen_lcd->set_screen_update(SED1330_TAG, FUNC(sed1330_device::screen_update));
|
||||
m_screen_lcd->set_size(480, 128);
|
||||
m_screen_lcd->set_visarea(0, 480-1, 0, 128-1);
|
||||
m_screen_lcd->set_palette("palette");
|
||||
|
||||
SED1330(config, m_lcdc, 7.987_MHz_XTAL);
|
||||
m_lcdc->set_screen(m_screen_lcd);
|
||||
m_lcdc->set_addrmap(0, &pc8401a_state::pc8401a_lcdc);
|
||||
}
|
||||
|
||||
void pc8500_state::pc8500_video(machine_config &config)
|
||||
{
|
||||
config.set_default_layout(layout_pc8500);
|
||||
|
||||
PALETTE(config, "palette", FUNC(pc8500_state::pc8401a_palette), 2 + 8);
|
||||
|
||||
/* LCD */
|
||||
SCREEN(config, m_screen_lcd, SCREEN_TYPE_LCD);
|
||||
m_screen_lcd->set_refresh_hz(44);
|
||||
m_screen_lcd->set_screen_update(SED1330_TAG, FUNC(sed1330_device::screen_update));
|
||||
m_screen_lcd->set_size(480, 208);
|
||||
m_screen_lcd->set_visarea(0, 480-1, 0, 200-1);
|
||||
m_screen_lcd->set_palette("palette");
|
||||
|
||||
SED1330(config, m_lcdc, 8000000);
|
||||
m_lcdc->set_screen(SCREEN_TAG);
|
||||
m_lcdc->set_addrmap(0, &pc8500_state::pc8500_lcdc);
|
||||
|
||||
/* PC-8441A CRT */
|
||||
screen_device &screen(SCREEN(config, CRT_SCREEN_TAG, SCREEN_TYPE_RASTER));
|
||||
screen.set_screen_update(FUNC(pc8500_state::screen_update));
|
||||
screen.set_size(80*8, 24*8);
|
||||
screen.set_visarea(0, 80*8-1, 0, 24*8-1);
|
||||
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
|
||||
screen.set_refresh_hz(50);
|
||||
screen.set_palette("palette");
|
||||
|
||||
MC6845(config, m_crtc, 400000);
|
||||
m_crtc->set_screen(CRT_SCREEN_TAG);
|
||||
m_crtc->set_show_border_area(false);
|
||||
m_crtc->set_char_width(6);
|
||||
}
|
Loading…
Reference in New Issue
Block a user