summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/pmd85.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/pmd85.cpp')
-rw-r--r--src/mame/machine/pmd85.cpp801
1 files changed, 0 insertions, 801 deletions
diff --git a/src/mame/machine/pmd85.cpp b/src/mame/machine/pmd85.cpp
deleted file mode 100644
index 93a9edacc8b..00000000000
--- a/src/mame/machine/pmd85.cpp
+++ /dev/null
@@ -1,801 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Krzysztof Strzecha
-/***************************************************************************
-
- machine.c
-
- Functions to emulate general aspects of PMD-85 (RAM, ROM, interrupts,
- I/O ports)
-
- Krzysztof Strzecha
-
-***************************************************************************/
-
-#include "emu.h"
-#include "includes/pmd85.h"
-
-
-
-enum {PMD85_LED_1 = 0, PMD85_LED_2, PMD85_LED_3};
-enum {PMD85_1, PMD85_2, PMD85_2A, PMD85_2B, PMD85_3, ALFA, MATO, C2717};
-
-
-
-void pmd85_state::pmd851_update_memory()
-{
- address_space& space = m_maincpu->space(AS_PROGRAM);
- uint8_t *ram = m_ram->pointer();
-
- if (m_startup_mem_map)
- {
- space.unmap_write(0x0000, 0x0fff);
- space.nop_write(0x1000, 0x1fff);
- space.unmap_write(0x2000, 0x2fff);
- space.nop_write(0x3000, 0x3fff);
-
- space.nop_read(0x1000, 0x1fff);
- space.nop_read(0x3000, 0x3fff);
-
- m_bank[1]->set_base(m_rom);
- m_bank[3]->set_base(m_rom);
- m_bank[5]->set_base(ram + 0xc000);
-
- m_bank[6]->set_base(m_rom);
- m_bank[7]->set_base(m_rom);
- m_bank[8]->set_base(ram + 0xc000);
- }
- else
- {
- space.install_write_bank(0x0000, 0x0fff, m_bank[1]);
- space.install_write_bank(0x1000, 0x1fff, m_bank[2]);
- space.install_write_bank(0x2000, 0x2fff, m_bank[3]);
- space.install_write_bank(0x3000, 0x3fff, m_bank[4]);
- space.install_write_bank(0x4000, 0x7fff, m_bank[5]);
-
- space.install_read_bank(0x1000, 0x1fff, m_bank[2]);
- space.install_read_bank(0x3000, 0x3fff, m_bank[4]);
-
- m_bank[1]->set_base(ram);
- m_bank[2]->set_base(ram + 0x1000);
- m_bank[3]->set_base(ram + 0x2000);
- m_bank[4]->set_base(ram + 0x3000);
- m_bank[5]->set_base(ram + 0x4000);
- }
-}
-
-void pmd85_state::pmd852a_update_memory()
-{
- address_space& space = m_maincpu->space(AS_PROGRAM);
- uint8_t *ram = m_ram->pointer();
-
- if (m_startup_mem_map)
- {
- space.unmap_write(0x0000, 0x0fff);
- space.unmap_write(0x2000, 0x2fff);
-
- m_bank[1]->set_base(m_rom);
- m_bank[2]->set_base(ram + 0x9000);
- m_bank[3]->set_base(m_rom);
- m_bank[4]->set_base(ram + 0xb000);
- m_bank[5]->set_base(ram + 0xc000);
- m_bank[6]->set_base(m_rom);
- m_bank[7]->set_base(ram + 0x9000);
- m_bank[8]->set_base(m_rom);
- m_bank[9]->set_base(ram + 0xb000);
- m_bank[10]->set_base(ram + 0xc000);
-
- }
- else
- {
- space.install_write_bank(0x0000, 0x0fff, m_bank[1]);
- space.install_write_bank(0x2000, 0x2fff, m_bank[3]);
-
- m_bank[1]->set_base(ram);
- m_bank[2]->set_base(ram + 0x1000);
- m_bank[3]->set_base(ram + 0x2000);
- m_bank[4]->set_base(ram + 0x5000);
- m_bank[5]->set_base(ram + 0x4000);
- }
-}
-
-void pmd85_state::pmd853_update_memory()
-{
- uint8_t *ram = m_ram->pointer();
-
- if (m_startup_mem_map)
- {
- m_bank[1]->set_base(m_rom);
- m_bank[2]->set_base(m_rom);
- m_bank[3]->set_base(m_rom);
- m_bank[4]->set_base(m_rom);
- m_bank[5]->set_base(m_rom);
- m_bank[6]->set_base(m_rom);
- m_bank[7]->set_base(m_rom);
- m_bank[8]->set_base(m_rom);
- m_bank[9]->set_base(ram);
- m_bank[10]->set_base(ram + 0x2000);
- m_bank[11]->set_base(ram + 0x4000);
- m_bank[12]->set_base(ram + 0x6000);
- m_bank[13]->set_base(ram + 0x8000);
- m_bank[14]->set_base(ram + 0xa000);
- m_bank[15]->set_base(ram + 0xc000);
- m_bank[16]->set_base(ram + 0xe000);
- }
- else
- {
- m_bank[1]->set_base(ram);
- m_bank[2]->set_base(ram + 0x2000);
- m_bank[3]->set_base(ram + 0x4000);
- m_bank[4]->set_base(ram + 0x6000);
- m_bank[5]->set_base(ram + 0x8000);
- m_bank[6]->set_base(ram + 0xa000);
- m_bank[7]->set_base(ram + 0xc000);
- m_bank[8]->set_base(m_pmd853_memory_mapping ? m_rom : ram + 0xe000);
- }
-}
-
-void pmd85_state::alfa_update_memory()
-{
- address_space& space = m_maincpu->space(AS_PROGRAM);
- uint8_t *ram = m_ram->pointer();
-
- if (m_startup_mem_map)
- {
- space.unmap_write(0x0000, 0x0fff);
- space.unmap_write(0x1000, 0x33ff);
- space.nop_write(0x3400, 0x3fff);
-
- m_bank[1]->set_base(m_rom);
- m_bank[2]->set_base(m_rom + 0x1000);
- m_bank[4]->set_base(ram + 0xc000);
- m_bank[5]->set_base(m_rom);
- m_bank[6]->set_base(m_rom + 0x1000);
- m_bank[7]->set_base(ram + 0xc000);
- }
- else
- {
- space.install_write_bank(0x0000, 0x0fff, m_bank[1]);
- space.install_write_bank(0x1000, 0x33ff, m_bank[2]);
- space.install_write_bank(0x3400, 0x3fff, m_bank[3]);
-
- m_bank[1]->set_base(ram);
- m_bank[2]->set_base(ram + 0x1000);
- m_bank[3]->set_base(ram + 0x3400);
- m_bank[4]->set_base(ram + 0x4000);
- }
-}
-
-void pmd85_state::mato_update_memory()
-{
- address_space& space = m_maincpu->space(AS_PROGRAM);
- uint8_t *ram = m_ram->pointer();
-
- if (m_startup_mem_map)
- {
- space.unmap_write(0x0000, 0x3fff);
-
- m_bank[1]->set_base(m_rom);
- m_bank[2]->set_base(ram + 0xc000);
- m_bank[3]->set_base(m_rom);
- m_bank[4]->set_base(ram + 0xc000);
- }
- else
- {
- space.install_write_bank(0x0000, 0x3fff, m_bank[1]);
-
- m_bank[1]->set_base(ram);
- m_bank[2]->set_base(ram + 0x4000);
- }
-}
-
-void pmd85_state::c2717_update_memory()
-{
- address_space& space = m_maincpu->space(AS_PROGRAM);
- uint8_t *ram = m_ram->pointer();
-
- if (m_startup_mem_map)
- {
- space.unmap_write(0x0000, 0x3fff);
-
- m_bank[1]->set_base(m_rom);
- m_bank[2]->set_base(ram + 0x4000);
- m_bank[3]->set_base(m_rom);
- m_bank[4]->set_base(ram + 0xc000);
- }
- else
- {
- space.install_write_bank(0x0000, 0x3fff, m_bank[1]);
- m_bank[1]->set_base(ram);
- m_bank[2]->set_base(ram + 0x4000);
- }
-}
-
-/*******************************************************************************
-
- Motherboard 8255 (PMD-85.1, PMD-85.2, PMD-85.3, Didaktik Alfa)
- --------------------------------------------------------------
- keyboard, speaker, LEDs
-
-*******************************************************************************/
-
-uint8_t pmd85_state::ppi0_porta_r()
-{
- return 0xff;
-}
-
-uint8_t pmd85_state::ppi0_portb_r()
-{
- return m_io_keyboard[(m_ppi_port_outputs[0][0] & 0x0f)]->read() & m_io_keyboard[15]->read();
-}
-
-uint8_t pmd85_state::ppi0_portc_r()
-{
- return 0xff;
-}
-
-void pmd85_state::ppi0_porta_w(uint8_t data)
-{
- m_ppi_port_outputs[0][0] = data;
-}
-
-void pmd85_state::ppi0_portb_w(uint8_t data)
-{
- m_ppi_port_outputs[0][1] = data;
-}
-
-void pmd85_state::ppi0_portc_w(uint8_t data)
-{
- m_ppi_port_outputs[0][2] = data;
- m_leds[PMD85_LED_2] = BIT(data, 3);
- //m_leds[PMD85_LED_3] = BIT(data, 2);
- m_speaker->level_w(BIT(data, 2));
-}
-
-/*******************************************************************************
-
- Motherboard 8255 (Mato)
- -----------------------
- keyboard, speaker, LEDs, tape
-
-*******************************************************************************/
-
-uint8_t pmd85_state::mato_ppi0_portb_r()
-{
- u8 i,data = 0xff;
-
- for (i = 0; i < 8; i++)
- if (!BIT(m_ppi_port_outputs[0][0], i))
- data &= m_io_keyboard[i]->read();
-
- return data;
-}
-
-uint8_t pmd85_state::mato_ppi0_portc_r()
-{
- u8 data = m_io_keyboard[8]->read() & 0x7f;
- data |= (m_cassette->input() > 0.038) ? 0x80 : 0;
- return data;
-}
-
-void pmd85_state::mato_ppi0_portc_w(uint8_t data)
-{
- m_ppi_port_outputs[0][2] = data;
- m_leds[PMD85_LED_2] = BIT(data, 3);
- m_leds[PMD85_LED_3] = BIT(data, 2);
- m_speaker->level_w(BIT(data, 1));
- m_cassette->output(BIT(data, 0) ? 1 : -1);
-}
-
-/*******************************************************************************
-
- I/O board 8255
- --------------
- GPIO/0 (K3 connector), GPIO/1 (K4 connector)
-
-*******************************************************************************/
-
-uint8_t pmd85_state::ppi1_porta_r()
-{
- return 0xff;
-}
-
-uint8_t pmd85_state::ppi1_portb_r()
-{
- return 0xff;
-}
-
-uint8_t pmd85_state::ppi1_portc_r()
-{
- return 0xff;
-}
-
-void pmd85_state::ppi1_porta_w(uint8_t data)
-{
- m_ppi_port_outputs[1][0] = data;
-}
-
-void pmd85_state::ppi1_portb_w(uint8_t data)
-{
- m_ppi_port_outputs[1][1] = data;
-}
-
-void pmd85_state::ppi1_portc_w(uint8_t data)
-{
- m_ppi_port_outputs[1][2] = data;
-}
-
-/*******************************************************************************
-
- I/O board 8255
- --------------
- IMS-2 (K5 connector)
-
- - 8251 - cassette recorder and V.24/IFSS (selectable by switch)
-
- - external interfaces connector (K2)
-
-*******************************************************************************/
-
-uint8_t pmd85_state::ppi2_porta_r()
-{
- return 0xff;
-}
-
-uint8_t pmd85_state::ppi2_portb_r()
-{
- return 0xff;
-}
-
-uint8_t pmd85_state::ppi2_portc_r()
-{
- return 0xff;
-}
-
-void pmd85_state::ppi2_porta_w(uint8_t data)
-{
- m_ppi_port_outputs[2][0] = data;
-}
-
-void pmd85_state::ppi2_portb_w(uint8_t data)
-{
- m_ppi_port_outputs[2][1] = data;
-}
-
-void pmd85_state::ppi2_portc_w(uint8_t data)
-{
- m_ppi_port_outputs[2][2] = data;
-}
-
-/*******************************************************************************
-
- I/O board 8251
- --------------
- cassette recorder and V.24/IFSS (selectable by switch)
-
-*******************************************************************************/
-
-/*******************************************************************************
-
- I/O board external interfaces connector (K2)
- --------------------------------------------
-
-*******************************************************************************/
-
-
-
-/*******************************************************************************
-
- ROM Module 8255
- ---------------
- port A - data read
- ports B, C - address select
-
-*******************************************************************************/
-
-uint8_t pmd85_state::ppi3_porta_r()
-{
- if (memregion("user1")->base())
- return memregion("user1")->base()[m_ppi_port_outputs[3][1] | (m_ppi_port_outputs[3][2] << 8)];
- else
- return 0;
-}
-
-uint8_t pmd85_state::ppi3_portb_r()
-{
- return 0xff;
-}
-
-uint8_t pmd85_state::ppi3_portc_r()
-{
- return 0xff;
-}
-
-void pmd85_state::ppi3_porta_w(uint8_t data)
-{
- m_ppi_port_outputs[3][0] = data;
-}
-
-void pmd85_state::ppi3_portb_w(uint8_t data)
-{
- m_ppi_port_outputs[3][1] = data;
-}
-
-void pmd85_state::ppi3_portc_w(uint8_t data)
-{
- m_ppi_port_outputs[3][2] = data;
-}
-
-/*******************************************************************************
-
- I/O ports (PMD-85.1, PMD-85.2, PMD-85.3, Didaktik Alfa)
- -------------------------------------------------------
-
- I/O board
- 1xxx11aa external interfaces connector (K2)
-
- 0xxx11aa I/O board interfaces
- 000111aa 8251 (casette recorder, V24)
- 010011aa 8255 (GPIO/0, GPIO/1)
- 010111aa 8253
- 011111aa 8255 (IMS-2)
-
- Motherboard
- 1xxx01aa 8255 (keyboard, speaker, LEDs)
- PMD-85.3 memory banking
-
- ROM Module
- 1xxx10aa 8255 (ROM reading)
-
-*******************************************************************************/
-
-uint8_t pmd85_state::io_r(offs_t offset)
-{
- if (m_startup_mem_map)
- {
- return 0xff;
- }
-
- switch (offset & 0x0c)
- {
- case 0x04: /* Motherboard */
- switch (offset & 0x80)
- {
- case 0x80: /* Motherboard 8255 */
- return m_ppi0->read(offset & 0x03);
- }
- break;
- case 0x08: /* ROM module connector */
- if (m_rom_module_present)
- {
- switch (offset & 0x80)
- {
- case 0x80: /* ROM module 8255 */
- return m_ppi3->read(offset & 0x03);
- }
- }
- break;
- case 0x0c: /* I/O board */
- switch (offset & 0x80)
- {
- case 0x00: /* I/O board interfaces */
- switch (offset & 0x70)
- {
- case 0x10: /* 8251 (cassette recorder, V24) */
- return m_uart->read(offset & 0x01);
- case 0x40: /* 8255 (GPIO/0, GPIO/1) */
- return m_ppi1->read(offset & 0x03);
- case 0x50: /* 8253 */
- return m_pit->read(offset & 0x03);
- case 0x70: /* 8255 (IMS-2) */
- return m_ppi2->read(offset & 0x03);
- }
- break;
- case 0x80: /* external interfaces */
- break;
- }
- break;
- }
- if ((m_model == ALFA) && ((offset & 0xfe) == 0xf0))
- return m_uart->read(offset & 0x01);
-
- logerror ("Reading from unmapped port: %02x\n", offset);
- return 0xff;
-}
-
-void pmd85_state::io_w(offs_t offset, uint8_t data)
-{
- if (m_startup_mem_map)
- {
- m_startup_mem_map = 0;
- (this->*update_memory)();
- }
-
- switch (offset & 0x0c)
- {
- case 0x04: /* Motherboard */
- switch (offset & 0x80)
- {
- case 0x80: /* Motherboard 8255 */
- m_ppi0->write(offset & 0x03, data);
- /* PMD-85.3 memory banking */
- if ((offset & 0x03) == 0x03)
- {
- m_pmd853_memory_mapping = data & 0x01;
- (this->*update_memory)();
- }
- break;
- }
- break;
- case 0x08: /* ROM module connector */
- if (m_rom_module_present)
- {
- switch (offset & 0x80)
- {
- case 0x80: /* ROM module 8255 */
- m_ppi3->write(offset & 0x03, data);
- break;
- }
- }
- break;
- case 0x0c: /* I/O board */
- switch (offset & 0x80)
- {
- case 0x00: /* I/O board interfaces */
- switch (offset & 0x70)
- {
- case 0x10: /* 8251 (cassette recorder, V24) */
- m_uart->write(offset & 0x01, data);
- break;
- case 0x40: /* 8255 (GPIO/0, GPIO/0) */
- m_ppi1->write(offset & 0x03, data);
- break;
- case 0x50: /* 8253 */
- m_pit->write(offset & 0x03, data);
- logerror ("8253 writing. Address: %02x, Data: %02x\n", offset, data);
- break;
- case 0x70: /* 8255 (IMS-2) */
- m_ppi2->write(offset & 0x03, data);
- break;
- }
- break;
- case 0x80: /* external interfaces */
- break;
- }
- break;
- }
- if ((m_model == ALFA) && ((offset & 0xfe) == 0xf0))
- m_uart->write(offset & 0x01, data);
- //logerror ("Writing to unmapped port: %02x:%02X\n", offset,data);
-}
-
-/*******************************************************************************
-
- I/O ports (Mato)
- ----------------
-
- Motherboard
- 1xxx01aa 8255 (keyboard, speaker, LEDs, tape)
-
-*******************************************************************************/
-
-uint8_t pmd85_state::mato_io_r(offs_t offset)
-{
- if (m_startup_mem_map)
- {
- return 0xff;
- }
-
- switch (offset & 0x0c)
- {
- case 0x04: /* Motherboard */
- switch (offset & 0x80)
- {
- case 0x80: /* Motherboard 8255 */
- return m_ppi0->read(offset & 0x03);
- }
- break;
- }
-
- logerror ("Reading from unmapped port: %02x\n", offset);
- return 0xff;
-}
-
-void pmd85_state::mato_io_w(offs_t offset, uint8_t data)
-{
- if (m_startup_mem_map)
- {
- m_startup_mem_map = 0;
- (this->*update_memory)();
- }
-
- switch (offset & 0x0c)
- {
- case 0x04: /* Motherboard */
- switch (offset & 0x80)
- {
- case 0x80: /* Motherboard 8255 */
- return m_ppi0->write(offset & 0x03, data);
- }
- break;
- }
-}
-
-void pmd85_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
-{
- switch (id)
- {
- case TIMER_CASSETTE:
- cassette_timer_callback(ptr, param);
- break;
- default:
- throw emu_fatalerror("Unknown id in pmd85_state::device_timer");
- }
-}
-
-TIMER_CALLBACK_MEMBER(pmd85_state::cassette_timer_callback)
-{
- bool data;
- bool current_level;
-
- if (!BIT(m_io_dsw0->read(), 1)) /* V.24 / Tape Switch */
- {
- /* tape reading */
- if (m_cassette->get_state()&CASSETTE_PLAY)
- {
- switch (m_model)
- {
- case PMD85_1:
- case ALFA:
- if (m_clk_level_tape)
- {
- m_previous_level = (m_cassette->input() > 0.038) ? 1 : 0;
- m_clk_level_tape = 0;
- }
- else
- {
- current_level = (m_cassette->input() > 0.038) ? 1 : 0;
-
- if (m_previous_level!=current_level)
- {
- data = (!m_previous_level && current_level) ? 1 : 0;
-
- m_uart->write_rxd(data);
-
- m_clk_level_tape = 1;
- }
- }
-
- m_uart->write_rxc(m_clk_level_tape);
- return;
- case PMD85_2:
- case PMD85_2A:
- case C2717:
- case PMD85_3:
- // works for pmd852, pmd852a, pmd852b, pmd853, c2717, c2717pmd
- m_uart->write_dsr( (m_cassette->input() > 0.038) ? 0 : 1);
- return;
- }
- }
-
- /* tape writing */
- if (m_cassette->get_state()&CASSETTE_RECORD)
- {
- m_cassette->output((m_txd ^ m_clk_level_tape) ? 1 : -1);
-
- m_clk_level_tape = m_clk_level_tape ? 0 : 1;
- m_uart->write_txc(m_clk_level_tape);
-
- return;
- }
-
- m_clk_level_tape = 1;
-
- m_clk_level = m_clk_level ? 0 : 1;
- m_uart->write_txc(m_clk_level);
- }
-}
-
-INPUT_CHANGED_MEMBER(pmd85_state::pmd85_reset)
-{
- machine().schedule_soft_reset();
-}
-
-void pmd85_state::common_driver_init()
-{
- m_previous_level = 0;
- m_clk_level = m_clk_level_tape = 1;
- m_cassette_timer = timer_alloc(TIMER_CASSETTE);
- m_cassette_timer->adjust(attotime::zero, 0, attotime::from_hz(2400));
-}
-
-void pmd85_state::init_pmd851()
-{
- m_model = PMD85_1;
- update_memory = &pmd85_state::pmd851_update_memory;
- common_driver_init();
-}
-
-void pmd85_state::init_pmd852()
-{
- m_model = PMD85_2;
- update_memory = &pmd85_state::pmd851_update_memory;
- common_driver_init();
-}
-
-void pmd85_state::init_pmd852a()
-{
- m_model = PMD85_2A;
- update_memory = &pmd85_state::pmd852a_update_memory;
- common_driver_init();
-}
-
-void pmd85_state::init_pmd853()
-{
- m_model = PMD85_3;
- update_memory = &pmd85_state::pmd853_update_memory;
- common_driver_init();
-}
-
-void pmd85_state::init_alfa()
-{
- m_model = ALFA;
- update_memory = &pmd85_state::alfa_update_memory;
- common_driver_init();
-}
-
-void pmd85_state::init_mato()
-{
- m_model = MATO;
- update_memory = &pmd85_state::mato_update_memory;
-}
-
-void pmd85_state::init_c2717()
-{
- m_model = C2717;
- update_memory = &pmd85_state::c2717_update_memory;
- common_driver_init();
-}
-
-void pmd85_state::machine_reset()
-{
- /* checking for Rom Module */
- m_rom_module_present = 0;
- switch (m_model)
- {
- case PMD85_1:
- case PMD85_2:
- case PMD85_2A:
- case PMD85_3:
- case C2717:
- m_rom_module_present = BIT(m_io_dsw0->read(), 0);
- break;
- case ALFA:
- case MATO:
- break;
- }
-
- for (u8 i = 0; i < 4; i++)
- for (u8 j = 0; j < 3; j++)
- m_ppi_port_outputs[i][j] = 0;
-
- /* memory initialization */
- m_pmd853_memory_mapping = 1;
- m_startup_mem_map = 1;
- (this->*update_memory)();
-}
-
-void pmd85_state::machine_start()
-{
- m_leds.resolve();
- save_item(NAME(m_txd));
- save_item(NAME(m_rts));
- save_item(NAME(m_rom_module_present));
- save_item(NAME(m_ppi_port_outputs));
- save_item(NAME(m_startup_mem_map));
- save_item(NAME(m_pmd853_memory_mapping));
- save_item(NAME(m_previous_level));
- save_item(NAME(m_clk_level));
- save_item(NAME(m_clk_level_tape));
- save_item(NAME(m_model));
-}
-