summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/mz700.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/mz700.cpp')
-rw-r--r--src/mame/machine/mz700.cpp696
1 files changed, 0 insertions, 696 deletions
diff --git a/src/mame/machine/mz700.cpp b/src/mame/machine/mz700.cpp
deleted file mode 100644
index 5ca4bdb4f38..00000000000
--- a/src/mame/machine/mz700.cpp
+++ /dev/null
@@ -1,696 +0,0 @@
-// license:GPL-2.0+
-// copyright-holders:Juergen Buchmueller, Dirk Best
-/******************************************************************************
- * Sharp MZ700
- *
- * Reference: http://sharpmz.computingmuseum.com
- *
- *****************************************************************************/
-
-#include "emu.h"
-#include "includes/mz700.h"
-
-#include "cpu/z80/z80.h"
-#include "machine/74145.h"
-#include "screen.h"
-
-
-#ifndef VERBOSE
-#define VERBOSE 1
-#endif
-
-#define LOG(N,M,A,mac) \
- do { \
- if(VERBOSE>=N) \
- { \
- if( M ) \
- logerror("%11.6f: %-24s",mac.time().as_double(), (const char*)M ); \
- logerror A; \
- } \
- } while (0)
-
-
-/***************************************************************************
- INITIALIZATION
-***************************************************************************/
-
-void mz_state::init_mz700()
-{
- m_mz700 = true;
- m_mz700_mode = true;
-
- m_videoram = std::make_unique<uint8_t[]>(0x1000);
- memset(m_videoram.get(), 0, sizeof(uint8_t) * 0x1000);
- m_colorram = m_videoram.get() + 0x800;
-
- m_p_chargen = memregion("cgrom")->base();
- uint8_t *rom = memregion("monitor")->base();
- uint8_t *ram = m_ram->pointer();
- membank("bankr0")->configure_entry(0, &ram[0]); // ram
- membank("bankr0")->configure_entry(1, &rom[0]); // rom
- membank("bankw0")->configure_entry(0, &ram[0]); // ram
- membank("bankd")->configure_entry(0, &ram[0xd000]); // ram
- membank("bankd")->configure_entry(1, m_videoram.get()); // vram
-}
-
-void mz_state::init_mz800()
-{
- m_mz700 = false;
- m_mz700_mode = true;//false;
-
- /* video ram */
- m_videoram = std::make_unique<uint8_t[]>(0x4000);
- memset(m_videoram.get(), 0, sizeof(uint8_t) * 0x4000);
- m_colorram = m_videoram.get() + 0x800;
-
- /* character generator ram */
- m_cgram = std::make_unique<uint8_t[]>(0x1000);
- memset(m_cgram.get(), 0, sizeof(uint8_t) * 0x1000);
-
- if (memregion("cgrom"))
- m_p_chargen = memregion("cgrom")->base();
- else
- m_p_chargen = m_cgram.get();
- uint8_t *rom = memregion("monitor")->base();
- uint8_t *ram = m_ram->pointer();
- // configure banks (0 = RAM in all cases)
- membank("bankr0")->configure_entry(0, &ram[0]); // ram
- membank("bankr0")->configure_entry(1, &rom[0]); // rom
- membank("bankw0")->configure_entry(0, &ram[0]); // ram
- membank("bank1")->configure_entry(0, &ram[0x1000]); // ram
- membank("bank1")->configure_entry(1, &rom[0x1000]); // chargen
- membank("banka")->configure_entry(0, &ram[0x8000]); // ram
- membank("banka")->configure_entry(1, m_videoram.get()); // vram in mz800 mode
- membank("bankc")->configure_entry(0, &ram[0xc000]); // ram
- membank("bankc")->configure_entry(1, m_cgram.get()); // cgram in mz800 mode
- membank("bankd")->configure_entry(0, &ram[0xd000]); // ram
- membank("bankd")->configure_entry(1, m_videoram.get()); // vram in mz700 mode
-}
-
-void mz_state::machine_start()
-{
- /* reset memory map to defaults */
- mz700_bank_4_w(m_maincpu->space(AS_IO), 0, 0);
-}
-
-MACHINE_RESET_MEMBER( mz_state, mz700 )
-{
- membank("bankr0")->set_entry(1); //rom
- membank("bankw0")->set_entry(0); //ram
- membank("bankd")->set_entry(1); //vram
- m_banke->set_bank(1); //devices
-}
-
-MACHINE_RESET_MEMBER( mz_state, mz800 )
-{
- // default to mz700 mode or mz1500 won't start.
- membank("bankr0")->set_entry(1); //rom
- membank("bankw0")->set_entry(0); //ram
- membank("bank1")->set_entry(0); //ram
- membank("banka")->set_entry(0); //ram
- membank("bankc")->set_entry(0); //ram
- membank("bankd")->set_entry(1); //vram
- m_bankf->set_bank(1); //devices
-}
-
-
-/***************************************************************************
- MMIO
-***************************************************************************/
-
-READ8_MEMBER(mz_state::mz700_e008_r)
-{
- uint8_t data = 0;
-
- data |= m_other_timer;
- data |= ioport("JOY")->read();
- data |= m_screen->hblank() << 7;
-
- LOG(1, "mz700_e008_r", ("%02X\n", data), machine());
-
- return data;
-}
-
-WRITE8_MEMBER(mz_state::mz700_e008_w)
-{
- m_pit->write_gate0(BIT(data, 0));
-}
-
-
-/***************************************************************************
- BANK SWITCHING
-***************************************************************************/
-
-READ8_MEMBER(mz_state::mz800_bank_0_r)
-{
- //address_space &spc = m_maincpu->space(AS_PROGRAM);
-
- /* switch in cgrom */
- //spc.install_read_bank(0x1000, 0x1fff, "bank2");
- //spc.nop_write(0x1000, 0x1fff);
- //membank("bank2")->set_base(memregion("monitor")->base() + 0x1000);
- membank("bank1")->set_entry(1);
-
- if (m_mz700_mode)
- {
- /* cgram from 0xc000 to 0xcfff */
- //spc.install_read_bank(0xc000, 0xcfff, "bank6");
- //spc.install_write_handler(0xc000, 0xcfff, write8_delegate(FUNC(mz_state::mz800_cgram_w),this));
- //membank("bank6")->set_base(m_cgram);
- membank("bankc")->set_entry(1);
- }
- else
- {
- if (m_hires_mode)
- {
- /* vram from 0x8000 to 0xbfff */
- //spc.install_readwrite_bank(0x8000, 0xbfff, "bank4");
- //membank("bank4")->set_base(m_videoram);
- membank("banka")->set_entry(1);
- }
- else
- {
- /* vram from 0x8000 to 0x9fff */
- //spc.install_readwrite_bank(0x8000, 0x9fff, "bank4");
- //membank("bank4")->set_base(m_videoram);
-
- /* ram from 0xa000 to 0xbfff */
- //spc.install_readwrite_bank(0xa000, 0xbfff, "bank5");
- //membank("bank5")->set_base(m_ram->pointer() + 0xa000);
- membank("bank1")->set_entry(1);
- }
- }
-
- return 0xff;
-}
-
-WRITE8_MEMBER(mz_state::mz700_bank_0_w)
-{
- //address_space &spc = m_maincpu->space(AS_PROGRAM);
-
- //spc.install_readwrite_bank(0x0000, 0x0fff, "bank1a");
- //membank("bank1a")->set_base(m_ram->pointer());
- membank("bankr0")->set_entry(0); // ram
-}
-
-WRITE8_MEMBER(mz_state::mz800_bank_0_w)
-{
- //address_space &spc = m_maincpu->space(AS_PROGRAM);
-
- //spc.install_readwrite_bank(0x0000, 0x7fff, "bank1a");
- //membank("bank1a")->set_base(m_ram->pointer());
- membank("bank1")->set_entry(0); // ram
- membank("bankr0")->set_entry(0); // ram
-}
-
-READ8_MEMBER(mz_state::mz800_bank_1_r)
-{
- //address_space &spc = m_maincpu->space(AS_PROGRAM);
-
- /* switch in ram from 0x1000 to 0x1fff */
- //spc.install_readwrite_bank(0x1000, 0x1fff, "bank2");
- //membank("bank2")->set_base(m_ram->pointer() + 0x1000);
- membank("bank1")->set_entry(0); // ram
-
- if (m_mz700_mode)
- {
- /* ram from 0xc000 to 0xcfff */
- //spc.install_readwrite_bank(0xc000, 0xcfff, "bank6");
- //membank("bank6")->set_base(m_ram->pointer() + 0xc000);
- membank("bankc")->set_entry(0); // ram
- }
- else
- {
- /* ram from 0x8000 to 0xbfff */
- //spc.install_readwrite_bank(0x8000, 0xbfff, "bank4");
- //membank("bank4")->set_base(m_ram->pointer() + 0x8000);
- membank("banka")->set_entry(0); // ram
- }
-
- return 0xff;
-}
-
-WRITE8_MEMBER(mz_state::mz700_bank_1_w)
-{
- //address_space &spc = m_maincpu->space(AS_PROGRAM);
- membank("bankd")->set_entry(0); // ram
-
- if (m_mz700_mode)
- {
- /* switch in ram when not locked */
- if (!m_mz700_ram_lock)
- {
- if (m_mz700)
- {
- //membank("bankd")->set_entry(0); // ram
- m_banke->set_bank(0); //ram
- }
- else
- {
- //spc.install_readwrite_bank(0xd000, 0xffff, "bank7");
- //spc.install_readwrite_bank(0xd000, 0xdfff, "bank7");
- //membank("bank7")->set_base(m_ram->pointer() + 0xd000);
- m_bankf->set_bank(0); //ram
- }
- m_mz700_ram_vram = false;
- }
- }
- else
- {
- /* switch in ram when not locked */
- if (!m_mz800_ram_lock)
- {
- //spc.install_readwrite_bank(0xe000, 0xffff, "bank8");
- //membank("bank8")->set_base(m_ram->pointer() + 0xe000);
- m_bankf->set_bank(0); //ram
- m_mz800_ram_monitor = false;
- }
- }
-}
-
-WRITE8_MEMBER(mz_state::mz700_bank_2_w)
-{
- //address_space &spc = m_maincpu->space(AS_PROGRAM);
-
- //spc.install_read_bank(0x0000, 0x0fff, "bank1a");
- //spc.nop_write(0x0000, 0x0fff);
- //membank("bank1a")->set_base(memregion("monitor")->base());
- membank("bankr0")->set_entry(1); // rom
-
-}
-
-WRITE8_MEMBER(mz_state::mz700_bank_3_w)
-{
- //address_space &spc = m_maincpu->space(AS_PROGRAM);
-
- if (m_mz700_mode)
- {
- if (!m_mz700_ram_lock)
- {
- if (m_mz700)
- membank("bankd")->set_entry(1);
- else
- {
- /* switch in videoram */
- //spc.install_readwrite_bank(0xd000, 0xd7ff, "bank7");
- //membank("bank7")->set_base(m_videoram);
-
- /* switch in colorram */
- //spc.install_readwrite_bank(0xd800, 0xdfff, "bank9");
- //membank("bank9")->set_base(m_colorram);
- membank("bankd")->set_entry(1);
- }
- m_mz700_ram_vram = true;
-
- /* switch in memory mapped i/o devices */
- if (m_mz700)
- {
- m_banke->set_bank(1); //devices
- }
- else
- {
- m_bankf->set_bank(1); //devices
- }
- }
- }
- else
- {
- if (!m_mz800_ram_lock)
- {
- /* switch in mz800 monitor rom if not locked */
- //spc.install_read_bank(0xe000, 0xffff, "bank8");
- //spc.nop_write(0xe000, 0xffff);
- //membank("bank8")->set_base(memregion("monitor")->base() + 0x2000);
- m_bankf->set_bank(1); // devices + rom
- m_mz800_ram_monitor = true;
- }
- }
-}
-
-WRITE8_MEMBER(mz_state::mz700_bank_4_w)
-{
- //address_space &spc = m_maincpu->space(AS_PROGRAM);
-
- if (m_mz700_mode)
- {
- m_mz700_ram_lock = false; /* reset lock */
- mz700_bank_2_w(space, 0, 0); /* switch in monitor rom */
- mz700_bank_3_w(space, 0, 0); /* switch in videoram, colorram, and mmio */
-
- if (!m_mz700)
- {
- /* rest is ram is always ram in mz700 mode */
- //spc.install_readwrite_bank(0x1000, 0xcfff, "bank2");
- //membank("bank2")->set_base(m_ram->pointer() + 0x1000);
- membank("bankr0")->set_entry(1); // rom
- membank("bank1")->set_entry(0); // ram
- membank("bankc")->set_entry(0); // ram
- }
- }
- else
- {
- /* monitor rom and cgrom */
- //spc.install_read_bank(0x0000, 0x1fff, "bank1a");
- //spc.nop_write(0x0000, 0x1fff);
- //membank("bank1a")->set_base(memregion("monitor")->base());
- membank("bankr0")->set_entry(1); // rom
- membank("bank1")->set_entry(1); // rom
-
- /* ram from 0x2000 to 0x7fff */
- //spc.install_readwrite_bank(0x2000, 0x7fff, "bank3");
- //membank("bank3")->set_base(m_ram->pointer());
-
- if (m_hires_mode)
- {
- /* vram from 0x8000 to 0xbfff */
- //spc.install_readwrite_bank(0x8000, 0xbfff, "bank4");
- //membank("bank4")->set_base(m_videoram);
- membank("banka")->set_entry(1); // vram
- }
- else
- {
- /* vram from 0x8000 to 0x9fff */
- //spc.install_readwrite_bank(0x8000, 0x9fff, "bank4");
- //membank("bank4")->set_base(m_videoram);
- membank("banka")->set_entry(1); // vram
-
- /* ram from 0xa000 to 0xbfff */
- //spc.install_readwrite_bank(0xa000, 0xbfff, "bank5");
- //membank("bank5")->set_base(m_ram->pointer() + 0xa000);
- }
-
- /* ram from 0xc000 to 0xdfff */
- //spc.install_readwrite_bank(0xc000, 0xdfff, "bank6");
- //membank("bank6")->set_base(m_ram->pointer() + 0xc000);
- membank("bankd")->set_entry(0); // ram
-
- /* mz800 monitor rom from 0xe000 to 0xffff */
- //spc.install_read_bank(0xe000, 0xffff, "bank8");
- //spc.nop_write(0xe000, 0xffff);
- //membank("bank8")->set_base(memregion("monitor")->base() + 0x2000);
- m_bankf->set_bank(1); // devices + rom
- m_mz800_ram_monitor = true;
-
- m_mz800_ram_lock = false; /* reset lock? */
- }
-}
-
-WRITE8_MEMBER(mz_state::mz700_bank_5_w)
-{
- //address_space &spc = m_maincpu->space(AS_PROGRAM);
-
- if (m_mz700_mode)
- {
- /* prevent access from 0xd000 to 0xffff */
- m_mz700_ram_lock = true;
- if (m_mz700)
- m_banke->set_bank(2);
- else
- //spc.nop_readwrite(0xd000, 0xdfff);
- //spc.nop_readwrite(0xd000, 0xffff);
- m_bankf->set_bank(2);
- }
- else
- {
- /* prevent access from 0xe000 to 0xffff */
- m_mz800_ram_lock = true;
- //spc.nop_readwrite(0xe000, 0xffff);
- m_bankf->set_bank(2);
- }
-}
-
-WRITE8_MEMBER(mz_state::mz700_bank_6_w)
-{
- if (m_mz700_mode)
- {
- m_mz700_ram_lock = false;
-
- /* restore access */
- if (m_mz700_ram_vram)
- mz700_bank_3_w(space, 0, 0);
- else
- mz700_bank_1_w(space, 0, 0);
- }
- else
- {
- m_mz800_ram_lock = false;
-
- /* restore access from 0xe000 to 0xffff */
- if (m_mz800_ram_monitor)
- mz700_bank_3_w(space, 0, 0);
- else
- mz700_bank_1_w(space, 0, 0);
- }
-}
-
-
-/************************ PIT ************************************************/
-
-/* Timer 0 is the clock for the speaker output */
-
-WRITE_LINE_MEMBER(mz_state::pit_out0_changed)
-{
- if((m_prev_state==0) && (state==1)) {
- m_speaker_level ^= 1;
- }
- m_prev_state = state;
- m_speaker->level_w(m_speaker_level);
-}
-
-/* timer 2 is the AM/PM (12 hour) interrupt */
-WRITE_LINE_MEMBER(mz_state::pit_irq_2)
-{
- if (!m_intmsk)
- m_maincpu->set_input_line(0, state);
-}
-
-
-/***************************************************************************
- 8255 PPI
-***************************************************************************/
-
-READ8_MEMBER(mz_state::pio_port_b_r)
-{
- const int key_line = m_ls145->read();
- const char *const keynames[10] = { "ROW0", "ROW1", "ROW2", "ROW3", "ROW4", "ROW5", "ROW6", "ROW7", "ROW8", "ROW9" };
- uint8_t res = 0;
-
- for (int i = 0; i < 10; i++)
- {
- if (key_line & (1 << i))
- res |= ioport(keynames[i])->read();
- }
-
- return res;
-}
-
-/*
- * bit 7 in vertical blank
- * bit 6 in NE556 output
- * bit 5 in tape data (RDATA)
- * bit 4 in motor (1 = on)
- */
-READ8_MEMBER(mz_state::pio_port_c_r)
-{
- uint8_t data = 0;
-
- /* note: this is actually connected to Q output of the motor-control flip-flop (see below) */
- if ((m_cassette->get_state() & CASSETTE_MASK_UISTATE) != CASSETTE_STOPPED)
- data |= 0x10;
-
- if ((m_cassette)->input() > 0.0038)
- data |= 0x20; /* set the RDATA status */
-
- data |= m_cursor_bit << 6;
- data |= m_screen->vblank() << 7;
-
- LOG(2,"mz700_pio_port_c_r",("%02X\n", data),machine());
-
- return data;
-}
-
-
-WRITE8_MEMBER(mz_state::pio_port_a_w)
-{
- LOG(2,"mz700_pio_port_a_w",("%02X\n", data),machine());
-
- /* the ls145 is connected to PA0-PA3 */
- m_ls145->write(data & 0x0f);
-
- /* ne556 reset is connected to PA7 */
- m_cursor_timer->enable(BIT(data, 7));
-}
-
-
-WRITE8_MEMBER(mz_state::pio_port_c_w)
-{
- /*
- * bit 3 out motor control (0 = on)
- * bit 2 out INTMSK
- * bit 1 out tape data (WDATA)
- * bit 0 out unused
- */
-
-// uint8_t state = cassette_get_state(m_cassette);
-// uint8_t action = ((~pio_port_c_output & 8) & (data & 8)); /* detect low-to-high transition */
-
- /* The motor control circuit consists of a resistor, capacitor, invertor, nand-gate, and D flip-flop.
- The sense input from the cassette player goes low whenever play, rewind or fast-forward is pressed.
- This connects to most of the above components.
- The Q output enables the motor, and also connects to Bit 4 (input).
- Bit 3 outputs a string of pulses to the Clock pin, and therefore cannot be used to control
- the motor directly.
- For the moment, the user can use the UI to select play, stop, etc.
- If you load from the command-line or the software-picker, type in L <enter> immediately. */
-#if 0
-
- m_cassette->change_state(
- ((data & 0x08) && mz700_motor_on) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED,
- CASSETTE_MOTOR_DISABLED);
-
-#endif
-
- LOG(2,"mz700_pio_port_c_w",("%02X\n", data),machine());
-
- m_cassette->output((data & 0x02) ? +1.0 : -1.0);
-}
-
-
-/******************************************************************************
- * Sharp MZ800
- *
- *
- ******************************************************************************/
-
-//static uint8_t mz800_display_mode = 0;
-//static uint8_t mz800_port_e8 = 0;
-
-
-/***************************************************************************
- Z80 PIO
-***************************************************************************/
-
-WRITE_LINE_MEMBER(mz_state::mz800_z80pio_irq)
-{
- m_maincpu->set_input_line(0, state);
-}
-
-WRITE_LINE_MEMBER(mz_state::write_centronics_busy)
-{
- m_centronics_busy = state;
-}
-
-WRITE_LINE_MEMBER(mz_state::write_centronics_perror)
-{
- m_centronics_perror = state;
-}
-
-READ8_MEMBER(mz_state::mz800_z80pio_port_a_r)
-{
- uint8_t result = 0;
-
- result |= m_centronics_busy;
- result |= m_centronics_perror << 1;
- result |= m_screen->hblank() << 5;
-
- return result;
-}
-
-WRITE8_MEMBER(mz_state::mz800_z80pio_port_a_w)
-{
- m_centronics->write_init(BIT(data, 6));
- m_centronics->write_strobe(BIT(data, 7));
-}
-
-/* port CE */
-READ8_MEMBER(mz_state::mz800_crtc_r)
-{
- uint8_t data = 0x00;
- LOG(1,"mz800_crtc_r",("%02X\n",data),machine());
- return data;
-}
-
-
-/* port EA */
-READ8_MEMBER(mz_state::mz800_ramdisk_r)
-{
- uint8_t *mem = memregion("user1")->base();
- uint8_t data = mem[m_mz800_ramaddr];
- LOG(2,"mz800_ramdisk_r",("[%04X] -> %02X\n", m_mz800_ramaddr, data),machine());
- if (m_mz800_ramaddr++ == 0)
- LOG(1,"mz800_ramdisk_r",("address wrap 0000\n"),machine());
- return data;
-}
-
-/* port CC */
-WRITE8_MEMBER(mz_state::mz800_write_format_w)
-{
- LOG(1,"mz800_write_format_w",("%02X\n", data),machine());
-}
-
-/* port CD */
-WRITE8_MEMBER(mz_state::mz800_read_format_w)
-{
- LOG(1,"mz800_read_format_w",("%02X\n", data),machine());
-}
-
-/* port CE
- * bit 3 1: MZ700 mode 0: MZ800 mode
- * bit 2 1: 640 horizontal 0: 320 horizontal
- * bit 1 1: 4bpp/2bpp 0: 2bpp/1bpp
- * bit 0 ???
- */
-WRITE8_MEMBER(mz_state::mz800_display_mode_w)
-{
- m_mz700_mode = BIT(data, 3);
- m_hires_mode = BIT(data, 2);
- m_screennum = data & 0x03;
-
- /* change memory maps if we switched mode */
-// if (BIT(data, 3) != m_mz700_mode)
-// {
-// logerror("mz800_display_mode_w: switching mode to %s\n", (BIT(data, 3) ? "mz700" : "mz800"));
-// m_mz700_mode = BIT(data, 3);
-// mz700_bank_4_w(*m_maincpu->&space(AS_PROGRAM), 0, 0);
-// }
-}
-
-/* port CF */
-WRITE8_MEMBER(mz_state::mz800_scroll_border_w)
-{
- LOG(1,"mz800_scroll_border_w",("%02X\n", data),machine());
-}
-
-/* port EA */
-WRITE8_MEMBER(mz_state::mz800_ramdisk_w)
-{
- uint8_t *mem = memregion("user1")->base();
- LOG(2,"mz800_ramdisk_w",("[%04X] <- %02X\n", m_mz800_ramaddr, data),machine());
- mem[m_mz800_ramaddr] = data;
- if (m_mz800_ramaddr++ == 0)
- LOG(1,"mz800_ramdisk_w",("address wrap 0000\n"),machine());
-}
-
-/* port EB */
-WRITE8_MEMBER(mz_state::mz800_ramaddr_w)
-{
- m_mz800_ramaddr = (m_maincpu->state_int(Z80_BC) & 0xff00) | (data & 0xff);
- LOG(1,"mz800_ramaddr_w",("%04X\n", m_mz800_ramaddr),machine());
-}
-
-/* port F0 */
-WRITE8_MEMBER(mz_state::mz800_palette_w)
-{
- if (data & 0x40)
- {
- m_mz800_palette_bank = data & 3;
- LOG(1,"mz800_palette_w",("bank: %d\n", m_mz800_palette_bank),machine());
- }
- else
- {
- int idx = (data >> 4) & 3;
- int val = data & 15;
- LOG(1,"mz800_palette_w",("palette[%d] <- %d\n", idx, val),machine());
- m_mz800_palette[idx] = val;
- }
-}