diff options
author | arbee <rb6502@users.noreply.github.com> | 2016-05-23 17:35:25 -0400 |
---|---|---|
committer | arbee <rb6502@users.noreply.github.com> | 2016-05-23 17:35:25 -0400 |
commit | f3995bf563da7ece2845a5e09244dc278a170e7e (patch) | |
tree | fd5243562e21bdc2f02ea333607c24a7dba1f695 | |
parent | 9d7e38a8f2ed121ad30e195a2f46a3a5650b2478 (diff) |
unixpc: use bankdev for ROM switch, started to fill out skeleton [R. Belmont]
-rw-r--r-- | src/mame/drivers/unixpc.cpp | 164 |
1 files changed, 148 insertions, 16 deletions
diff --git a/src/mame/drivers/unixpc.cpp b/src/mame/drivers/unixpc.cpp index 4e8259840c7..63bbe281737 100644 --- a/src/mame/drivers/unixpc.cpp +++ b/src/mame/drivers/unixpc.cpp @@ -1,14 +1,17 @@ // license:GPL-2.0+ -// copyright-holders:Dirk Best +// copyright-holders:Dirk Best, R. Belmont /*************************************************************************** AT&T Unix PC series - Skeleton driver - - Note: The 68k core needs restartable instruction support for this - to have a chance to run. - + Skeleton driver by Dirk Best and R. Belmont + + DIVS instruction at 0x801112 (the second time) causes a divide-by-zero + exception the system isn't ready for due to word at 0x5EA6 being zero. + + Code might not get there if the attempted FDC boot succeeds; FDC hookup + probably needs help. 2797 isn't asserting DRQ? + ***************************************************************************/ @@ -16,6 +19,7 @@ #include "cpu/m68000/m68000.h" #include "machine/ram.h" #include "machine/wd_fdc.h" +#include "machine/bankdev.h" #include "unixpc.lh" @@ -32,28 +36,49 @@ public: m_ram(*this, RAM_TAG), m_wd2797(*this, "wd2797"), m_floppy(*this, "wd2797:0:525dd"), + m_ramrombank(*this, "ramrombank"), m_mapram(*this, "mapram"), - m_videoram(*this, "videoram"){ } + m_videoram(*this, "videoram") + { } required_device<cpu_device> m_maincpu; required_device<ram_device> m_ram; required_device<wd2797_t> m_wd2797; required_device<floppy_image_device> m_floppy; + required_device<address_map_bank_device> m_ramrombank; UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + virtual void machine_start() override; virtual void machine_reset() override; DECLARE_READ16_MEMBER( line_printer_r ); DECLARE_WRITE16_MEMBER( misc_control_w ); DECLARE_WRITE16_MEMBER( disk_control_w ); DECLARE_WRITE16_MEMBER( romlmap_w ); - + DECLARE_WRITE16_MEMBER( error_enable_w ); + DECLARE_WRITE16_MEMBER( parity_enable_w ); + DECLARE_WRITE16_MEMBER( bpplus_w ); + DECLARE_READ16_MEMBER( ram_mmu_r ); + DECLARE_WRITE16_MEMBER( ram_mmu_w ); + DECLARE_READ16_MEMBER( rtc_r ); + DECLARE_WRITE16_MEMBER( rtc_w ); + DECLARE_READ16_MEMBER( diskdma_size_r ); + DECLARE_WRITE16_MEMBER( diskdma_size_w ); + DECLARE_WRITE16_MEMBER( diskdma_ptr_w ); + DECLARE_WRITE_LINE_MEMBER( wd2797_intrq_w ); DECLARE_WRITE_LINE_MEMBER( wd2797_drq_w ); required_shared_ptr<UINT16> m_mapram; required_shared_ptr<UINT16> m_videoram; + +private: + UINT16 *m_ramptr; + UINT32 m_ramsize; + UINT16 m_diskdmasize; + UINT32 m_diskdmaptr; + bool m_fdc_intrq; }; @@ -64,27 +89,78 @@ public: WRITE16_MEMBER( unixpc_state::romlmap_w ) { if (BIT(data, 15)) - space.install_ram(0x000000, 0x3fffff, m_ram->pointer()); + { + m_ramrombank->set_bank(1); + } else - space.install_rom(0x000000, 0x3fffff, memregion("bootrom")->base()); + { + m_ramrombank->set_bank(0); + } } -void unixpc_state::machine_reset() +READ16_MEMBER( unixpc_state::ram_mmu_r ) { - address_space &program = m_maincpu->space(AS_PROGRAM); + // TODO: MMU translation + if (offset > m_ramsize) + { + return 0xffff; + } + return m_ramptr[offset]; +} + +WRITE16_MEMBER( unixpc_state::ram_mmu_w ) +{ + // TODO: MMU translation + if (offset < m_ramsize) + { + COMBINE_DATA(&m_ramptr[offset]); + } +} + +void unixpc_state::machine_start() +{ + m_ramptr = (UINT16 *)m_ram->pointer(); + m_ramsize = m_ram->size(); +} +void unixpc_state::machine_reset() +{ // force ROM into lower mem on reset - romlmap_w(program, 0, 0, 0xffff); + m_ramrombank->set_bank(0); // reset cpu so that it can pickup the new values m_maincpu->reset(); } +WRITE16_MEMBER( unixpc_state::error_enable_w ) +{ + logerror("error_enable_w: %04x\n", data & 0x8000); +} + +WRITE16_MEMBER( unixpc_state::parity_enable_w ) +{ + logerror("parity_enable_w: %04x\n", data & 0x8000); +} + +WRITE16_MEMBER( unixpc_state::bpplus_w ) +{ + logerror("bpplus_w: %04x\n", data & 0x8000); +} /*************************************************************************** MISC ***************************************************************************/ +READ16_MEMBER( unixpc_state::rtc_r ) +{ + return 0; +} + +WRITE16_MEMBER( unixpc_state::rtc_w ) +{ + logerror("rtc_w: %04x\n", data); +} + READ16_MEMBER( unixpc_state::line_printer_r ) { UINT16 data = 0; @@ -92,9 +168,9 @@ READ16_MEMBER( unixpc_state::line_printer_r ) data |= 1; // no dial tone detected data |= 1 << 1; // no parity error data |= 0 << 2; // hdc intrq - data |= m_wd2797->intrq_r() << 3; + data |= m_fdc_intrq ? 1<<3 : 0<<3; - logerror("line_printer_r: %04x\n", data); + //logerror("line_printer_r: %04x\n", data); return data; } @@ -103,12 +179,48 @@ WRITE16_MEMBER( unixpc_state::misc_control_w ) { logerror("misc_control_w: %04x\n", data); + // bit 15 = VBL ack (must go high-low-high to ack) + // bit 14 = 0 for disk DMA write, 1 for disk DMA read + // bit 13 = Centronics strobe + // bit 12 = 0 = modem baud rate from UART clock inputs, 1 = baud from programmable timer + output().set_value("led_0", !BIT(data, 8)); output().set_value("led_1", !BIT(data, 9)); output().set_value("led_2", !BIT(data, 10)); output().set_value("led_3", !BIT(data, 11)); } +/*************************************************************************** + DMA +***************************************************************************/ + +READ16_MEMBER( unixpc_state::diskdma_size_r ) +{ + return m_diskdmasize; +} + +WRITE16_MEMBER( unixpc_state::diskdma_size_w ) +{ + COMBINE_DATA( &m_diskdmasize ); + logerror("%x to disk DMA size\n", data); +} + +WRITE16_MEMBER( unixpc_state::diskdma_ptr_w ) +{ + if (offset >= 0x2000) + { + // set top 4 bytes + m_diskdmaptr &= 0xff; + m_diskdmaptr |= (offset << 8); + } + else + { + m_diskdmaptr &= 0xffff00; + m_diskdmaptr |= (offset & 0xff); + } + + logerror("diskdma_ptr_w: wrote at %x, ptr now %x\n", offset<<1, m_diskdmaptr); +} /*************************************************************************** FLOPPY @@ -130,6 +242,7 @@ WRITE16_MEMBER( unixpc_state::disk_control_w ) WRITE_LINE_MEMBER( unixpc_state::wd2797_intrq_w ) { logerror("wd2797_intrq_w: %d\n", state); + m_fdc_intrq = state; } WRITE_LINE_MEMBER( unixpc_state::wd2797_drq_w ) @@ -158,17 +271,29 @@ UINT32 unixpc_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, ***************************************************************************/ static ADDRESS_MAP_START( unixpc_mem, AS_PROGRAM, 16, unixpc_state ) - AM_RANGE(0x000000, 0x3fffff) AM_RAMBANK("bank1") + AM_RANGE(0x000000, 0x3fffff) AM_DEVICE("ramrombank", address_map_bank_device, amap16) AM_RANGE(0x400000, 0x4007ff) AM_RAM AM_SHARE("mapram") AM_RANGE(0x420000, 0x427fff) AM_RAM AM_SHARE("videoram") + AM_RANGE(0x460000, 0x460001) AM_READWRITE(diskdma_size_r, diskdma_size_w) AM_RANGE(0x470000, 0x470001) AM_READ(line_printer_r) + AM_RANGE(0x480000, 0x480001) AM_WRITE(rtc_w) AM_RANGE(0x4a0000, 0x4a0001) AM_WRITE(misc_control_w) + AM_RANGE(0x4d0000, 0x4d7fff) AM_WRITE(diskdma_ptr_w) AM_RANGE(0x4e0000, 0x4e0001) AM_WRITE(disk_control_w) AM_RANGE(0x800000, 0xbfffff) AM_MIRROR(0x7fc000) AM_ROM AM_REGION("bootrom", 0) AM_RANGE(0xe10000, 0xe10007) AM_DEVREADWRITE8("wd2797", wd_fdc_t, read, write, 0x00ff) + AM_RANGE(0xe30000, 0xe30001) AM_READ(rtc_r) + AM_RANGE(0xe40000, 0xe40001) AM_WRITE(error_enable_w) + AM_RANGE(0xe41000, 0xe41001) AM_WRITE(parity_enable_w) + AM_RANGE(0xe42000, 0xe42001) AM_WRITE(bpplus_w) AM_RANGE(0xe43000, 0xe43001) AM_WRITE(romlmap_w) + // e70000 / e70002 = keyboard 6850 status/control and Rx data / Tx data ADDRESS_MAP_END +static ADDRESS_MAP_START( ramrombank_map, AS_PROGRAM, 16, unixpc_state ) + AM_RANGE(0x000000, 0x3fffff) AM_ROM AM_REGION("bootrom", 0) + AM_RANGE(0x400000, 0x7fffff) AM_READWRITE(ram_mmu_r, ram_mmu_w) +ADDRESS_MAP_END /*************************************************************************** INPUT PORTS @@ -207,6 +332,13 @@ static MACHINE_CONFIG_START( unixpc, unixpc_state ) MCFG_RAM_DEFAULT_SIZE("1M") MCFG_RAM_EXTRA_OPTIONS("2M") + // RAM/ROM bank + MCFG_DEVICE_ADD("ramrombank", ADDRESS_MAP_BANK, 0) + MCFG_DEVICE_PROGRAM_MAP(ramrombank_map) + MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG) + MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16) + MCFG_ADDRESS_MAP_BANK_STRIDE(0x400000) + // floppy MCFG_DEVICE_ADD("wd2797", WD2797, 1000000) MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(unixpc_state, wd2797_intrq_w)) |